@smoothdeploy/playwright 1.57.1 → 1.58.1-beta-1770383926000
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @smoothdeploy/playwright might be problematic. Click here for more details.
- package/ThirdPartyNotices.txt +1188 -65
- package/lib/agents/agentParser.js +89 -0
- package/lib/agents/generateAgents.js +27 -74
- package/lib/agents/generateAgents.js.map +7 -0
- package/lib/agents/playwright-test-planner.agent.md +1 -0
- package/lib/common/config.js +6 -4
- package/lib/common/config.js.map +7 -0
- package/lib/common/configLoader.js.map +7 -0
- package/lib/common/esmLoaderHost.js +2 -0
- package/lib/common/esmLoaderHost.js.map +7 -0
- package/lib/common/expectBundle.js +2 -17
- package/lib/common/expectBundle.js.map +7 -0
- package/lib/common/expectBundleImpl.js +132 -132
- package/lib/common/expectBundleImpl.js.map +7 -0
- package/lib/common/fixtures.js.map +7 -0
- package/lib/common/globals.js.map +7 -0
- package/lib/common/ipc.js.map +7 -0
- package/lib/common/poolBuilder.js.map +7 -0
- package/lib/common/process.js +28 -0
- package/lib/common/process.js.map +7 -0
- package/lib/common/suiteUtils.js.map +7 -0
- package/lib/common/test.js.map +7 -0
- package/lib/common/testLoader.js.map +7 -0
- package/lib/common/testType.js.map +7 -0
- package/lib/common/validators.js +10 -10
- package/lib/common/validators.js.map +7 -0
- package/lib/fsWatcher.js.map +7 -0
- package/lib/index.js +205 -12
- package/lib/index.js.map +7 -0
- package/lib/internalsForTest.js.map +7 -0
- package/lib/isomorphic/events.js.map +7 -0
- package/lib/isomorphic/folders.js.map +7 -0
- package/lib/isomorphic/stringInternPool.js.map +7 -0
- package/lib/isomorphic/teleReceiver.js +15 -2
- package/lib/isomorphic/teleReceiver.js.map +7 -0
- package/lib/isomorphic/teleSuiteUpdater.js +24 -4
- package/lib/isomorphic/teleSuiteUpdater.js.map +7 -0
- package/lib/isomorphic/testServerConnection.js.map +7 -0
- package/lib/isomorphic/testServerInterface.js.map +7 -0
- package/lib/isomorphic/testTree.js +13 -18
- package/lib/isomorphic/testTree.js.map +7 -0
- package/lib/isomorphic/types.d.js.map +7 -0
- package/lib/loader/loaderMain.js.map +7 -0
- package/lib/matchers/expect.js +2 -15
- package/lib/matchers/expect.js.map +7 -0
- package/lib/matchers/matcherHint.js +1 -44
- package/lib/matchers/matcherHint.js.map +7 -0
- package/lib/matchers/matchers.js +3 -2
- package/lib/matchers/matchers.js.map +7 -0
- package/lib/matchers/toBeTruthy.js +5 -3
- package/lib/matchers/toBeTruthy.js.map +7 -0
- package/lib/matchers/toEqual.js +4 -3
- package/lib/matchers/toEqual.js.map +7 -0
- package/lib/matchers/toHaveURL.js +5 -6
- package/lib/matchers/toHaveURL.js.map +7 -0
- package/lib/matchers/toMatchAriaSnapshot.js +5 -5
- package/lib/matchers/toMatchAriaSnapshot.js.map +7 -0
- package/lib/matchers/toMatchSnapshot.js +9 -8
- package/lib/matchers/toMatchSnapshot.js.map +7 -0
- package/lib/matchers/toMatchText.js +9 -9
- package/lib/matchers/toMatchText.js.map +7 -0
- package/lib/mcp/browser/actions.d.js.map +7 -0
- package/lib/mcp/browser/browserContextFactory.js +62 -29
- package/lib/mcp/browser/browserContextFactory.js.map +7 -0
- package/lib/mcp/browser/browserServerBackend.js +17 -9
- package/lib/mcp/browser/browserServerBackend.js.map +7 -0
- package/lib/mcp/browser/codegen.js.map +7 -0
- package/lib/mcp/browser/config.js +65 -12
- package/lib/mcp/browser/config.js.map +7 -0
- package/lib/mcp/browser/context.js +71 -94
- package/lib/mcp/browser/context.js.map +7 -0
- package/lib/mcp/browser/response.js +172 -131
- package/lib/mcp/browser/response.js.map +7 -0
- package/lib/mcp/browser/sessionLog.js +19 -104
- package/lib/mcp/browser/sessionLog.js.map +7 -0
- package/lib/mcp/browser/tab.js +92 -41
- package/lib/mcp/browser/tab.js.map +7 -0
- package/lib/mcp/browser/tools/common.js +8 -6
- package/lib/mcp/browser/tools/common.js.map +7 -0
- package/lib/mcp/browser/tools/console.js +7 -5
- package/lib/mcp/browser/tools/console.js.map +7 -0
- package/lib/mcp/browser/tools/dialogs.js +4 -4
- package/lib/mcp/browser/tools/dialogs.js.map +7 -0
- package/lib/mcp/browser/tools/evaluate.js +11 -19
- package/lib/mcp/browser/tools/evaluate.js.map +7 -0
- package/lib/mcp/browser/tools/files.js +3 -3
- package/lib/mcp/browser/tools/files.js.map +7 -0
- package/lib/mcp/browser/tools/form.js +9 -19
- package/lib/mcp/browser/tools/form.js.map +7 -0
- package/lib/mcp/browser/tools/install.js +6 -3
- package/lib/mcp/browser/tools/install.js.map +7 -0
- package/lib/mcp/browser/tools/keyboard.js +34 -11
- package/lib/mcp/browser/tools/keyboard.js.map +7 -0
- package/lib/mcp/browser/tools/mouse.js +11 -11
- package/lib/mcp/browser/tools/mouse.js.map +7 -0
- package/lib/mcp/browser/tools/navigate.js +14 -5
- package/lib/mcp/browser/tools/navigate.js.map +7 -0
- package/lib/mcp/browser/tools/network.js +20 -11
- package/lib/mcp/browser/tools/network.js.map +7 -0
- package/lib/mcp/browser/tools/open.js +57 -0
- package/lib/mcp/browser/tools/pdf.js +9 -19
- package/lib/mcp/browser/tools/pdf.js.map +7 -0
- package/lib/mcp/browser/tools/runCode.js +11 -8
- package/lib/mcp/browser/tools/runCode.js.map +7 -0
- package/lib/mcp/browser/tools/screenshot.js +16 -29
- package/lib/mcp/browser/tools/screenshot.js.map +7 -0
- package/lib/mcp/browser/tools/snapshot.js +21 -29
- package/lib/mcp/browser/tools/snapshot.js.map +7 -0
- package/lib/mcp/browser/tools/tabs.js +12 -12
- package/lib/mcp/browser/tools/tabs.js.map +7 -0
- package/lib/mcp/browser/tools/tool.js +2 -4
- package/lib/mcp/browser/tools/tool.js.map +7 -0
- package/lib/mcp/browser/tools/tracing.js +6 -6
- package/lib/mcp/browser/tools/tracing.js.map +7 -0
- package/lib/mcp/browser/tools/utils.js +49 -44
- package/lib/mcp/browser/tools/utils.js.map +7 -0
- package/lib/mcp/browser/tools/verify.js +24 -34
- package/lib/mcp/browser/tools/verify.js.map +7 -0
- package/lib/mcp/browser/tools/wait.js +6 -6
- package/lib/mcp/browser/tools/wait.js.map +7 -0
- package/lib/mcp/browser/tools.js +3 -1
- package/lib/mcp/browser/tools.js.map +7 -0
- package/lib/mcp/browser/watchdog.js.map +7 -0
- package/lib/mcp/config.d.js.map +7 -0
- package/lib/mcp/extension/cdpRelay.js +1 -1
- package/lib/mcp/extension/cdpRelay.js.map +7 -0
- package/lib/mcp/extension/extensionContextFactory.js +6 -5
- package/lib/mcp/extension/extensionContextFactory.js.map +7 -0
- package/lib/mcp/extension/protocol.js.map +7 -0
- package/lib/mcp/index.js.map +7 -0
- package/lib/mcp/log.js.map +7 -0
- package/lib/mcp/program.js +15 -20
- package/lib/mcp/program.js.map +7 -0
- package/lib/mcp/sdk/bundle.js.map +7 -0
- package/lib/mcp/sdk/exports.js +0 -2
- package/lib/mcp/sdk/exports.js.map +7 -0
- package/lib/mcp/sdk/http.js +20 -55
- package/lib/mcp/sdk/http.js.map +7 -0
- package/lib/mcp/sdk/inProcessTransport.js.map +7 -0
- package/lib/mcp/sdk/proxyBackend.js.map +7 -0
- package/lib/mcp/sdk/server.js +29 -4
- package/lib/mcp/sdk/server.js.map +7 -0
- package/lib/mcp/sdk/tool.js +2 -2
- package/lib/mcp/sdk/tool.js.map +7 -0
- package/lib/mcp/terminal/cli.js +296 -0
- package/lib/mcp/terminal/command.js +56 -0
- package/lib/mcp/terminal/commands.js +333 -0
- package/lib/mcp/terminal/daemon.js +129 -0
- package/lib/mcp/terminal/help.json +32 -0
- package/lib/mcp/terminal/helpGenerator.js +88 -0
- package/lib/mcp/terminal/socketConnection.js +80 -0
- package/lib/mcp/test/browserBackend.js +3 -13
- package/lib/mcp/test/browserBackend.js.map +7 -0
- package/lib/mcp/test/generatorTools.js +9 -9
- package/lib/mcp/test/generatorTools.js.map +7 -0
- package/lib/mcp/test/plannerTools.js +23 -22
- package/lib/mcp/test/plannerTools.js.map +7 -0
- package/lib/mcp/test/seed.js.map +7 -0
- package/lib/mcp/test/streams.js.map +7 -0
- package/lib/mcp/test/testBackend.js +6 -6
- package/lib/mcp/test/testBackend.js.map +7 -0
- package/lib/mcp/test/testContext.js +9 -3
- package/lib/mcp/test/testContext.js.map +7 -0
- package/lib/mcp/test/testTool.js.map +7 -0
- package/lib/mcp/test/testTools.js +12 -10
- package/lib/mcp/test/testTools.js.map +7 -0
- package/lib/mcpBundleImpl.js.map +7 -0
- package/lib/plugins/gitCommitInfoPlugin.js.map +7 -0
- package/lib/plugins/index.js.map +7 -0
- package/lib/plugins/webServerPlugin.js.map +7 -0
- package/lib/program.js +18 -4
- package/lib/program.js.map +7 -0
- package/lib/reporters/base.js +29 -4
- package/lib/reporters/base.js.map +7 -0
- package/lib/reporters/blob.js +3 -0
- package/lib/reporters/blob.js.map +7 -0
- package/lib/reporters/dot.js +17 -0
- package/lib/reporters/dot.js.map +7 -0
- package/lib/reporters/empty.js.map +7 -0
- package/lib/reporters/github.js.map +7 -0
- package/lib/reporters/html.js +13 -3
- package/lib/reporters/html.js.map +7 -0
- package/lib/reporters/internalReporter.js +6 -0
- package/lib/reporters/internalReporter.js.map +7 -0
- package/lib/reporters/json.js.map +7 -0
- package/lib/reporters/junit.js.map +7 -0
- package/lib/reporters/line.js +18 -0
- package/lib/reporters/line.js.map +7 -0
- package/lib/reporters/list.js +22 -0
- package/lib/reporters/list.js.map +7 -0
- package/lib/reporters/listModeReporter.js.map +7 -0
- package/lib/reporters/markdown.js.map +7 -0
- package/lib/reporters/merge.js +25 -8
- package/lib/reporters/merge.js.map +7 -0
- package/lib/reporters/multiplexer.js +8 -0
- package/lib/reporters/multiplexer.js.map +7 -0
- package/lib/reporters/reporterV2.js.map +7 -0
- package/lib/reporters/smoothdeploy.js +191 -0
- package/lib/reporters/teleEmitter.js +22 -4
- package/lib/reporters/teleEmitter.js.map +7 -0
- package/lib/reporters/versions/blobV1.js.map +7 -0
- package/lib/runner/dispatcher.js +20 -4
- package/lib/runner/dispatcher.js.map +7 -0
- package/lib/runner/failureTracker.js.map +7 -0
- package/lib/runner/lastRun.js.map +7 -0
- package/lib/runner/loadUtils.js +2 -2
- package/lib/runner/loadUtils.js.map +7 -0
- package/lib/runner/loaderHost.js.map +7 -0
- package/lib/runner/processHost.js +19 -0
- package/lib/runner/processHost.js.map +7 -0
- package/lib/runner/projectUtils.js +1 -1
- package/lib/runner/projectUtils.js.map +7 -0
- package/lib/runner/rebase.js.map +7 -0
- package/lib/runner/reporters.js +3 -1
- package/lib/runner/reporters.js.map +7 -0
- package/lib/runner/sigIntWatcher.js.map +7 -0
- package/lib/runner/storage.js +91 -0
- package/lib/runner/taskRunner.js.map +7 -0
- package/lib/runner/tasks.js.map +7 -0
- package/lib/runner/testGroups.js +14 -6
- package/lib/runner/testGroups.js.map +7 -0
- package/lib/runner/testRunner.js +13 -4
- package/lib/runner/testRunner.js.map +7 -0
- package/lib/runner/testServer.js +2 -2
- package/lib/runner/testServer.js.map +7 -0
- package/lib/runner/uiModeReporter.js.map +7 -0
- package/lib/runner/vcs.js.map +7 -0
- package/lib/runner/watchMode.js +2 -1
- package/lib/runner/watchMode.js.map +7 -0
- package/lib/runner/workerHost.js +6 -0
- package/lib/runner/workerHost.js.map +7 -0
- package/lib/third_party/pirates.js.map +7 -0
- package/lib/third_party/tsconfig-loader.js.map +7 -0
- package/lib/transform/babelBundle.js +3 -0
- package/lib/transform/babelBundle.js.map +7 -0
- package/lib/transform/babelBundleImpl.js +134 -134
- package/lib/transform/babelBundleImpl.js.map +7 -0
- package/lib/transform/compilationCache.js +2 -0
- package/lib/transform/compilationCache.js.map +7 -0
- package/lib/transform/esmLoader.js +10 -11
- package/lib/transform/esmLoader.js.map +7 -0
- package/lib/transform/md.js +221 -0
- package/lib/transform/portTransport.js.map +7 -0
- package/lib/transform/transform.js +18 -8
- package/lib/transform/transform.js.map +7 -0
- package/lib/util.js +3 -6
- package/lib/util.js.map +7 -0
- package/lib/utilsBundle.js +7 -0
- package/lib/utilsBundle.js.map +7 -0
- package/lib/utilsBundleImpl.js +51 -48
- package/lib/utilsBundleImpl.js.map +7 -0
- package/lib/worker/fixtureRunner.js +6 -2
- package/lib/worker/fixtureRunner.js.map +7 -0
- package/lib/worker/testInfo.js +39 -19
- package/lib/worker/testInfo.js.map +7 -0
- package/lib/worker/testTracing.js.map +7 -0
- package/lib/worker/timeoutManager.js.map +7 -0
- package/lib/worker/util.js.map +7 -0
- package/lib/worker/workerMain.js +17 -16
- package/lib/worker/workerMain.js.map +7 -0
- package/package.json +2 -2
- package/test.mjs +1 -0
- package/types/test.d.ts +26 -6
- package/types/testReporter.d.ts +1 -0
package/lib/runner/testRunner.js
CHANGED
|
@@ -63,6 +63,7 @@ class TestRunner extends import_events.default {
|
|
|
63
63
|
this._queue = Promise.resolve();
|
|
64
64
|
this._watchTestDirs = false;
|
|
65
65
|
this._populateDependenciesOnList = false;
|
|
66
|
+
this._startingEnv = {};
|
|
66
67
|
this.configLocation = configLocation;
|
|
67
68
|
this._configCLIOverrides = configCLIOverrides;
|
|
68
69
|
this._watcher = new import_fsWatcher.Watcher((events) => {
|
|
@@ -75,6 +76,7 @@ class TestRunner extends import_events.default {
|
|
|
75
76
|
(0, import_utils.setPlaywrightTestProcessEnv)();
|
|
76
77
|
this._watchTestDirs = !!params.watchTestDirs;
|
|
77
78
|
this._populateDependenciesOnList = !!params.populateDependenciesOnList;
|
|
79
|
+
this._startingEnv = { ...process.env };
|
|
78
80
|
}
|
|
79
81
|
resizeTerminal(params) {
|
|
80
82
|
process.stdout.columns = params.cols;
|
|
@@ -107,15 +109,20 @@ class TestRunner extends import_events.default {
|
|
|
107
109
|
const reporter = new import_internalReporter.InternalReporter(userReporters);
|
|
108
110
|
const config = await this._loadConfigOrReportError(reporter, this._configCLIOverrides);
|
|
109
111
|
if (!config)
|
|
110
|
-
return { status: "failed" };
|
|
112
|
+
return { status: "failed", env: [] };
|
|
111
113
|
const { status, cleanup } = await (0, import_tasks.runTasksDeferCleanup)(new import_tasks.TestRun(config, reporter), [
|
|
112
114
|
...(0, import_tasks.createGlobalSetupTasks)(config)
|
|
113
115
|
]);
|
|
116
|
+
const env = [];
|
|
117
|
+
for (const key of /* @__PURE__ */ new Set([...Object.keys(process.env), ...Object.keys(this._startingEnv)])) {
|
|
118
|
+
if (this._startingEnv[key] !== process.env[key])
|
|
119
|
+
env.push([key, process.env[key] ?? null]);
|
|
120
|
+
}
|
|
114
121
|
if (status !== "passed")
|
|
115
122
|
await cleanup();
|
|
116
123
|
else
|
|
117
124
|
this._globalSetup = { cleanup };
|
|
118
|
-
return { status };
|
|
125
|
+
return { status, env };
|
|
119
126
|
}
|
|
120
127
|
async runGlobalTeardown() {
|
|
121
128
|
const globalSetup = this._globalSetup;
|
|
@@ -251,6 +258,7 @@ class TestRunner extends import_events.default {
|
|
|
251
258
|
},
|
|
252
259
|
...params.updateSnapshots ? { updateSnapshots: params.updateSnapshots } : {},
|
|
253
260
|
...params.updateSourceMethod ? { updateSourceMethod: params.updateSourceMethod } : {},
|
|
261
|
+
...params.runAgents ? { runAgents: params.runAgents } : {},
|
|
254
262
|
...params.workers ? { workers: params.workers } : {}
|
|
255
263
|
};
|
|
256
264
|
const config = await this._loadConfigOrReportError(new import_internalReporter.InternalReporter([userReporter]), overrides);
|
|
@@ -258,7 +266,7 @@ class TestRunner extends import_events.default {
|
|
|
258
266
|
return { status: "failed" };
|
|
259
267
|
config.cliListOnly = false;
|
|
260
268
|
config.cliPassWithNoTests = true;
|
|
261
|
-
config.cliArgs = params.locations
|
|
269
|
+
config.cliArgs = params.locations;
|
|
262
270
|
config.cliGrep = params.grep;
|
|
263
271
|
config.cliGrepInvert = params.grepInvert;
|
|
264
272
|
config.cliProjectFilter = params.projects?.length ? params.projects : void 0;
|
|
@@ -376,7 +384,8 @@ async function runAllTestsWithConfig(config) {
|
|
|
376
384
|
(0, import_tasks.createLoadTask)("in-process", { filterOnly: true, failOnLoadErrors: true }),
|
|
377
385
|
...(0, import_tasks.createRunTestsTasks)(config)
|
|
378
386
|
];
|
|
379
|
-
const
|
|
387
|
+
const testRun = new import_tasks.TestRun(config, reporter, { pauseAtEnd: config.configCLIOverrides.pause, pauseOnError: config.configCLIOverrides.pause });
|
|
388
|
+
const status = await (0, import_tasks.runTasks)(testRun, tasks, config.config.globalTimeout);
|
|
380
389
|
await new Promise((resolve) => process.stdout.write("", () => resolve()));
|
|
381
390
|
await new Promise((resolve) => process.stderr.write("", () => resolve()));
|
|
382
391
|
return status;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner/testRunner.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { registry } from 'playwright-core/lib/server';\nimport { ManualPromise, gracefullyProcessExitDoNotHang, setPlaywrightTestProcessEnv } from 'playwright-core/lib/utils';\n\nimport { loadConfig } from '../common/configLoader';\nimport { Watcher } from '../fsWatcher';\nimport { baseFullConfig } from '../isomorphic/teleReceiver';\nimport { addGitCommitInfoPlugin } from '../plugins/gitCommitInfoPlugin';\nimport { webServerPluginsForConfig } from '../plugins/webServerPlugin';\nimport { internalScreen } from '../reporters/base';\nimport { InternalReporter } from '../reporters/internalReporter';\nimport { affectedTestFiles, collectAffectedTestFiles, dependenciesForTestFile } from '../transform/compilationCache';\nimport { serializeError } from '../util';\nimport { createErrorCollectingReporter, createReporters } from './reporters';\nimport { TestRun, createApplyRebaselinesTask, createClearCacheTask, createGlobalSetupTasks, createListFilesTask, createLoadTask, createPluginSetupTasks, createReportBeginTask, createRunTestsTasks, createStartDevServerTask, runTasks, runTasksDeferCleanup } from './tasks';\nimport { LastRunReporter } from './lastRun';\n\nimport type * as reporterTypes from '../../types/testReporter';\nimport type { ConfigLocation, FullConfigInternal } from '../common/config';\nimport type { ConfigCLIOverrides } from '../common/ipc';\nimport type { TestRunnerPluginRegistration } from '../plugins';\nimport type { AnyReporter } from '../reporters/reporterV2';\nimport type { TestPausedParams } from './failureTracker';\n\nexport const TestRunnerEvent = {\n TestFilesChanged: 'testFilesChanged',\n TestPaused: 'testPaused',\n} as const;\n\nexport type TestRunnerEventMap = {\n [TestRunnerEvent.TestFilesChanged]: [testFiles: string[]];\n [TestRunnerEvent.TestPaused]: [params: TestPausedParams];\n};\n\nexport type ListTestsParams = {\n projects?: string[];\n locations?: string[];\n grep?: string;\n grepInvert?: string;\n};\n\nexport type RunTestsParams = {\n timeout?: number;\n locations?: string[];\n grep?: string;\n grepInvert?: string;\n testIds?: string[];\n headed?: boolean;\n workers?: number | string;\n updateSnapshots?: 'all' | 'changed' | 'missing' | 'none';\n updateSourceMethod?: 'overwrite' | 'patch' | '3way';\n reporters?: string[],\n trace?: 'on' | 'off';\n video?: 'on' | 'off';\n projects?: string[];\n reuseContext?: boolean;\n connectWsEndpoint?: string;\n actionTimeout?: number;\n pauseOnError?: boolean;\n pauseAtEnd?: boolean;\n doNotRunDepsOutsideProjectFilter?: boolean;\n disableConfigReporters?: boolean;\n failOnLoadErrors?: boolean;\n};\n\nexport type FullResultStatus = reporterTypes.FullResult['status'];\n\nexport class TestRunner extends EventEmitter<TestRunnerEventMap> {\n readonly configLocation: ConfigLocation;\n private _configCLIOverrides: ConfigCLIOverrides;\n\n private _watcher: Watcher;\n private _watchedProjectDirs = new Set<string>();\n private _ignoredProjectOutputs = new Set<string>();\n private _watchedTestDependencies = new Set<string>();\n\n private _testRun: { run: Promise<reporterTypes.FullResult['status']>, stop: ManualPromise<void> } | undefined;\n private _queue = Promise.resolve();\n private _globalSetup: { cleanup: () => Promise<any> } | undefined;\n private _devServer: { cleanup: () => Promise<any> } | undefined;\n private _plugins: TestRunnerPluginRegistration[] | undefined;\n private _watchTestDirs = false;\n private _populateDependenciesOnList = false;\n\n constructor(configLocation: ConfigLocation, configCLIOverrides: ConfigCLIOverrides) {\n super();\n this.configLocation = configLocation;\n this._configCLIOverrides = configCLIOverrides;\n this._watcher = new Watcher(events => {\n const collector = new Set<string>();\n events.forEach(f => collectAffectedTestFiles(f.file, collector));\n this.emit(TestRunnerEvent.TestFilesChanged, [...collector]);\n });\n }\n\n async initialize(params: {\n watchTestDirs?: boolean;\n populateDependenciesOnList?: boolean;\n }) {\n setPlaywrightTestProcessEnv();\n this._watchTestDirs = !!params.watchTestDirs;\n this._populateDependenciesOnList = !!params.populateDependenciesOnList;\n }\n\n resizeTerminal(params: { cols: number, rows: number }) {\n /* eslint-disable no-restricted-properties */\n process.stdout.columns = params.cols;\n process.stdout.rows = params.rows;\n process.stderr.columns = params.cols;\n process.stderr.rows = params.rows;\n /* eslint-enable no-restricted-properties */\n }\n\n hasSomeBrowsers(): boolean {\n for (const browserName of ['chromium', 'webkit', 'firefox']) {\n try {\n registry.findExecutable(browserName)!.executablePathOrDie('javascript');\n return true;\n } catch {\n }\n }\n return false;\n }\n\n async installBrowsers() {\n const executables = registry.defaultExecutables();\n await registry.install(executables);\n }\n\n async loadConfig() {\n const { config, error } = await this._loadConfig(this._configCLIOverrides);\n if (config)\n return config;\n throw new Error('Failed to load config: ' + (error ? error.message : 'Unknown error'));\n }\n\n async runGlobalSetup(userReporters: AnyReporter[]): Promise<{ status: FullResultStatus }> {\n await this.runGlobalTeardown();\n\n const reporter = new InternalReporter(userReporters);\n const config = await this._loadConfigOrReportError(reporter, this._configCLIOverrides);\n if (!config)\n return { status: 'failed' };\n\n const { status, cleanup } = await runTasksDeferCleanup(new TestRun(config, reporter), [\n ...createGlobalSetupTasks(config),\n ]);\n if (status !== 'passed')\n await cleanup();\n else\n this._globalSetup = { cleanup };\n return { status };\n }\n\n async runGlobalTeardown() {\n const globalSetup = this._globalSetup;\n const status = await globalSetup?.cleanup();\n this._globalSetup = undefined;\n return { status };\n }\n\n async startDevServer(userReporter: AnyReporter, mode: 'in-process' | 'out-of-process'): Promise<{ status: FullResultStatus }> {\n await this.stopDevServer();\n\n const reporter = new InternalReporter([userReporter]);\n const config = await this._loadConfigOrReportError(reporter);\n if (!config)\n return { status: 'failed' };\n\n const { status, cleanup } = await runTasksDeferCleanup(new TestRun(config, reporter), [\n ...createPluginSetupTasks(config),\n createLoadTask(mode, { failOnLoadErrors: true, filterOnly: false }),\n createStartDevServerTask(),\n ]);\n if (status !== 'passed')\n await cleanup();\n else\n this._devServer = { cleanup };\n return { status };\n }\n\n async stopDevServer(): Promise<{ status: FullResultStatus }> {\n const devServer = this._devServer;\n const status = await devServer?.cleanup();\n this._devServer = undefined;\n return { status };\n }\n\n async clearCache(userReporter?: AnyReporter): Promise<{ status: FullResultStatus }> {\n const reporter = new InternalReporter(userReporter ? [userReporter] : []);\n const config = await this._loadConfigOrReportError(reporter);\n if (!config)\n return { status: 'failed' };\n const status = await runTasks(new TestRun(config, reporter), [\n ...createPluginSetupTasks(config),\n createClearCacheTask(config),\n ]);\n return { status };\n }\n\n async listFiles(userReporter: AnyReporter, projects?: string[]): Promise<{ status: FullResultStatus }> {\n const reporter = new InternalReporter([userReporter]);\n const config = await this._loadConfigOrReportError(reporter);\n if (!config)\n return { status: 'failed' };\n\n config.cliProjectFilter = projects?.length ? projects : undefined;\n const status = await runTasks(new TestRun(config, reporter), [\n createListFilesTask(),\n createReportBeginTask(),\n ]);\n return { status };\n }\n\n async listTests(userReporter: AnyReporter, params: ListTestsParams): Promise<{ status: FullResultStatus }> {\n let result: { status: FullResultStatus } | undefined;\n this._queue = this._queue.then(async () => {\n const { config, status } = await this._innerListTests(userReporter, params);\n if (config)\n await this._updateWatchedDirs(config);\n result = { status };\n }).catch(printInternalError);\n await this._queue;\n return result!;\n }\n\n private async _innerListTests(userReporter: AnyReporter, params: ListTestsParams): Promise<{\n status: reporterTypes.FullResult['status'],\n config?: FullConfigInternal,\n }> {\n const overrides: ConfigCLIOverrides = {\n ...this._configCLIOverrides,\n repeatEach: 1,\n retries: 0,\n };\n const reporter = new InternalReporter([userReporter]);\n const config = await this._loadConfigOrReportError(reporter, overrides);\n if (!config)\n return { status: 'failed' };\n\n config.cliArgs = params.locations || [];\n config.cliGrep = params.grep;\n config.cliGrepInvert = params.grepInvert;\n config.cliProjectFilter = params.projects?.length ? params.projects : undefined;\n config.cliListOnly = true;\n\n const status = await runTasks(new TestRun(config, reporter), [\n createLoadTask('out-of-process', { failOnLoadErrors: false, filterOnly: false, populateDependencies: this._populateDependenciesOnList }),\n createReportBeginTask(),\n ]);\n return { config, status };\n }\n\n private async _updateWatchedDirs(config: FullConfigInternal) {\n this._watchedProjectDirs = new Set();\n this._ignoredProjectOutputs = new Set();\n for (const p of config.projects) {\n this._watchedProjectDirs.add(p.project.testDir);\n this._ignoredProjectOutputs.add(p.project.outputDir);\n }\n\n const result = await resolveCtDirs(config);\n if (result) {\n this._watchedProjectDirs.add(result.templateDir);\n this._ignoredProjectOutputs.add(result.outDir);\n }\n\n if (this._watchTestDirs)\n await this._updateWatcher(false);\n }\n\n private async _updateWatcher(reportPending: boolean) {\n await this._watcher.update([...this._watchedProjectDirs, ...this._watchedTestDependencies], [...this._ignoredProjectOutputs], reportPending);\n }\n\n async runTests(userReporter: AnyReporter, params: RunTestsParams): Promise<{ status: FullResultStatus }> {\n let result: { status: FullResultStatus } = { status: 'passed' };\n this._queue = this._queue.then(async () => {\n result = await this._innerRunTests(userReporter, params).catch(e => { printInternalError(e); return { status: 'failed' }; });\n });\n await this._queue;\n return result;\n }\n\n private async _innerRunTests(userReporter: AnyReporter, params: RunTestsParams): Promise<{ status: FullResultStatus }> {\n await this.stopTests();\n const overrides: ConfigCLIOverrides = {\n ...this._configCLIOverrides,\n repeatEach: 1,\n retries: 0,\n timeout: params.timeout,\n preserveOutputDir: true,\n reporter: params.reporters ? params.reporters.map(r => [r]) : undefined,\n use: {\n ...this._configCLIOverrides.use,\n ...(params.trace === 'on' ? { trace: { mode: 'on', sources: false, _live: true } } : {}),\n ...(params.trace === 'off' ? { trace: 'off' } : {}),\n ...(params.video === 'on' || params.video === 'off' ? { video: params.video } : {}),\n ...(params.headed !== undefined ? { headless: !params.headed } : {}),\n _optionContextReuseMode: params.reuseContext ? 'when-possible' : undefined,\n _optionConnectOptions: params.connectWsEndpoint ? { wsEndpoint: params.connectWsEndpoint } : undefined,\n actionTimeout: params.actionTimeout,\n },\n ...(params.updateSnapshots ? { updateSnapshots: params.updateSnapshots } : {}),\n ...(params.updateSourceMethod ? { updateSourceMethod: params.updateSourceMethod } : {}),\n ...(params.workers ? { workers: params.workers } : {}),\n };\n\n const config = await this._loadConfigOrReportError(new InternalReporter([userReporter]), overrides);\n if (!config)\n return { status: 'failed' };\n\n config.cliListOnly = false;\n config.cliPassWithNoTests = true;\n config.cliArgs = params.locations || [];\n config.cliGrep = params.grep;\n config.cliGrepInvert = params.grepInvert;\n config.cliProjectFilter = params.projects?.length ? params.projects : undefined;\n config.preOnlyTestFilters = [];\n if (params.testIds) {\n const testIdSet = new Set<string>(params.testIds);\n config.preOnlyTestFilters.push(test => testIdSet.has(test.id));\n }\n\n const configReporters = params.disableConfigReporters ? [] : await createReporters(config, 'test');\n const reporter = new InternalReporter([...configReporters, userReporter]);\n const stop = new ManualPromise();\n const tasks = [\n createApplyRebaselinesTask(),\n createLoadTask('out-of-process', { filterOnly: true, failOnLoadErrors: !!params.failOnLoadErrors, doNotRunDepsOutsideProjectFilter: params.doNotRunDepsOutsideProjectFilter }),\n ...createRunTestsTasks(config),\n ];\n const testRun = new TestRun(config, reporter, { pauseOnError: params.pauseOnError, pauseAtEnd: params.pauseAtEnd });\n testRun.failureTracker.onTestPaused = params => this.emit(TestRunnerEvent.TestPaused, params);\n const run = runTasks(testRun, tasks, 0, stop).then(async status => {\n this._testRun = undefined;\n return status;\n });\n this._testRun = { run, stop };\n return { status: await run };\n }\n\n async watch(fileNames: string[]) {\n this._watchedTestDependencies = new Set();\n for (const fileName of fileNames) {\n this._watchedTestDependencies.add(fileName);\n dependenciesForTestFile(fileName).forEach(file => this._watchedTestDependencies.add(file));\n }\n await this._updateWatcher(true);\n }\n\n async findRelatedTestFiles(files: string[], userReporter?: AnyReporter): Promise<{ testFiles: string[]; errors?: reporterTypes.TestError[]; }> {\n const errorReporter = createErrorCollectingReporter(internalScreen);\n const reporter = new InternalReporter(userReporter ? [userReporter, errorReporter] : [errorReporter]);\n const config = await this._loadConfigOrReportError(reporter);\n if (!config)\n return { errors: errorReporter.errors(), testFiles: [] };\n const status = await runTasks(new TestRun(config, reporter), [\n ...createPluginSetupTasks(config),\n createLoadTask('out-of-process', { failOnLoadErrors: true, filterOnly: false, populateDependencies: true }),\n ]);\n if (status !== 'passed')\n return { errors: errorReporter.errors(), testFiles: [] };\n return { testFiles: affectedTestFiles(files) };\n }\n\n async stopTests() {\n this._testRun?.stop?.resolve();\n await this._testRun?.run;\n }\n\n async closeGracefully() {\n gracefullyProcessExitDoNotHang(0);\n }\n\n async stop() {\n await this.runGlobalTeardown();\n }\n\n private async _loadConfig(overrides?: ConfigCLIOverrides): Promise<{ config: FullConfigInternal | null, error?: reporterTypes.TestError }> {\n try {\n const config = await loadConfig(this.configLocation, overrides);\n // Preserve plugin instances between setup and build.\n if (!this._plugins) {\n webServerPluginsForConfig(config).forEach(p => config.plugins.push({ factory: p }));\n addGitCommitInfoPlugin(config);\n this._plugins = config.plugins || [];\n } else {\n config.plugins.splice(0, config.plugins.length, ...this._plugins);\n }\n return { config };\n } catch (e) {\n return { config: null, error: serializeError(e) };\n }\n }\n\n private async _loadConfigOrReportError(reporter: InternalReporter, overrides?: ConfigCLIOverrides): Promise<FullConfigInternal | null> {\n const { config, error } = await this._loadConfig(overrides);\n if (config)\n return config;\n // Produce dummy config when it has an error.\n reporter.onConfigure(baseFullConfig);\n reporter.onError(error!);\n await reporter.onEnd({ status: 'failed' });\n await reporter.onExit();\n return null;\n }\n}\n\nfunction printInternalError(e: Error) {\n // eslint-disable-next-line no-console\n console.error('Internal error:', e);\n}\n\n// TODO: remove CT dependency.\nasync function resolveCtDirs(config: FullConfigInternal) {\n const use = config.config.projects[0].use as any;\n const relativeTemplateDir = use.ctTemplateDir || 'playwright';\n const templateDir = await fs.promises.realpath(path.normalize(path.join(config.configDir, relativeTemplateDir))).catch(() => undefined);\n if (!templateDir)\n return null;\n const outDir = use.ctCacheDir ? path.resolve(config.configDir, use.ctCacheDir) : path.resolve(templateDir, '.cache');\n return {\n outDir,\n templateDir\n };\n}\n\nexport async function runAllTestsWithConfig(config: FullConfigInternal): Promise<FullResultStatus> {\n setPlaywrightTestProcessEnv();\n\n const listOnly = config.cliListOnly;\n\n addGitCommitInfoPlugin(config);\n\n // Legacy webServer support.\n webServerPluginsForConfig(config).forEach(p => config.plugins.push({ factory: p }));\n\n const reporters = await createReporters(config, listOnly ? 'list' : 'test');\n const lastRun = new LastRunReporter(config);\n if (config.cliLastFailed)\n await lastRun.filterLastFailed();\n\n const reporter = new InternalReporter([...reporters, lastRun]);\n const tasks = listOnly ? [\n createLoadTask('in-process', { failOnLoadErrors: true, filterOnly: false }),\n createReportBeginTask(),\n ] : [\n createApplyRebaselinesTask(),\n ...createGlobalSetupTasks(config),\n createLoadTask('in-process', { filterOnly: true, failOnLoadErrors: true }),\n ...createRunTestsTasks(config),\n ];\n const status = await runTasks(new TestRun(config, reporter), tasks, config.config.globalTimeout);\n\n // Calling process.exit() might truncate large stdout/stderr output.\n // See https://github.com/nodejs/node/issues/6456.\n // See https://github.com/nodejs/node/issues/12921\n // eslint-disable-next-line no-restricted-properties\n await new Promise<void>(resolve => process.stdout.write('', () => resolve()));\n // eslint-disable-next-line no-restricted-properties\n await new Promise<void>(resolve => process.stderr.write('', () => resolve()));\n return status;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,oBAAyB;AACzB,gBAAe;AACf,kBAAiB;AAEjB,oBAAyB;AACzB,mBAA2F;AAE3F,0BAA2B;AAC3B,uBAAwB;AACxB,0BAA+B;AAC/B,iCAAuC;AACvC,6BAA0C;AAC1C,kBAA+B;AAC/B,8BAAiC;AACjC,8BAAqF;AACrF,kBAA+B;AAC/B,uBAA+D;AAC/D,mBAAqQ;AACrQ,qBAAgC;AASzB,MAAM,kBAAkB;AAAA,EAC7B,kBAAkB;AAAA,EAClB,YAAY;AACd;AAwCO,MAAM,mBAAmB,cAAAA,QAAiC;AAAA,EAiB/D,YAAY,gBAAgC,oBAAwC;AAClF,UAAM;AAbR,SAAQ,sBAAsB,oBAAI,IAAY;AAC9C,SAAQ,yBAAyB,oBAAI,IAAY;AACjD,SAAQ,2BAA2B,oBAAI,IAAY;AAGnD,SAAQ,SAAS,QAAQ,QAAQ;AAIjC,SAAQ,iBAAiB;AACzB,SAAQ,8BAA8B;AAIpC,SAAK,iBAAiB;AACtB,SAAK,sBAAsB;AAC3B,SAAK,WAAW,IAAI,yBAAQ,YAAU;AACpC,YAAM,YAAY,oBAAI,IAAY;AAClC,aAAO,QAAQ,WAAK,kDAAyB,EAAE,MAAM,SAAS,CAAC;AAC/D,WAAK,KAAK,gBAAgB,kBAAkB,CAAC,GAAG,SAAS,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,QAGd;AACD,kDAA4B;AAC5B,SAAK,iBAAiB,CAAC,CAAC,OAAO;AAC/B,SAAK,8BAA8B,CAAC,CAAC,OAAO;AAAA,EAC9C;AAAA,EAEA,eAAe,QAAwC;AAErD,YAAQ,OAAO,UAAU,OAAO;AAChC,YAAQ,OAAO,OAAO,OAAO;AAC7B,YAAQ,OAAO,UAAU,OAAO;AAChC,YAAQ,OAAO,OAAO,OAAO;AAAA,EAE/B;AAAA,EAEA,kBAA2B;AACzB,eAAW,eAAe,CAAC,YAAY,UAAU,SAAS,GAAG;AAC3D,UAAI;AACF,+BAAS,eAAe,WAAW,EAAG,oBAAoB,YAAY;AACtE,eAAO;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB;AACtB,UAAM,cAAc,uBAAS,mBAAmB;AAChD,UAAM,uBAAS,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,EAAE,QAAQ,MAAM,IAAI,MAAM,KAAK,YAAY,KAAK,mBAAmB;AACzE,QAAI;AACF,aAAO;AACT,UAAM,IAAI,MAAM,6BAA6B,QAAQ,MAAM,UAAU,gBAAgB;AAAA,EACvF;AAAA,EAEA,MAAM,eAAe,eAAqE;AACxF,UAAM,KAAK,kBAAkB;AAE7B,UAAM,WAAW,IAAI,yCAAiB,aAAa;AACnD,UAAM,SAAS,MAAM,KAAK,yBAAyB,UAAU,KAAK,mBAAmB;AACrF,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,SAAS;AAE5B,UAAM,EAAE,QAAQ,QAAQ,IAAI,UAAM,mCAAqB,IAAI,qBAAQ,QAAQ,QAAQ,GAAG;AAAA,MACpF,OAAG,qCAAuB,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,WAAW;AACb,YAAM,QAAQ;AAAA;AAEd,WAAK,eAAe,EAAE,QAAQ;AAChC,WAAO,EAAE,OAAO;AAAA,EAClB;AAAA,EAEA,MAAM,oBAAoB;AACxB,UAAM,cAAc,KAAK;AACzB,UAAM,SAAS,MAAM,aAAa,QAAQ;AAC1C,SAAK,eAAe;AACpB,WAAO,EAAE,OAAO;AAAA,EAClB;AAAA,EAEA,MAAM,eAAe,cAA2B,MAA8E;AAC5H,UAAM,KAAK,cAAc;AAEzB,UAAM,WAAW,IAAI,yCAAiB,CAAC,YAAY,CAAC;AACpD,UAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAC3D,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,SAAS;AAE5B,UAAM,EAAE,QAAQ,QAAQ,IAAI,UAAM,mCAAqB,IAAI,qBAAQ,QAAQ,QAAQ,GAAG;AAAA,MACpF,OAAG,qCAAuB,MAAM;AAAA,UAChC,6BAAe,MAAM,EAAE,kBAAkB,MAAM,YAAY,MAAM,CAAC;AAAA,UAClE,uCAAyB;AAAA,IAC3B,CAAC;AACD,QAAI,WAAW;AACb,YAAM,QAAQ;AAAA;AAEd,WAAK,aAAa,EAAE,QAAQ;AAC9B,WAAO,EAAE,OAAO;AAAA,EAClB;AAAA,EAEA,MAAM,gBAAuD;AAC3D,UAAM,YAAY,KAAK;AACvB,UAAM,SAAS,MAAM,WAAW,QAAQ;AACxC,SAAK,aAAa;AAClB,WAAO,EAAE,OAAO;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,cAAmE;AAClF,UAAM,WAAW,IAAI,yCAAiB,eAAe,CAAC,YAAY,IAAI,CAAC,CAAC;AACxE,UAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAC3D,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,SAAS;AAC5B,UAAM,SAAS,UAAM,uBAAS,IAAI,qBAAQ,QAAQ,QAAQ,GAAG;AAAA,MAC3D,OAAG,qCAAuB,MAAM;AAAA,UAChC,mCAAqB,MAAM;AAAA,IAC7B,CAAC;AACD,WAAO,EAAE,OAAO;AAAA,EAClB;AAAA,EAEA,MAAM,UAAU,cAA2B,UAA4D;AACrG,UAAM,WAAW,IAAI,yCAAiB,CAAC,YAAY,CAAC;AACpD,UAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAC3D,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,SAAS;AAE5B,WAAO,mBAAmB,UAAU,SAAS,WAAW;AACxD,UAAM,SAAS,UAAM,uBAAS,IAAI,qBAAQ,QAAQ,QAAQ,GAAG;AAAA,UAC3D,kCAAoB;AAAA,UACpB,oCAAsB;AAAA,IACxB,CAAC;AACD,WAAO,EAAE,OAAO;AAAA,EAClB;AAAA,EAEA,MAAM,UAAU,cAA2B,QAAgE;AACzG,QAAI;AACJ,SAAK,SAAS,KAAK,OAAO,KAAK,YAAY;AACzC,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,KAAK,gBAAgB,cAAc,MAAM;AAC1E,UAAI;AACF,cAAM,KAAK,mBAAmB,MAAM;AACtC,eAAS,EAAE,OAAO;AAAA,IACpB,CAAC,EAAE,MAAM,kBAAkB;AAC3B,UAAM,KAAK;AACX,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB,cAA2B,QAGtD;AACD,UAAM,YAAgC;AAAA,MACpC,GAAG,KAAK;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AACA,UAAM,WAAW,IAAI,yCAAiB,CAAC,YAAY,CAAC;AACpD,UAAM,SAAS,MAAM,KAAK,yBAAyB,UAAU,SAAS;AACtE,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,SAAS;AAE5B,WAAO,UAAU,OAAO,aAAa,CAAC;AACtC,WAAO,UAAU,OAAO;AACxB,WAAO,gBAAgB,OAAO;AAC9B,WAAO,mBAAmB,OAAO,UAAU,SAAS,OAAO,WAAW;AACtE,WAAO,cAAc;AAErB,UAAM,SAAS,UAAM,uBAAS,IAAI,qBAAQ,QAAQ,QAAQ,GAAG;AAAA,UAC3D,6BAAe,kBAAkB,EAAE,kBAAkB,OAAO,YAAY,OAAO,sBAAsB,KAAK,4BAA4B,CAAC;AAAA,UACvI,oCAAsB;AAAA,IACxB,CAAC;AACD,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAAA,EAEA,MAAc,mBAAmB,QAA4B;AAC3D,SAAK,sBAAsB,oBAAI,IAAI;AACnC,SAAK,yBAAyB,oBAAI,IAAI;AACtC,eAAW,KAAK,OAAO,UAAU;AAC/B,WAAK,oBAAoB,IAAI,EAAE,QAAQ,OAAO;AAC9C,WAAK,uBAAuB,IAAI,EAAE,QAAQ,SAAS;AAAA,IACrD;AAEA,UAAM,SAAS,MAAM,cAAc,MAAM;AACzC,QAAI,QAAQ;AACV,WAAK,oBAAoB,IAAI,OAAO,WAAW;AAC/C,WAAK,uBAAuB,IAAI,OAAO,MAAM;AAAA,IAC/C;AAEA,QAAI,KAAK;AACP,YAAM,KAAK,eAAe,KAAK;AAAA,EACnC;AAAA,EAEA,MAAc,eAAe,eAAwB;AACnD,UAAM,KAAK,SAAS,OAAO,CAAC,GAAG,KAAK,qBAAqB,GAAG,KAAK,wBAAwB,GAAG,CAAC,GAAG,KAAK,sBAAsB,GAAG,aAAa;AAAA,EAC7I;AAAA,EAEA,MAAM,SAAS,cAA2B,QAA+D;AACvG,QAAI,SAAuC,EAAE,QAAQ,SAAS;AAC9D,SAAK,SAAS,KAAK,OAAO,KAAK,YAAY;AACzC,eAAS,MAAM,KAAK,eAAe,cAAc,MAAM,EAAE,MAAM,OAAK;AAAE,2BAAmB,CAAC;AAAG,eAAO,EAAE,QAAQ,SAAS;AAAA,MAAG,CAAC;AAAA,IAC7H,CAAC;AACD,UAAM,KAAK;AACX,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eAAe,cAA2B,QAA+D;AACrH,UAAM,KAAK,UAAU;AACrB,UAAM,YAAgC;AAAA,MACpC,GAAG,KAAK;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS,OAAO;AAAA,MAChB,mBAAmB;AAAA,MACnB,UAAU,OAAO,YAAY,OAAO,UAAU,IAAI,OAAK,CAAC,CAAC,CAAC,IAAI;AAAA,MAC9D,KAAK;AAAA,QACH,GAAG,KAAK,oBAAoB;AAAA,QAC5B,GAAI,OAAO,UAAU,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,SAAS,OAAO,OAAO,KAAK,EAAE,IAAI,CAAC;AAAA,QACtF,GAAI,OAAO,UAAU,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAAA,QACjD,GAAI,OAAO,UAAU,QAAQ,OAAO,UAAU,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,QACjF,GAAI,OAAO,WAAW,SAAY,EAAE,UAAU,CAAC,OAAO,OAAO,IAAI,CAAC;AAAA,QAClE,yBAAyB,OAAO,eAAe,kBAAkB;AAAA,QACjE,uBAAuB,OAAO,oBAAoB,EAAE,YAAY,OAAO,kBAAkB,IAAI;AAAA,QAC7F,eAAe,OAAO;AAAA,MACxB;AAAA,MACA,GAAI,OAAO,kBAAkB,EAAE,iBAAiB,OAAO,gBAAgB,IAAI,CAAC;AAAA,MAC5E,GAAI,OAAO,qBAAqB,EAAE,oBAAoB,OAAO,mBAAmB,IAAI,CAAC;AAAA,MACrF,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,IACtD;AAEA,UAAM,SAAS,MAAM,KAAK,yBAAyB,IAAI,yCAAiB,CAAC,YAAY,CAAC,GAAG,SAAS;AAClG,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,SAAS;AAE5B,WAAO,cAAc;AACrB,WAAO,qBAAqB;AAC5B,WAAO,UAAU,OAAO,aAAa,CAAC;AACtC,WAAO,UAAU,OAAO;AACxB,WAAO,gBAAgB,OAAO;AAC9B,WAAO,mBAAmB,OAAO,UAAU,SAAS,OAAO,WAAW;AACtE,WAAO,qBAAqB,CAAC;AAC7B,QAAI,OAAO,SAAS;AAClB,YAAM,YAAY,IAAI,IAAY,OAAO,OAAO;AAChD,aAAO,mBAAmB,KAAK,UAAQ,UAAU,IAAI,KAAK,EAAE,CAAC;AAAA,IAC/D;AAEA,UAAM,kBAAkB,OAAO,yBAAyB,CAAC,IAAI,UAAM,kCAAgB,QAAQ,MAAM;AACjG,UAAM,WAAW,IAAI,yCAAiB,CAAC,GAAG,iBAAiB,YAAY,CAAC;AACxE,UAAM,OAAO,IAAI,2BAAc;AAC/B,UAAM,QAAQ;AAAA,UACZ,yCAA2B;AAAA,UAC3B,6BAAe,kBAAkB,EAAE,YAAY,MAAM,kBAAkB,CAAC,CAAC,OAAO,kBAAkB,kCAAkC,OAAO,iCAAiC,CAAC;AAAA,MAC7K,OAAG,kCAAoB,MAAM;AAAA,IAC/B;AACA,UAAM,UAAU,IAAI,qBAAQ,QAAQ,UAAU,EAAE,cAAc,OAAO,cAAc,YAAY,OAAO,WAAW,CAAC;AAClH,YAAQ,eAAe,eAAe,CAAAC,YAAU,KAAK,KAAK,gBAAgB,YAAYA,OAAM;AAC5F,UAAM,UAAM,uBAAS,SAAS,OAAO,GAAG,IAAI,EAAE,KAAK,OAAM,WAAU;AACjE,WAAK,WAAW;AAChB,aAAO;AAAA,IACT,CAAC;AACD,SAAK,WAAW,EAAE,KAAK,KAAK;AAC5B,WAAO,EAAE,QAAQ,MAAM,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,MAAM,WAAqB;AAC/B,SAAK,2BAA2B,oBAAI,IAAI;AACxC,eAAW,YAAY,WAAW;AAChC,WAAK,yBAAyB,IAAI,QAAQ;AAC1C,2DAAwB,QAAQ,EAAE,QAAQ,UAAQ,KAAK,yBAAyB,IAAI,IAAI,CAAC;AAAA,IAC3F;AACA,UAAM,KAAK,eAAe,IAAI;AAAA,EAChC;AAAA,EAEA,MAAM,qBAAqB,OAAiB,cAAmG;AAC7I,UAAM,oBAAgB,gDAA8B,0BAAc;AAClE,UAAM,WAAW,IAAI,yCAAiB,eAAe,CAAC,cAAc,aAAa,IAAI,CAAC,aAAa,CAAC;AACpG,UAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;AAC3D,QAAI,CAAC;AACH,aAAO,EAAE,QAAQ,cAAc,OAAO,GAAG,WAAW,CAAC,EAAE;AACzD,UAAM,SAAS,UAAM,uBAAS,IAAI,qBAAQ,QAAQ,QAAQ,GAAG;AAAA,MAC3D,OAAG,qCAAuB,MAAM;AAAA,UAChC,6BAAe,kBAAkB,EAAE,kBAAkB,MAAM,YAAY,OAAO,sBAAsB,KAAK,CAAC;AAAA,IAC5G,CAAC;AACD,QAAI,WAAW;AACb,aAAO,EAAE,QAAQ,cAAc,OAAO,GAAG,WAAW,CAAC,EAAE;AACzD,WAAO,EAAE,eAAW,2CAAkB,KAAK,EAAE;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAY;AAChB,SAAK,UAAU,MAAM,QAAQ;AAC7B,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAM,kBAAkB;AACtB,qDAA+B,CAAC;AAAA,EAClC;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,KAAK,kBAAkB;AAAA,EAC/B;AAAA,EAEA,MAAc,YAAY,WAAiH;AACzI,QAAI;AACF,YAAM,SAAS,UAAM,gCAAW,KAAK,gBAAgB,SAAS;AAE9D,UAAI,CAAC,KAAK,UAAU;AAClB,8DAA0B,MAAM,EAAE,QAAQ,OAAK,OAAO,QAAQ,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAClF,+DAAuB,MAAM;AAC7B,aAAK,WAAW,OAAO,WAAW,CAAC;AAAA,MACrC,OAAO;AACL,eAAO,QAAQ,OAAO,GAAG,OAAO,QAAQ,QAAQ,GAAG,KAAK,QAAQ;AAAA,MAClE;AACA,aAAO,EAAE,OAAO;AAAA,IAClB,SAAS,GAAG;AACV,aAAO,EAAE,QAAQ,MAAM,WAAO,4BAAe,CAAC,EAAE;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAc,yBAAyB,UAA4B,WAAoE;AACrI,UAAM,EAAE,QAAQ,MAAM,IAAI,MAAM,KAAK,YAAY,SAAS;AAC1D,QAAI;AACF,aAAO;AAET,aAAS,YAAY,kCAAc;AACnC,aAAS,QAAQ,KAAM;AACvB,UAAM,SAAS,MAAM,EAAE,QAAQ,SAAS,CAAC;AACzC,UAAM,SAAS,OAAO;AACtB,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,GAAU;AAEpC,UAAQ,MAAM,mBAAmB,CAAC;AACpC;AAGA,eAAe,cAAc,QAA4B;AACvD,QAAM,MAAM,OAAO,OAAO,SAAS,CAAC,EAAE;AACtC,QAAM,sBAAsB,IAAI,iBAAiB;AACjD,QAAM,cAAc,MAAM,UAAAC,QAAG,SAAS,SAAS,YAAAC,QAAK,UAAU,YAAAA,QAAK,KAAK,OAAO,WAAW,mBAAmB,CAAC,CAAC,EAAE,MAAM,MAAM,MAAS;AACtI,MAAI,CAAC;AACH,WAAO;AACT,QAAM,SAAS,IAAI,aAAa,YAAAA,QAAK,QAAQ,OAAO,WAAW,IAAI,UAAU,IAAI,YAAAA,QAAK,QAAQ,aAAa,QAAQ;AACnH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,sBAAsB,QAAuD;AACjG,gDAA4B;AAE5B,QAAM,WAAW,OAAO;AAExB,yDAAuB,MAAM;AAG7B,wDAA0B,MAAM,EAAE,QAAQ,OAAK,OAAO,QAAQ,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAElF,QAAM,YAAY,UAAM,kCAAgB,QAAQ,WAAW,SAAS,MAAM;AAC1E,QAAM,UAAU,IAAI,+BAAgB,MAAM;AAC1C,MAAI,OAAO;AACT,UAAM,QAAQ,iBAAiB;AAEjC,QAAM,WAAW,IAAI,yCAAiB,CAAC,GAAG,WAAW,OAAO,CAAC;AAC7D,QAAM,QAAQ,WAAW;AAAA,QACvB,6BAAe,cAAc,EAAE,kBAAkB,MAAM,YAAY,MAAM,CAAC;AAAA,QAC1E,oCAAsB;AAAA,EACxB,IAAI;AAAA,QACF,yCAA2B;AAAA,IAC3B,OAAG,qCAAuB,MAAM;AAAA,QAChC,6BAAe,cAAc,EAAE,YAAY,MAAM,kBAAkB,KAAK,CAAC;AAAA,IACzE,OAAG,kCAAoB,MAAM;AAAA,EAC/B;AACA,QAAM,SAAS,UAAM,uBAAS,IAAI,qBAAQ,QAAQ,QAAQ,GAAG,OAAO,OAAO,OAAO,aAAa;AAM/F,QAAM,IAAI,QAAc,aAAW,QAAQ,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC;AAE5E,QAAM,IAAI,QAAc,aAAW,QAAQ,OAAO,MAAM,IAAI,MAAM,QAAQ,CAAC,CAAC;AAC5E,SAAO;AACT;",
|
|
6
|
+
"names": ["EventEmitter", "params", "fs", "path"]
|
|
7
|
+
}
|
package/lib/runner/testServer.js
CHANGED
|
@@ -114,8 +114,8 @@ class TestServerDispatcher {
|
|
|
114
114
|
async runGlobalSetup(params) {
|
|
115
115
|
const { reporter, report } = await this._collectingReporter();
|
|
116
116
|
this._globalSetupReport = report;
|
|
117
|
-
const { status } = await this._testRunner.runGlobalSetup([reporter, new import_list.default()]);
|
|
118
|
-
return { report, status };
|
|
117
|
+
const { status, env } = await this._testRunner.runGlobalSetup([reporter, new import_list.default()]);
|
|
118
|
+
return { report, status, env };
|
|
119
119
|
}
|
|
120
120
|
async runGlobalTeardown() {
|
|
121
121
|
const { status } = await this._testRunner.runGlobalTeardown();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner/testServer.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport util from 'util';\n\nimport { installRootRedirect, openTraceInBrowser, openTraceViewerApp, startTraceViewerServer } from 'playwright-core/lib/server';\nimport { ManualPromise, gracefullyProcessExitDoNotHang, isUnderTest } from 'playwright-core/lib/utils';\nimport { debug, open } from 'playwright-core/lib/utilsBundle';\n\nimport { loadConfig, resolveConfigLocation } from '../common/configLoader';\nimport ListReporter from '../reporters/list';\nimport { createReporterForTestServer } from './reporters';\nimport { SigIntWatcher } from './sigIntWatcher';\nimport { TestRunner, TestRunnerEvent } from './testRunner';\n\nimport type { TraceViewerRedirectOptions, TraceViewerServerOptions } from 'playwright-core/lib/server/trace/viewer/traceViewer';\nimport type { HttpServer, Transport } from 'playwright-core/lib/utils';\nimport type * as reporterTypes from '../../types/testReporter';\nimport type { ConfigLocation } from '../common/config';\nimport type { ConfigCLIOverrides } from '../common/ipc';\nimport type { ReportEntry, TestServerInterface, TestServerInterfaceEventEmitters } from '../isomorphic/testServerInterface';\nimport type { ReporterV2 } from '../reporters/reporterV2';\n\nconst originalDebugLog = debug.log;\n// eslint-disable-next-line no-restricted-properties\nconst originalStdoutWrite = process.stdout.write;\n// eslint-disable-next-line no-restricted-properties\nconst originalStderrWrite = process.stderr.write;\n\nconst originalStdinIsTTY = process.stdin.isTTY;\n\nclass TestServer {\n private _configLocation: ConfigLocation;\n private _configCLIOverrides: ConfigCLIOverrides;\n private _dispatcher: TestServerDispatcher | undefined;\n\n constructor(configLocation: ConfigLocation, configCLIOverrides: ConfigCLIOverrides) {\n this._configLocation = configLocation;\n this._configCLIOverrides = configCLIOverrides;\n }\n\n async start(options: { host?: string, port?: number }): Promise<HttpServer> {\n this._dispatcher = new TestServerDispatcher(this._configLocation, this._configCLIOverrides);\n return await startTraceViewerServer({ ...options, transport: this._dispatcher.transport });\n }\n\n async stop() {\n await this._dispatcher?.stop();\n }\n}\n\nexport type ListTestsParams = {\n projects?: string[];\n locations?: string[];\n grep?: string;\n grepInvert?: string;\n};\n\nexport type RunTestsParams = {\n locations?: string[];\n grep?: string;\n grepInvert?: string;\n testIds?: string[];\n headed?: boolean;\n workers?: number | string;\n updateSnapshots?: 'all' | 'changed' | 'missing' | 'none';\n updateSourceMethod?: 'overwrite' | 'patch' | '3way';\n reporters?: string[],\n trace?: 'on' | 'off';\n video?: 'on' | 'off';\n projects?: string[];\n reuseContext?: boolean;\n connectWsEndpoint?: string;\n};\n\nexport class TestServerDispatcher implements TestServerInterface {\n readonly transport: Transport;\n private _serializer = require.resolve('./uiModeReporter');\n private _closeOnDisconnect = false;\n private _testRunner: TestRunner;\n private _globalSetupReport: ReportEntry[] | undefined;\n private _devServerReport: ReportEntry[] | undefined;\n readonly _dispatchEvent: TestServerInterfaceEventEmitters['dispatchEvent'];\n\n constructor(configLocation: ConfigLocation, configCLIOverrides: ConfigCLIOverrides) {\n this._testRunner = new TestRunner(configLocation, configCLIOverrides);\n this.transport = {\n onconnect: () => {},\n dispatch: (method, params) => (this as any)[method](params),\n onclose: () => {\n if (this._closeOnDisconnect)\n gracefullyProcessExitDoNotHang(0);\n },\n };\n\n this._dispatchEvent = (method, params) => this.transport.sendEvent?.(method, params);\n this._testRunner.on(TestRunnerEvent.TestFilesChanged, testFiles => this._dispatchEvent('testFilesChanged', { testFiles }));\n this._testRunner.on(TestRunnerEvent.TestPaused, params => this._dispatchEvent('testPaused', { errors: params.errors }));\n }\n\n private async _wireReporter(messageSink: (message: any) => void) {\n return await createReporterForTestServer(this._serializer, messageSink);\n }\n\n private async _collectingReporter(): Promise<{ reporter: ReporterV2, report: ReportEntry[] }> {\n const report: ReportEntry[] = [];\n return {\n reporter: await createReporterForTestServer(this._serializer, e => report.push(e)),\n report,\n };\n }\n\n async initialize(params: Parameters<TestServerInterface['initialize']>[0]): ReturnType<TestServerInterface['initialize']> {\n // Note: this method can be called multiple times, for example from a new connection after UI mode reload.\n this._serializer = params.serializer || require.resolve('./uiModeReporter');\n this._closeOnDisconnect = !!params.closeOnDisconnect;\n await this._testRunner.initialize({\n ...params,\n });\n this._setInterceptStdio(!!params.interceptStdio);\n }\n\n async ping() {}\n\n async open(params: Parameters<TestServerInterface['open']>[0]): ReturnType<TestServerInterface['open']> {\n if (isUnderTest())\n return;\n // eslint-disable-next-line no-console\n open('vscode://file/' + params.location.file + ':' + params.location.line).catch(e => console.error(e));\n }\n\n async resizeTerminal(params: Parameters<TestServerInterface['resizeTerminal']>[0]): ReturnType<TestServerInterface['resizeTerminal']> {\n this._testRunner.resizeTerminal(params);\n }\n\n async checkBrowsers(): Promise<{ hasBrowsers: boolean; }> {\n return { hasBrowsers: this._testRunner.hasSomeBrowsers() };\n }\n\n async installBrowsers() {\n await this._testRunner.installBrowsers();\n }\n\n async runGlobalSetup(params: Parameters<TestServerInterface['runGlobalSetup']>[0]): ReturnType<TestServerInterface['runGlobalSetup']> {\n const { reporter, report } = await this._collectingReporter();\n this._globalSetupReport = report;\n const { status } = await this._testRunner.runGlobalSetup([reporter, new ListReporter()]);\n return { report, status };\n }\n\n async runGlobalTeardown() {\n const { status } = await this._testRunner.runGlobalTeardown();\n const report = this._globalSetupReport || [];\n this._globalSetupReport = undefined;\n return { status, report };\n }\n\n async startDevServer(params: Parameters<TestServerInterface['startDevServer']>[0]): ReturnType<TestServerInterface['startDevServer']> {\n await this.stopDevServer({});\n\n const { reporter, report } = await this._collectingReporter();\n const { status } = await this._testRunner.startDevServer(reporter, 'out-of-process');\n return { report, status };\n }\n\n async stopDevServer(params: Parameters<TestServerInterface['stopDevServer']>[0]): ReturnType<TestServerInterface['stopDevServer']> {\n const { status } = await this._testRunner.stopDevServer();\n const report = this._devServerReport || [];\n this._devServerReport = undefined;\n return { status, report };\n }\n\n async clearCache(params: Parameters<TestServerInterface['clearCache']>[0]): ReturnType<TestServerInterface['clearCache']> {\n await this._testRunner.clearCache();\n }\n\n async listFiles(params: Parameters<TestServerInterface['listFiles']>[0]): ReturnType<TestServerInterface['listFiles']> {\n const { reporter, report } = await this._collectingReporter();\n const { status } = await this._testRunner.listFiles(reporter, params.projects);\n return { report, status };\n }\n\n async listTests(params: Parameters<TestServerInterface['listTests']>[0]): ReturnType<TestServerInterface['listTests']> {\n const { reporter, report } = await this._collectingReporter();\n const { status } = await this._testRunner.listTests(reporter, params);\n return { report, status };\n }\n\n async runTests(params: Parameters<TestServerInterface['runTests']>[0]): ReturnType<TestServerInterface['runTests']> {\n const wireReporter = await this._wireReporter(e => this._dispatchEvent('report', e));\n const { status } = await this._testRunner.runTests(wireReporter, {\n ...params,\n doNotRunDepsOutsideProjectFilter: true,\n pauseAtEnd: params.pauseAtEnd,\n pauseOnError: params.pauseOnError,\n });\n return { status };\n }\n\n async watch(params: { fileNames: string[]; }) {\n await this._testRunner.watch(params.fileNames);\n }\n\n async findRelatedTestFiles(params: Parameters<TestServerInterface['findRelatedTestFiles']>[0]): ReturnType<TestServerInterface['findRelatedTestFiles']> {\n return this._testRunner.findRelatedTestFiles(params.files);\n }\n\n async stopTests() {\n await this._testRunner.stopTests();\n }\n\n async stop() {\n this._setInterceptStdio(false);\n await this._testRunner.stop();\n }\n\n async closeGracefully() {\n await this._testRunner.closeGracefully();\n }\n\n private _setInterceptStdio(interceptStdio: boolean) {\n /* eslint-disable no-restricted-properties */\n if (process.env.PWTEST_DEBUG)\n return;\n if (interceptStdio) {\n if (debug.log === originalDebugLog) {\n // Only if debug.log hasn't already been tampered with, don't intercept any DEBUG=* logging\n debug.log = (...args) => {\n const string = util.format(...args) + '\\n';\n return (originalStderrWrite as any).apply(process.stderr, [string]);\n };\n }\n const stdoutWrite = (chunk: string | Buffer) => {\n this._dispatchEvent('stdio', chunkToPayload('stdout', chunk));\n return true;\n };\n const stderrWrite = (chunk: string | Buffer) => {\n this._dispatchEvent('stdio', chunkToPayload('stderr', chunk));\n return true;\n };\n process.stdout.write = stdoutWrite;\n process.stderr.write = stderrWrite;\n\n // Override isTTY to prevent reporters from thinking they can block and wait for user SIGINT.\n // We don't have a test for this, so be careful!\n // https://github.com/microsoft/playwright/issues/37867\n // @ts-expect-error types are wrong, isTTY can be undefined\n process.stdin.isTTY = undefined;\n } else {\n debug.log = originalDebugLog;\n process.stdout.write = originalStdoutWrite;\n process.stderr.write = originalStderrWrite;\n process.stdin.isTTY = originalStdinIsTTY;\n }\n /* eslint-enable no-restricted-properties */\n }\n}\n\nexport async function runUIMode(configFile: string | undefined, configCLIOverrides: ConfigCLIOverrides, options: TraceViewerServerOptions & TraceViewerRedirectOptions): Promise<reporterTypes.FullResult['status']> {\n const configLocation = resolveConfigLocation(configFile);\n return await innerRunTestServer(configLocation, configCLIOverrides, options, async (server: HttpServer, cancelPromise: ManualPromise<void>) => {\n await installRootRedirect(server, undefined, { ...options, webApp: 'uiMode.html' });\n if (options.host !== undefined || options.port !== undefined) {\n await openTraceInBrowser(server.urlPrefix('human-readable'));\n } else {\n const channel = await installedChromiumChannelForUI(configLocation, configCLIOverrides);\n const page = await openTraceViewerApp(server.urlPrefix('precise'), 'chromium', {\n headless: isUnderTest() && process.env.PWTEST_HEADED_FOR_TEST !== '1',\n persistentContextOptions: {\n handleSIGINT: false,\n channel,\n },\n });\n page.on('close', () => cancelPromise.resolve());\n }\n });\n}\n\n// Pick first channel that is used by one of the projects, to ensure it is installed on the machine.\nasync function installedChromiumChannelForUI(configLocation: ConfigLocation, configCLIOverrides: ConfigCLIOverrides) {\n const config = await loadConfig(configLocation, configCLIOverrides).catch(e => null);\n if (!config)\n return undefined;\n if (config.projects.some(p => (!p.project.use.browserName || p.project.use.browserName === 'chromium') && !p.project.use.channel))\n return undefined;\n for (const channel of ['chromium', 'chrome', 'msedge']) {\n if (config.projects.some(p => p.project.use.channel === channel))\n return channel;\n }\n return undefined;\n}\n\nexport async function runTestServer(configFile: string | undefined, configCLIOverrides: ConfigCLIOverrides, options: { host?: string, port?: number }): Promise<reporterTypes.FullResult['status']> {\n const configLocation = resolveConfigLocation(configFile);\n return await innerRunTestServer(configLocation, configCLIOverrides, options, async server => {\n // eslint-disable-next-line no-console\n console.log('Listening on ' + server.urlPrefix('precise').replace('http:', 'ws:') + '/' + server.wsGuid());\n });\n}\n\nasync function innerRunTestServer(configLocation: ConfigLocation, configCLIOverrides: ConfigCLIOverrides, options: { host?: string, port?: number }, openUI: (server: HttpServer, cancelPromise: ManualPromise<void>) => Promise<void>): Promise<reporterTypes.FullResult['status']> {\n const testServer = new TestServer(configLocation, configCLIOverrides);\n const cancelPromise = new ManualPromise<void>();\n const sigintWatcher = new SigIntWatcher();\n process.stdin.on('close', () => gracefullyProcessExitDoNotHang(0));\n void sigintWatcher.promise().then(() => cancelPromise.resolve());\n try {\n const server = await testServer.start(options);\n await openUI(server, cancelPromise);\n await cancelPromise;\n } finally {\n await testServer.stop();\n sigintWatcher.disarm();\n }\n return sigintWatcher.hadSignal() ? 'interrupted' : 'passed';\n}\n\ntype StdioPayload = {\n type: 'stdout' | 'stderr';\n text?: string;\n buffer?: string;\n};\n\nfunction chunkToPayload(type: 'stdout' | 'stderr', chunk: Buffer | string): StdioPayload {\n if (chunk instanceof Uint8Array)\n return { type, buffer: chunk.toString('base64') };\n return { type, text: chunk };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ListReporter", "util"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner/uiModeReporter.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TeleReporterEmitter } from '../reporters/teleEmitter';\n\nclass UIModeReporter extends TeleReporterEmitter {\n constructor(options: any) {\n super(options._send, { omitBuffers: true });\n }\n}\n\nexport default UIModeReporter;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,yBAAoC;AAEpC,MAAM,uBAAuB,uCAAoB;AAAA,EAC/C,YAAY,SAAc;AACxB,UAAM,QAAQ,OAAO,EAAE,aAAa,KAAK,CAAC;AAAA,EAC5C;AACF;AAEA,IAAO,yBAAQ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner/vcs.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport childProcess from 'child_process';\nimport path from 'path';\n\nimport { affectedTestFiles } from '../transform/compilationCache';\n\nexport async function detectChangedTestFiles(baseCommit: string, configDir: string): Promise<Set<string>> {\n function gitFileList(command: string) {\n try {\n return childProcess.execSync(\n `git ${command}`,\n { encoding: 'utf-8', stdio: 'pipe', cwd: configDir }\n ).split('\\n').filter(Boolean);\n } catch (_error) {\n const error = _error as childProcess.SpawnSyncReturns<string>;\n\n const unknownRevision = error.output.some(line => line?.includes('unknown revision'));\n if (unknownRevision) {\n const isShallowClone = childProcess.execSync('git rev-parse --is-shallow-repository', { encoding: 'utf-8', stdio: 'pipe', cwd: configDir }).trim() === 'true';\n if (isShallowClone) {\n throw new Error([\n `The repository is a shallow clone and does not have '${baseCommit}' available locally.`,\n `Note that GitHub Actions checkout is shallow by default: https://github.com/actions/checkout`\n ].join('\\n'));\n }\n }\n\n throw new Error([\n `Cannot detect changed files for --only-changed mode:`,\n `git ${command}`,\n '',\n ...error.output,\n ].join('\\n'));\n }\n }\n\n const untrackedFiles = gitFileList(`ls-files --others --exclude-standard`).map(file => path.join(configDir, file));\n\n const [gitRoot] = gitFileList('rev-parse --show-toplevel');\n const trackedFilesWithChanges = gitFileList(`diff ${baseCommit} --name-only`).map(file => path.join(gitRoot, file));\n\n return new Set(affectedTestFiles([...untrackedFiles, ...trackedFilesWithChanges]));\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,2BAAyB;AACzB,kBAAiB;AAEjB,8BAAkC;AAElC,eAAsB,uBAAuB,YAAoB,WAAyC;AACxG,WAAS,YAAY,SAAiB;AACpC,QAAI;AACF,aAAO,qBAAAA,QAAa;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,EAAE,UAAU,SAAS,OAAO,QAAQ,KAAK,UAAU;AAAA,MACvD,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,IAC9B,SAAS,QAAQ;AACf,YAAM,QAAQ;AAEd,YAAM,kBAAkB,MAAM,OAAO,KAAK,UAAQ,MAAM,SAAS,kBAAkB,CAAC;AACpF,UAAI,iBAAiB;AACnB,cAAM,iBAAiB,qBAAAA,QAAa,SAAS,yCAAyC,EAAE,UAAU,SAAU,OAAO,QAAQ,KAAK,UAAU,CAAC,EAAE,KAAK,MAAM;AACxJ,YAAI,gBAAgB;AAClB,gBAAM,IAAI,MAAM;AAAA,YACd,wDAAwD,UAAU;AAAA,YAClE;AAAA,UACF,EAAE,KAAK,IAAI,CAAC;AAAA,QACd;AAAA,MACF;AAEA,YAAM,IAAI,MAAM;AAAA,QACd;AAAA,QACA,OAAO,OAAO;AAAA,QACd;AAAA,QACA,GAAG,MAAM;AAAA,MACX,EAAE,KAAK,IAAI,CAAC;AAAA,IACd;AAAA,EACF;AAEA,QAAM,iBAAiB,YAAY,sCAAsC,EAAE,IAAI,UAAQ,YAAAC,QAAK,KAAK,WAAW,IAAI,CAAC;AAEjH,QAAM,CAAC,OAAO,IAAI,YAAY,2BAA2B;AACzD,QAAM,0BAA0B,YAAY,QAAQ,UAAU,cAAc,EAAE,IAAI,UAAQ,YAAAA,QAAK,KAAK,SAAS,IAAI,CAAC;AAElH,SAAO,IAAI,QAAI,2CAAkB,CAAC,GAAG,gBAAgB,GAAG,uBAAuB,CAAC,CAAC;AACnF;",
|
|
6
|
+
"names": ["childProcess", "path"]
|
|
7
|
+
}
|
package/lib/runner/watchMode.js
CHANGED
|
@@ -267,7 +267,8 @@ async function runTests(watchOptions, testServerConnection, options) {
|
|
|
267
267
|
await testServerConnection.runTests({
|
|
268
268
|
grep: watchOptions.grep,
|
|
269
269
|
testIds: options?.testIds,
|
|
270
|
-
locations: watchOptions?.files,
|
|
270
|
+
locations: watchOptions?.files ?? [],
|
|
271
|
+
// TODO: always collect locations based on knowledge about tree, so that we don't have to load all tests
|
|
271
272
|
projects: watchOptions.projects,
|
|
272
273
|
connectWsEndpoint,
|
|
273
274
|
reuseContext: connectWsEndpoint ? true : void 0,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner/watchMode.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from 'path';\nimport readline from 'readline';\nimport { EventEmitter } from 'stream';\n\nimport { PlaywrightServer } from 'playwright-core/lib/remote/playwrightServer';\nimport { ManualPromise, createGuid, eventsHelper, getPackageManagerExecCommand } from 'playwright-core/lib/utils';\nimport { colors } from 'playwright-core/lib/utils';\n\nimport { separator, terminalScreen } from '../reporters/base';\nimport { enquirer } from '../utilsBundle';\nimport { TestServerDispatcher } from './testServer';\nimport { TeleSuiteUpdater } from '../isomorphic/teleSuiteUpdater';\nimport { TestServerConnection } from '../isomorphic/testServerConnection';\n\nimport type * as reporterTypes from '../../types/testReporter';\nimport type { ConfigLocation } from '../common/config';\nimport type { TestServerTransport } from '../isomorphic/testServerConnection';\n\n/* eslint-disable no-restricted-properties */\n\nclass InMemoryTransport extends EventEmitter implements TestServerTransport {\n public readonly _send: (data: string) => void;\n\n constructor(send: (data: any) => void) {\n super();\n this._send = send;\n }\n\n close() {\n this.emit('close');\n }\n\n onclose(listener: () => void): void {\n this.on('close', listener);\n }\n\n onerror(listener: () => void): void {\n // no-op to fulfil the interface, the user of InMemoryTransport doesn't emit any errors.\n }\n\n onmessage(listener: (message: string) => void): void {\n this.on('message', listener);\n }\n\n onopen(listener: () => void): void {\n this.on('open', listener);\n }\n\n send(data: string): void {\n this._send(data);\n }\n}\n\ninterface WatchModeOptions {\n files?: string[];\n projects?: string[];\n grep?: string;\n}\n\nexport async function runWatchModeLoop(configLocation: ConfigLocation, initialOptions: WatchModeOptions): Promise<reporterTypes.FullResult['status']> {\n const options: WatchModeOptions = { ...initialOptions };\n let bufferMode = false;\n\n const testServerDispatcher = new TestServerDispatcher(configLocation, {});\n const transport = new InMemoryTransport(\n async data => {\n const { id, method, params } = JSON.parse(data);\n try {\n const result = await testServerDispatcher.transport.dispatch(method, params);\n transport.emit('message', JSON.stringify({ id, result }));\n } catch (e) {\n transport.emit('message', JSON.stringify({ id, error: String(e) }));\n }\n }\n );\n testServerDispatcher.transport.sendEvent = (method, params) => {\n transport.emit('message', JSON.stringify({ method, params }));\n };\n const testServerConnection = new TestServerConnection(transport);\n transport.emit('open');\n\n const teleSuiteUpdater = new TeleSuiteUpdater({ pathSeparator: path.sep, onUpdate() { } });\n\n const dirtyTestFiles = new Set<string>();\n const dirtyTestIds = new Set<string>();\n let onDirtyTests = new ManualPromise<'changed'>();\n\n let queue = Promise.resolve();\n const changedFiles = new Set<string>();\n testServerConnection.onTestFilesChanged(({ testFiles }) => {\n testFiles.forEach(file => changedFiles.add(file));\n\n queue = queue.then(async () => {\n if (changedFiles.size === 0)\n return;\n\n const { report } = await testServerConnection.listTests({ locations: options.files, projects: options.projects, grep: options.grep });\n teleSuiteUpdater.processListReport(report);\n\n for (const test of teleSuiteUpdater.rootSuite!.allTests()) {\n if (changedFiles.has(test.location.file)) {\n dirtyTestFiles.add(test.location.file);\n dirtyTestIds.add(test.id);\n }\n }\n changedFiles.clear();\n\n if (dirtyTestIds.size > 0) {\n onDirtyTests.resolve('changed');\n onDirtyTests = new ManualPromise();\n }\n });\n });\n testServerConnection.onReport(report => teleSuiteUpdater.processTestReportEvent(report));\n\n await testServerConnection.initialize({\n interceptStdio: false,\n watchTestDirs: true,\n populateDependenciesOnList: true,\n });\n await testServerConnection.runGlobalSetup({});\n\n const { report } = await testServerConnection.listTests({});\n teleSuiteUpdater.processListReport(report);\n\n const projectNames = teleSuiteUpdater.rootSuite!.suites.map(s => s.title);\n\n let lastRun: { type: 'changed' | 'regular' | 'failed', failedTestIds?: string[], dirtyTestIds?: string[] } = { type: 'regular' };\n let result: reporterTypes.FullResult['status'] = 'passed';\n\n while (true) {\n if (bufferMode)\n printBufferPrompt(dirtyTestFiles, teleSuiteUpdater.config!.rootDir);\n else\n printPrompt();\n\n const waitForCommand = readCommand();\n const command = await Promise.race([\n onDirtyTests,\n waitForCommand.result,\n ]);\n if (command === 'changed')\n waitForCommand.dispose();\n if (bufferMode && command === 'changed')\n continue;\n\n const shouldRunChangedFiles = bufferMode ? command === 'run' : command === 'changed';\n if (shouldRunChangedFiles) {\n if (dirtyTestIds.size === 0)\n continue;\n\n const testIds = [...dirtyTestIds];\n dirtyTestIds.clear();\n dirtyTestFiles.clear();\n await runTests(options, testServerConnection, { testIds, title: 'files changed' });\n lastRun = { type: 'changed', dirtyTestIds: testIds };\n continue;\n }\n\n if (command === 'run') {\n // All means reset filters.\n await runTests(options, testServerConnection);\n lastRun = { type: 'regular' };\n continue;\n }\n\n if (command === 'project') {\n const { selectedProjects } = await enquirer.prompt<{ selectedProjects: string[] }>({\n type: 'multiselect',\n name: 'selectedProjects',\n message: 'Select projects',\n choices: projectNames,\n }).catch(() => ({ selectedProjects: null }));\n if (!selectedProjects)\n continue;\n options.projects = selectedProjects.length ? selectedProjects : undefined;\n await runTests(options, testServerConnection);\n lastRun = { type: 'regular' };\n continue;\n }\n\n if (command === 'file') {\n const { filePattern } = await enquirer.prompt<{ filePattern: string }>({\n type: 'text',\n name: 'filePattern',\n message: 'Input filename pattern (regex)',\n }).catch(() => ({ filePattern: null }));\n if (filePattern === null)\n continue;\n if (filePattern.trim())\n options.files = filePattern.split(' ');\n else\n options.files = undefined;\n await runTests(options, testServerConnection);\n lastRun = { type: 'regular' };\n continue;\n }\n\n if (command === 'grep') {\n const { testPattern } = await enquirer.prompt<{ testPattern: string }>({\n type: 'text',\n name: 'testPattern',\n message: 'Input test name pattern (regex)',\n }).catch(() => ({ testPattern: null }));\n if (testPattern === null)\n continue;\n if (testPattern.trim())\n options.grep = testPattern;\n else\n options.grep = undefined;\n await runTests(options, testServerConnection);\n lastRun = { type: 'regular' };\n continue;\n }\n\n if (command === 'failed') {\n const failedTestIds = teleSuiteUpdater.rootSuite!.allTests().filter(t => !t.ok()).map(t => t.id);\n await runTests({}, testServerConnection, { title: 'running failed tests', testIds: failedTestIds });\n lastRun = { type: 'failed', failedTestIds };\n continue;\n }\n\n if (command === 'repeat') {\n if (lastRun.type === 'regular') {\n await runTests(options, testServerConnection, { title: 're-running tests' });\n continue;\n } else if (lastRun.type === 'changed') {\n await runTests(options, testServerConnection, { title: 're-running tests', testIds: lastRun.dirtyTestIds });\n } else if (lastRun.type === 'failed') {\n await runTests({}, testServerConnection, { title: 're-running tests', testIds: lastRun.failedTestIds });\n }\n continue;\n }\n\n if (command === 'toggle-show-browser') {\n await toggleShowBrowser();\n continue;\n }\n\n if (command === 'toggle-buffer-mode') {\n bufferMode = !bufferMode;\n continue;\n }\n\n if (command === 'exit')\n break;\n\n if (command === 'interrupted') {\n result = 'interrupted';\n break;\n }\n }\n\n const teardown = await testServerConnection.runGlobalTeardown({});\n\n return result === 'passed' ? teardown.status : result;\n}\n\nfunction readKeyPress<T extends string>(handler: (text: string, key: any) => T | undefined): { dispose(): void; result: Promise<T> } {\n const promise = new ManualPromise<T>();\n\n const rl = readline.createInterface({ input: process.stdin, escapeCodeTimeout: 50 });\n readline.emitKeypressEvents(process.stdin, rl);\n if (process.stdin.isTTY)\n process.stdin.setRawMode(true);\n\n const listener = eventsHelper.addEventListener(process.stdin, 'keypress', (text: string, key: any) => {\n const result = handler(text, key);\n if (result)\n promise.resolve(result);\n });\n\n const dispose = () => {\n eventsHelper.removeEventListeners([listener]);\n rl.close();\n if (process.stdin.isTTY)\n process.stdin.setRawMode(false);\n };\n\n void promise.finally(dispose);\n\n return { result: promise, dispose };\n}\n\nconst isInterrupt = (text: string, key: any) => text === '\\x03' || text === '\\x1B' || (key && key.name === 'escape') || (key && key.ctrl && key.name === 'c');\n\nasync function runTests(watchOptions: WatchModeOptions, testServerConnection: TestServerConnection, options?: {\n title?: string,\n testIds?: string[],\n}) {\n printConfiguration(watchOptions, options?.title);\n\n const waitForDone = readKeyPress((text: string, key: any) => {\n if (isInterrupt(text, key)) {\n testServerConnection.stopTestsNoReply({});\n return 'done';\n }\n });\n\n await testServerConnection.runTests({\n grep: watchOptions.grep,\n testIds: options?.testIds,\n locations: watchOptions?.files,\n projects: watchOptions.projects,\n connectWsEndpoint,\n reuseContext: connectWsEndpoint ? true : undefined,\n workers: connectWsEndpoint ? 1 : undefined,\n headed: connectWsEndpoint ? true : undefined,\n }).finally(() => waitForDone.dispose());\n}\n\nfunction readCommand() {\n return readKeyPress<Command>((text: string, key: any) => {\n if (isInterrupt(text, key))\n return 'interrupted';\n if (process.platform !== 'win32' && key && key.ctrl && key.name === 'z') {\n process.kill(process.ppid, 'SIGTSTP');\n process.kill(process.pid, 'SIGTSTP');\n }\n const name = key?.name;\n if (name === 'q')\n return 'exit';\n\n if (name === 'h') {\n process.stdout.write(`${separator(terminalScreen)}\nRun tests\n ${colors.bold('enter')} ${colors.dim('run tests')}\n ${colors.bold('f')} ${colors.dim('run failed tests')}\n ${colors.bold('r')} ${colors.dim('repeat last run')}\n ${colors.bold('q')} ${colors.dim('quit')}\n\nChange settings\n ${colors.bold('c')} ${colors.dim('set project')}\n ${colors.bold('p')} ${colors.dim('set file filter')}\n ${colors.bold('t')} ${colors.dim('set title filter')}\n ${colors.bold('s')} ${colors.dim('toggle show & reuse the browser')}\n ${colors.bold('b')} ${colors.dim('toggle buffer mode')}\n`);\n return;\n }\n\n switch (name) {\n case 'return': return 'run';\n case 'r': return 'repeat';\n case 'c': return 'project';\n case 'p': return 'file';\n case 't': return 'grep';\n case 'f': return 'failed';\n case 's': return 'toggle-show-browser';\n case 'b': return 'toggle-buffer-mode';\n }\n });\n}\n\nlet showBrowserServer: PlaywrightServer | undefined;\nlet connectWsEndpoint: string | undefined = undefined;\nlet seq = 1;\n\nfunction printConfiguration(options: WatchModeOptions, title?: string) {\n const packageManagerCommand = getPackageManagerExecCommand();\n const tokens: string[] = [];\n tokens.push(`${packageManagerCommand} playwright test`);\n if (options.projects)\n tokens.push(...options.projects.map(p => colors.blue(`--project ${p}`)));\n if (options.grep)\n tokens.push(colors.red(`--grep ${options.grep}`));\n if (options.files)\n tokens.push(...options.files.map(a => colors.bold(a)));\n if (title)\n tokens.push(colors.dim(`(${title})`));\n tokens.push(colors.dim(`#${seq++}`));\n const lines: string[] = [];\n const sep = separator(terminalScreen);\n lines.push('\\x1Bc' + sep);\n lines.push(`${tokens.join(' ')}`);\n lines.push(`${colors.dim('Show & reuse browser:')} ${colors.bold(showBrowserServer ? 'on' : 'off')}`);\n process.stdout.write(lines.join('\\n'));\n}\n\nfunction printBufferPrompt(dirtyTestFiles: Set<string>, rootDir: string) {\n const sep = separator(terminalScreen);\n process.stdout.write('\\x1Bc');\n process.stdout.write(`${sep}\\n`);\n\n if (dirtyTestFiles.size === 0) {\n process.stdout.write(`${colors.dim('Waiting for file changes. Press')} ${colors.bold('q')} ${colors.dim('to quit or')} ${colors.bold('h')} ${colors.dim('for more options.')}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${colors.dim(`${dirtyTestFiles.size} test ${dirtyTestFiles.size === 1 ? 'file' : 'files'} changed:`)}\\n\\n`);\n for (const file of dirtyTestFiles)\n process.stdout.write(` \u00B7 ${path.relative(rootDir, file)}\\n`);\n process.stdout.write(`\\n${colors.dim(`Press`)} ${colors.bold('enter')} ${colors.dim('to run')}, ${colors.bold('q')} ${colors.dim('to quit or')} ${colors.bold('h')} ${colors.dim('for more options.')}\\n\\n`);\n}\n\nfunction printPrompt() {\n const sep = separator(terminalScreen);\n process.stdout.write(`\n${sep}\n${colors.dim('Waiting for file changes. Press')} ${colors.bold('enter')} ${colors.dim('to run tests')}, ${colors.bold('q')} ${colors.dim('to quit or')} ${colors.bold('h')} ${colors.dim('for more options.')}\n`);\n}\n\nasync function toggleShowBrowser() {\n if (!showBrowserServer) {\n showBrowserServer = new PlaywrightServer({ mode: 'extension', path: '/' + createGuid(), maxConnections: 1 });\n connectWsEndpoint = await showBrowserServer.listen();\n process.stdout.write(`${colors.dim('Show & reuse browser:')} ${colors.bold('on')}\\n`);\n } else {\n await showBrowserServer?.close();\n showBrowserServer = undefined;\n connectWsEndpoint = undefined;\n process.stdout.write(`${colors.dim('Show & reuse browser:')} ${colors.bold('off')}\\n`);\n }\n}\n\ntype Command = 'run' | 'failed' | 'repeat' | 'changed' | 'project' | 'file' | 'grep' | 'exit' | 'interrupted' | 'toggle-show-browser' | 'toggle-buffer-mode';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_utils", "result", "path", "report", "readline"]
|
|
7
|
+
}
|
package/lib/runner/workerHost.js
CHANGED
|
@@ -61,6 +61,9 @@ class WorkerHost extends import_processHost.ProcessHost {
|
|
|
61
61
|
pauseAtEnd: options.pauseAtEnd
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
|
+
artifactsDir() {
|
|
65
|
+
return this._params.artifactsDir;
|
|
66
|
+
}
|
|
64
67
|
async start() {
|
|
65
68
|
await import_fs.default.promises.mkdir(this._params.artifactsDir, { recursive: true });
|
|
66
69
|
return await this.startRunner(this._params, {
|
|
@@ -82,6 +85,9 @@ class WorkerHost extends import_processHost.ProcessHost {
|
|
|
82
85
|
async sendCustomMessage(payload) {
|
|
83
86
|
return await this.sendMessage({ method: "customMessage", params: payload });
|
|
84
87
|
}
|
|
88
|
+
sendResume(payload) {
|
|
89
|
+
this.sendMessageNoReply({ method: "resume", params: payload });
|
|
90
|
+
}
|
|
85
91
|
hash() {
|
|
86
92
|
return this._hash;
|
|
87
93
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runner/workerHost.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { removeFolders } from 'playwright-core/lib/utils';\n\nimport { ProcessHost } from './processHost';\nimport { stdioChunkToParams } from '../common/ipc';\nimport { artifactsFolderName } from '../isomorphic/folders';\n\nimport type { TestGroup } from './testGroups';\nimport type { CustomMessageRequestPayload, CustomMessageResponsePayload, RunPayload, SerializedConfig, WorkerInitParams } from '../common/ipc';\n\n\nlet lastWorkerIndex = 0;\n\ntype WorkerHostOptions = {\n parallelIndex: number;\n config: SerializedConfig;\n extraEnv: Record<string, string | undefined>;\n outputDir: string;\n pauseOnError: boolean;\n pauseAtEnd: boolean;\n};\n\nexport class WorkerHost extends ProcessHost {\n readonly parallelIndex: number;\n readonly workerIndex: number;\n private _hash: string;\n private _params: WorkerInitParams;\n private _didFail = false;\n\n constructor(testGroup: TestGroup, options: WorkerHostOptions) {\n const workerIndex = lastWorkerIndex++;\n super(require.resolve('../worker/workerMain.js'), `worker-${workerIndex}`, {\n ...options.extraEnv,\n FORCE_COLOR: '1',\n DEBUG_COLORS: process.env.DEBUG_COLORS === undefined ? '1' : process.env.DEBUG_COLORS,\n });\n this.workerIndex = workerIndex;\n this.parallelIndex = options.parallelIndex;\n this._hash = testGroup.workerHash;\n\n this._params = {\n workerIndex: this.workerIndex,\n parallelIndex: options.parallelIndex,\n repeatEachIndex: testGroup.repeatEachIndex,\n projectId: testGroup.projectId,\n config: options.config,\n artifactsDir: path.join(options.outputDir, artifactsFolderName(workerIndex)),\n pauseOnError: options.pauseOnError,\n pauseAtEnd: options.pauseAtEnd,\n };\n }\n\n async start() {\n await fs.promises.mkdir(this._params.artifactsDir, { recursive: true });\n return await this.startRunner(this._params, {\n onStdOut: chunk => this.emit('stdOut', stdioChunkToParams(chunk)),\n onStdErr: chunk => this.emit('stdErr', stdioChunkToParams(chunk)),\n });\n }\n\n override async onExit() {\n await removeFolders([this._params.artifactsDir]);\n }\n\n override async stop(didFail?: boolean) {\n if (didFail)\n this._didFail = true;\n await super.stop();\n }\n\n runTestGroup(runPayload: RunPayload) {\n this.sendMessageNoReply({ method: 'runTestGroup', params: runPayload });\n }\n\n async sendCustomMessage(payload: CustomMessageRequestPayload) {\n return await this.sendMessage({ method: 'customMessage', params: payload }) as CustomMessageResponsePayload;\n }\n\n hash() {\n return this._hash;\n }\n\n projectId() {\n return this._params.projectId;\n }\n\n didFail() {\n return this._didFail;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,gBAAe;AACf,kBAAiB;AAEjB,mBAA8B;AAE9B,yBAA4B;AAC5B,iBAAmC;AACnC,qBAAoC;AAMpC,IAAI,kBAAkB;AAWf,MAAM,mBAAmB,+BAAY;AAAA,EAO1C,YAAY,WAAsB,SAA4B;AAC5D,UAAM,cAAc;AACpB,UAAM,gBAAgB,yBAAyB,GAAG,UAAU,WAAW,IAAI;AAAA,MACzE,GAAG,QAAQ;AAAA,MACX,aAAa;AAAA,MACb,cAAc,QAAQ,IAAI,iBAAiB,SAAY,MAAM,QAAQ,IAAI;AAAA,IAC3E,CAAC;AARH,SAAQ,WAAW;AASjB,SAAK,cAAc;AACnB,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,QAAQ,UAAU;AAEvB,SAAK,UAAU;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,eAAe,QAAQ;AAAA,MACvB,iBAAiB,UAAU;AAAA,MAC3B,WAAW,UAAU;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,cAAc,YAAAA,QAAK,KAAK,QAAQ,eAAW,oCAAoB,WAAW,CAAC;AAAA,MAC3E,cAAc,QAAQ;AAAA,MACtB,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,UAAAC,QAAG,SAAS,MAAM,KAAK,QAAQ,cAAc,EAAE,WAAW,KAAK,CAAC;AACtE,WAAO,MAAM,KAAK,YAAY,KAAK,SAAS;AAAA,MAC1C,UAAU,WAAS,KAAK,KAAK,cAAU,+BAAmB,KAAK,CAAC;AAAA,MAChE,UAAU,WAAS,KAAK,KAAK,cAAU,+BAAmB,KAAK,CAAC;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EAEA,MAAe,SAAS;AACtB,cAAM,4BAAc,CAAC,KAAK,QAAQ,YAAY,CAAC;AAAA,EACjD;AAAA,EAEA,MAAe,KAAK,SAAmB;AACrC,QAAI;AACF,WAAK,WAAW;AAClB,UAAM,MAAM,KAAK;AAAA,EACnB;AAAA,EAEA,aAAa,YAAwB;AACnC,SAAK,mBAAmB,EAAE,QAAQ,gBAAgB,QAAQ,WAAW,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,kBAAkB,SAAsC;AAC5D,WAAO,MAAM,KAAK,YAAY,EAAE,QAAQ,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEA,OAAO;AACL,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY;AACV,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,UAAU;AACR,WAAO,KAAK;AAAA,EACd;AACF;",
|
|
6
|
+
"names": ["path", "fs"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/third_party/pirates.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * MIT License\n *\n * Copyright (c) 2016-2018 Ari Porad\n * Modifications copyright (c) Microsoft Corporation.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport Module from 'module';\nimport path from 'path';\n\nexport function addHook(transformHook: (code: string, filename: string) => string, shouldTransform: (filename: string) => boolean, extensions: string[]) {\n // This is a shortened and slightly changed version of https://github.com/danez/pirates.\n //\n // We cannot use pirates directly due to https://github.com/microsoft/playwright/issues/35812.\n // If we overwrite the '.cjs', the following code does not run because there is a custom loader defined:\n // https://github.com/nodejs/node/blob/b1973550e09d5a2a07c70be5de6e3ae4722ad230/lib/internal/modules/esm/translators.js#L397-L403\n //\n // Here we rely on the default '.js' loader to handle '.cjs' files.\n const extensionsToOverwrite = extensions.filter(e => e !== '.cjs');\n const allSupportedExtensions = new Set(extensions);\n const loaders = (Module as any)._extensions;\n const jsLoader = loaders['.js'];\n for (const extension of extensionsToOverwrite) {\n const originalLoader = loaders[extension] || jsLoader;\n function newLoader(this: any, mod: any, filename: string, ...loaderArgs: any[]) {\n if (allSupportedExtensions.has(path.extname(filename)) && shouldTransform(filename)) {\n const oldCompile = mod._compile;\n function newCompile(this: any, code: string, file: string, ...ignoredArgs: any[]) {\n // Note: we do not pass |args| downstream to make sure \"esm modules\" loaded through here\n // are treated as \"commonjs\", for example for \".mjs\" files.\n // In theory, we should fix this, but it is a breaking change, even for playwright's own tests.\n mod._compile = oldCompile;\n return oldCompile.call(this, transformHook(code, filename), file);\n }\n mod._compile = newCompile;\n }\n originalLoader.call(this, mod, filename, ...loaderArgs);\n }\n loaders[extension] = newLoader;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBA,oBAAmB;AACnB,kBAAiB;AAEV,SAAS,QAAQ,eAA2D,iBAAgD,YAAsB;AAQvJ,QAAM,wBAAwB,WAAW,OAAO,OAAK,MAAM,MAAM;AACjE,QAAM,yBAAyB,IAAI,IAAI,UAAU;AACjD,QAAM,UAAW,cAAAA,QAAe;AAChC,QAAM,WAAW,QAAQ,KAAK;AAC9B,aAAW,aAAa,uBAAuB;AAE7C,QAASC,aAAT,SAA8B,KAAU,aAAqB,YAAmB;AAC9E,UAAI,uBAAuB,IAAI,YAAAC,QAAK,QAAQ,QAAQ,CAAC,KAAK,gBAAgB,QAAQ,GAAG;AAEnF,YAASC,cAAT,SAA+B,MAAc,SAAiB,aAAoB;AAIhF,cAAI,WAAW;AACf,iBAAO,WAAW,KAAK,MAAM,cAAc,MAAM,QAAQ,GAAG,IAAI;AAAA,QAClE;AANS,yBAAAA;AADT,cAAM,aAAa,IAAI;AAQvB,YAAI,WAAWA;AAAA,MACjB;AACA,qBAAe,KAAK,MAAM,KAAK,UAAU,GAAG,UAAU;AAAA,IACxD;AAbS,oBAAAF;AADT,UAAM,iBAAiB,QAAQ,SAAS,KAAK;AAe7C,YAAQ,SAAS,IAAIA;AAAA,EACvB;AACF;",
|
|
6
|
+
"names": ["Module", "newLoader", "path", "newCompile"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/third_party/tsconfig-loader.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Jonas Kello\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/* eslint-disable */\n\nimport path from 'path';\nimport fs from 'fs';\nimport { json5 } from '../utilsBundle';\n\n/**\n * Typing for the parts of tsconfig that we care about\n */\ninterface TsConfig {\n extends?: string;\n compilerOptions?: {\n baseUrl?: string;\n paths?: { [key: string]: Array<string> };\n strict?: boolean;\n allowJs?: boolean;\n };\n references?: { path: string }[];\n}\n\nexport interface LoadedTsConfig {\n tsConfigPath: string;\n paths?: {\n mapping: { [key: string]: Array<string> };\n pathsBasePath: string; // absolute path\n };\n absoluteBaseUrl?: string;\n allowJs?: boolean;\n}\n\nexport function loadTsConfig(configPath: string): LoadedTsConfig[] {\n try {\n const references: LoadedTsConfig[] = [];\n const config = innerLoadTsConfig(configPath, references);\n return [config, ...references];\n } catch (e) {\n throw new Error(`Failed to load tsconfig file at ${configPath}:\\n${e.message}`);\n }\n}\n\nfunction resolveConfigFile(baseConfigFile: string, referencedConfigFile: string) {\n if (!referencedConfigFile.endsWith('.json'))\n referencedConfigFile += '.json';\n const currentDir = path.dirname(baseConfigFile);\n let resolvedConfigFile = path.resolve(currentDir, referencedConfigFile);\n // TODO: I don't see how this makes sense, delete in the next minor release.\n if (referencedConfigFile.includes('/') && referencedConfigFile.includes('.') && !fs.existsSync(resolvedConfigFile))\n resolvedConfigFile = path.join(currentDir, 'node_modules', referencedConfigFile);\n return resolvedConfigFile;\n}\n\nfunction innerLoadTsConfig(\n configFilePath: string,\n references: LoadedTsConfig[],\n visited = new Map<string, LoadedTsConfig>(),\n): LoadedTsConfig {\n if (visited.has(configFilePath))\n return visited.get(configFilePath)!;\n\n let result: LoadedTsConfig = {\n tsConfigPath: configFilePath,\n };\n // Retain result instance below, so that caching works.\n visited.set(configFilePath, result);\n\n if (!fs.existsSync(configFilePath))\n return result;\n\n const configString = fs.readFileSync(configFilePath, 'utf-8');\n const cleanedJson = StripBom(configString);\n const parsedConfig: TsConfig = json5.parse(cleanedJson);\n\n const extendsArray = Array.isArray(parsedConfig.extends) ? parsedConfig.extends : (parsedConfig.extends ? [parsedConfig.extends] : []);\n for (const extendedConfig of extendsArray) {\n const extendedConfigPath = resolveConfigFile(configFilePath, extendedConfig);\n const base = innerLoadTsConfig(extendedConfigPath, references, visited);\n // Retain result instance, so that caching works.\n Object.assign(result, base, { tsConfigPath: configFilePath });\n }\n\n if (parsedConfig.compilerOptions?.allowJs !== undefined)\n result.allowJs = parsedConfig.compilerOptions.allowJs;\n if (parsedConfig.compilerOptions?.paths !== undefined) {\n // We must store pathsBasePath from the config that defines \"paths\" and later resolve\n // based on this absolute path, when no \"baseUrl\" is specified. See tsc for reference:\n // https://github.com/microsoft/TypeScript/blob/353ccb7688351ae33ccf6e0acb913aa30621eaf4/src/compiler/commandLineParser.ts#L3129\n // https://github.com/microsoft/TypeScript/blob/353ccb7688351ae33ccf6e0acb913aa30621eaf4/src/compiler/moduleSpecifiers.ts#L510\n result.paths = {\n mapping: parsedConfig.compilerOptions.paths,\n pathsBasePath: path.dirname(configFilePath),\n };\n }\n if (parsedConfig.compilerOptions?.baseUrl !== undefined) {\n // Follow tsc and resolve all relative file paths in the config right away.\n // This way it is safe to inherit paths between the configs.\n result.absoluteBaseUrl = path.resolve(path.dirname(configFilePath), parsedConfig.compilerOptions.baseUrl);\n }\n\n for (const ref of parsedConfig.references || [])\n references.push(innerLoadTsConfig(resolveConfigFile(configFilePath, ref.path), references, visited));\n\n if (path.basename(configFilePath) === 'jsconfig.json' && result.allowJs === undefined)\n result.allowJs = true;\n return result;\n}\n\nfunction StripBom(string: string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a string, got ${typeof string}`);\n\t}\n\n\t// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string\n\t// conversion translates it to FEFF (UTF-16 BOM).\n\tif (string.charCodeAt(0) === 0xFEFF) {\n\t\treturn string.slice(1);\n\t}\n\n\treturn string;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BA,kBAAiB;AACjB,gBAAe;AACf,yBAAsB;AA0Bf,SAAS,aAAa,YAAsC;AACjE,MAAI;AACF,UAAM,aAA+B,CAAC;AACtC,UAAM,SAAS,kBAAkB,YAAY,UAAU;AACvD,WAAO,CAAC,QAAQ,GAAG,UAAU;AAAA,EAC/B,SAAS,GAAG;AACV,UAAM,IAAI,MAAM,mCAAmC,UAAU;AAAA,EAAM,EAAE,OAAO,EAAE;AAAA,EAChF;AACF;AAEA,SAAS,kBAAkB,gBAAwB,sBAA8B;AAC/E,MAAI,CAAC,qBAAqB,SAAS,OAAO;AACxC,4BAAwB;AAC1B,QAAM,aAAa,YAAAA,QAAK,QAAQ,cAAc;AAC9C,MAAI,qBAAqB,YAAAA,QAAK,QAAQ,YAAY,oBAAoB;AAEtE,MAAI,qBAAqB,SAAS,GAAG,KAAK,qBAAqB,SAAS,GAAG,KAAK,CAAC,UAAAC,QAAG,WAAW,kBAAkB;AAC/G,yBAAqB,YAAAD,QAAK,KAAK,YAAY,gBAAgB,oBAAoB;AACjF,SAAO;AACT;AAEA,SAAS,kBACP,gBACA,YACA,UAAU,oBAAI,IAA4B,GAC1B;AAChB,MAAI,QAAQ,IAAI,cAAc;AAC5B,WAAO,QAAQ,IAAI,cAAc;AAEnC,MAAI,SAAyB;AAAA,IAC3B,cAAc;AAAA,EAChB;AAEA,UAAQ,IAAI,gBAAgB,MAAM;AAElC,MAAI,CAAC,UAAAC,QAAG,WAAW,cAAc;AAC/B,WAAO;AAET,QAAM,eAAe,UAAAA,QAAG,aAAa,gBAAgB,OAAO;AAC5D,QAAM,cAAc,SAAS,YAAY;AACzC,QAAM,eAAyB,yBAAM,MAAM,WAAW;AAEtD,QAAM,eAAe,MAAM,QAAQ,aAAa,OAAO,IAAI,aAAa,UAAW,aAAa,UAAU,CAAC,aAAa,OAAO,IAAI,CAAC;AACpI,aAAW,kBAAkB,cAAc;AACzC,UAAM,qBAAqB,kBAAkB,gBAAgB,cAAc;AAC3E,UAAM,OAAO,kBAAkB,oBAAoB,YAAY,OAAO;AAEtE,WAAO,OAAO,QAAQ,MAAM,EAAE,cAAc,eAAe,CAAC;AAAA,EAC9D;AAEA,MAAI,aAAa,iBAAiB,YAAY;AAC5C,WAAO,UAAU,aAAa,gBAAgB;AAChD,MAAI,aAAa,iBAAiB,UAAU,QAAW;AAKrD,WAAO,QAAQ;AAAA,MACb,SAAS,aAAa,gBAAgB;AAAA,MACtC,eAAe,YAAAD,QAAK,QAAQ,cAAc;AAAA,IAC5C;AAAA,EACF;AACA,MAAI,aAAa,iBAAiB,YAAY,QAAW;AAGvD,WAAO,kBAAkB,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,cAAc,GAAG,aAAa,gBAAgB,OAAO;AAAA,EAC1G;AAEA,aAAW,OAAO,aAAa,cAAc,CAAC;AAC5C,eAAW,KAAK,kBAAkB,kBAAkB,gBAAgB,IAAI,IAAI,GAAG,YAAY,OAAO,CAAC;AAErG,MAAI,YAAAA,QAAK,SAAS,cAAc,MAAM,mBAAmB,OAAO,YAAY;AAC1E,WAAO,UAAU;AACnB,SAAO;AACT;AAEA,SAAS,SAAS,QAAgB;AACjC,MAAI,OAAO,WAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,0BAA0B,OAAO,MAAM,EAAE;AAAA,EAC9D;AAIA,MAAI,OAAO,WAAW,CAAC,MAAM,OAAQ;AACpC,WAAO,OAAO,MAAM,CAAC;AAAA,EACtB;AAEA,SAAO;AACR;",
|
|
6
|
+
"names": ["path", "fs"]
|
|
7
|
+
}
|
|
@@ -22,6 +22,7 @@ __export(babelBundle_exports, {
|
|
|
22
22
|
babelTransform: () => babelTransform,
|
|
23
23
|
codeFrameColumns: () => codeFrameColumns,
|
|
24
24
|
declare: () => declare,
|
|
25
|
+
genMapping: () => genMapping,
|
|
25
26
|
traverse: () => traverse,
|
|
26
27
|
types: () => types
|
|
27
28
|
});
|
|
@@ -32,12 +33,14 @@ const types = require("./babelBundleImpl").types;
|
|
|
32
33
|
const traverse = require("./babelBundleImpl").traverse;
|
|
33
34
|
const babelTransform = require("./babelBundleImpl").babelTransform;
|
|
34
35
|
const babelParse = require("./babelBundleImpl").babelParse;
|
|
36
|
+
const genMapping = require("./babelBundleImpl").genMapping;
|
|
35
37
|
// Annotate the CommonJS export names for ESM import in node:
|
|
36
38
|
0 && (module.exports = {
|
|
37
39
|
babelParse,
|
|
38
40
|
babelTransform,
|
|
39
41
|
codeFrameColumns,
|
|
40
42
|
declare,
|
|
43
|
+
genMapping,
|
|
41
44
|
traverse,
|
|
42
45
|
types
|
|
43
46
|
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/transform/babelBundle.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { BabelFileResult, ParseResult } from '../../bundles/babel/node_modules/@types/babel__core';\nexport const codeFrameColumns: typeof import('../../bundles/babel/node_modules/@types/babel__code-frame').codeFrameColumns = require('./babelBundleImpl').codeFrameColumns;\nexport const declare: typeof import('../../bundles/babel/node_modules/@types/babel__helper-plugin-utils').declare = require('./babelBundleImpl').declare;\nexport const types: typeof import('../../bundles/babel/node_modules/@types/babel__core').types = require('./babelBundleImpl').types;\nexport const traverse: typeof import('../../bundles/babel/node_modules/@types/babel__traverse').default = require('./babelBundleImpl').traverse;\nexport type BabelPlugin = [string, any?];\nexport type BabelTransformFunction = (code: string, filename: string, isModule: boolean, pluginsPrefix: BabelPlugin[], pluginsSuffix: BabelPlugin[]) => BabelFileResult | null;\nexport const babelTransform: BabelTransformFunction = require('./babelBundleImpl').babelTransform;\nexport type BabelParseFunction = (code: string, filename: string, isModule: boolean) => ParseResult;\nexport const babelParse: BabelParseFunction = require('./babelBundleImpl').babelParse;\nexport type { NodePath, PluginObj, types as T } from '../../bundles/babel/node_modules/@types/babel__core';\nexport type { BabelAPI } from '../../bundles/babel/node_modules/@types/babel__helper-plugin-utils';\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBO,MAAM,mBAAgH,QAAQ,mBAAmB,EAAE;AACnJ,MAAM,UAAuG,QAAQ,mBAAmB,EAAE;AAC1I,MAAM,QAAoF,QAAQ,mBAAmB,EAAE;AACvH,MAAM,WAA6F,QAAQ,mBAAmB,EAAE;AAGhI,MAAM,iBAAyC,QAAQ,mBAAmB,EAAE;AAE5E,MAAM,aAAiC,QAAQ,mBAAmB,EAAE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|