@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
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var agentParser_exports = {};
|
|
30
|
+
__export(agentParser_exports, {
|
|
31
|
+
parseAgentSpec: () => parseAgentSpec
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(agentParser_exports);
|
|
34
|
+
var import_fs = __toESM(require("fs"));
|
|
35
|
+
var import_utilsBundle = require("playwright-core/lib/utilsBundle");
|
|
36
|
+
async function parseAgentSpec(filePath) {
|
|
37
|
+
const source = await import_fs.default.promises.readFile(filePath, "utf-8");
|
|
38
|
+
const { header, content } = extractYamlAndContent(source);
|
|
39
|
+
const { instructions, examples } = extractInstructionsAndExamples(content);
|
|
40
|
+
return {
|
|
41
|
+
...header,
|
|
42
|
+
instructions,
|
|
43
|
+
examples
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function extractYamlAndContent(markdown) {
|
|
47
|
+
const lines = markdown.split("\n");
|
|
48
|
+
if (lines[0] !== "---")
|
|
49
|
+
throw new Error("Markdown file must start with YAML front matter (---)");
|
|
50
|
+
let yamlEndIndex = -1;
|
|
51
|
+
for (let i = 1; i < lines.length; i++) {
|
|
52
|
+
if (lines[i] === "---") {
|
|
53
|
+
yamlEndIndex = i;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (yamlEndIndex === -1)
|
|
58
|
+
throw new Error("YAML front matter must be closed with ---");
|
|
59
|
+
const yamlLines = lines.slice(1, yamlEndIndex);
|
|
60
|
+
const yamlRaw = yamlLines.join("\n");
|
|
61
|
+
const contentLines = lines.slice(yamlEndIndex + 1);
|
|
62
|
+
const content = contentLines.join("\n");
|
|
63
|
+
let header;
|
|
64
|
+
try {
|
|
65
|
+
header = import_utilsBundle.yaml.parse(yamlRaw);
|
|
66
|
+
} catch (error) {
|
|
67
|
+
throw new Error(`Failed to parse YAML header: ${error.message}`);
|
|
68
|
+
}
|
|
69
|
+
if (!header.name)
|
|
70
|
+
throw new Error('YAML header must contain a "name" field');
|
|
71
|
+
if (!header.description)
|
|
72
|
+
throw new Error('YAML header must contain a "description" field');
|
|
73
|
+
return { header, content };
|
|
74
|
+
}
|
|
75
|
+
function extractInstructionsAndExamples(content) {
|
|
76
|
+
const examples = [];
|
|
77
|
+
const instructions = content.split("<example>")[0].trim();
|
|
78
|
+
const exampleRegex = /<example>([\s\S]*?)<\/example>/g;
|
|
79
|
+
let match;
|
|
80
|
+
while ((match = exampleRegex.exec(content)) !== null) {
|
|
81
|
+
const example = match[1].trim();
|
|
82
|
+
examples.push(example.replace(/[\n]/g, " ").replace(/ +/g, " "));
|
|
83
|
+
}
|
|
84
|
+
return { instructions, examples };
|
|
85
|
+
}
|
|
86
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
87
|
+
0 && (module.exports = {
|
|
88
|
+
parseAgentSpec
|
|
89
|
+
});
|
|
@@ -39,67 +39,20 @@ var import_path = __toESM(require("path"));
|
|
|
39
39
|
var import_utilsBundle = require("playwright-core/lib/utilsBundle");
|
|
40
40
|
var import_utils = require("playwright-core/lib/utils");
|
|
41
41
|
var import_seed = require("../mcp/test/seed");
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
static async parseFile(filePath) {
|
|
48
|
-
const source = await import_fs.default.promises.readFile(filePath, "utf-8");
|
|
49
|
-
const { header, content } = this.extractYamlAndContent(source);
|
|
50
|
-
const { instructions, examples } = this.extractInstructionsAndExamples(content);
|
|
51
|
-
return { header, instructions, examples };
|
|
52
|
-
}
|
|
53
|
-
static extractYamlAndContent(markdown) {
|
|
54
|
-
const lines = markdown.split("\n");
|
|
55
|
-
if (lines[0] !== "---")
|
|
56
|
-
throw new Error("Markdown file must start with YAML front matter (---)");
|
|
57
|
-
let yamlEndIndex = -1;
|
|
58
|
-
for (let i = 1; i < lines.length; i++) {
|
|
59
|
-
if (lines[i] === "---") {
|
|
60
|
-
yamlEndIndex = i;
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (yamlEndIndex === -1)
|
|
65
|
-
throw new Error("YAML front matter must be closed with ---");
|
|
66
|
-
const yamlLines = lines.slice(1, yamlEndIndex);
|
|
67
|
-
const yamlRaw = yamlLines.join("\n");
|
|
68
|
-
const contentLines = lines.slice(yamlEndIndex + 1);
|
|
69
|
-
const content = contentLines.join("\n");
|
|
70
|
-
let header;
|
|
71
|
-
try {
|
|
72
|
-
header = import_utilsBundle.yaml.parse(yamlRaw);
|
|
73
|
-
} catch (error) {
|
|
74
|
-
throw new Error(`Failed to parse YAML header: ${error.message}`);
|
|
75
|
-
}
|
|
76
|
-
if (!header.name)
|
|
77
|
-
throw new Error('YAML header must contain a "name" field');
|
|
78
|
-
if (!header.description)
|
|
79
|
-
throw new Error('YAML header must contain a "description" field');
|
|
80
|
-
return { header, content };
|
|
81
|
-
}
|
|
82
|
-
static extractInstructionsAndExamples(content) {
|
|
83
|
-
const examples = [];
|
|
84
|
-
const instructions = content.split("<example>")[0].trim();
|
|
85
|
-
const exampleRegex = /<example>([\s\S]*?)<\/example>/g;
|
|
86
|
-
let match;
|
|
87
|
-
while ((match = exampleRegex.exec(content)) !== null) {
|
|
88
|
-
const example = match[1].trim();
|
|
89
|
-
examples.push(example.replace(/[\n]/g, " ").replace(/ +/g, " "));
|
|
90
|
-
}
|
|
91
|
-
return { instructions, examples };
|
|
92
|
-
}
|
|
42
|
+
var import_agentParser = require("./agentParser");
|
|
43
|
+
async function loadAgentSpecs() {
|
|
44
|
+
const files = await import_fs.default.promises.readdir(__dirname);
|
|
45
|
+
return Promise.all(files.filter((file) => file.endsWith(".agent.md")).map((file) => (0, import_agentParser.parseAgentSpec)(import_path.default.join(__dirname, file))));
|
|
93
46
|
}
|
|
94
47
|
class ClaudeGenerator {
|
|
95
48
|
static async init(config, projectName, prompts) {
|
|
96
49
|
await initRepo(config, projectName, {
|
|
97
50
|
promptsFolder: prompts ? ".claude/prompts" : void 0
|
|
98
51
|
});
|
|
99
|
-
const agents = await
|
|
52
|
+
const agents = await loadAgentSpecs();
|
|
100
53
|
await import_fs.default.promises.mkdir(".claude/agents", { recursive: true });
|
|
101
54
|
for (const agent of agents)
|
|
102
|
-
await writeFile(`.claude/agents/${agent.
|
|
55
|
+
await writeFile(`.claude/agents/${agent.name}.md`, ClaudeGenerator.agentSpec(agent), "\u{1F916}", "agent definition");
|
|
103
56
|
await writeFile(".mcp.json", JSON.stringify({
|
|
104
57
|
mcpServers: {
|
|
105
58
|
"playwright-test": {
|
|
@@ -124,11 +77,11 @@ class ClaudeGenerator {
|
|
|
124
77
|
const examples = agent.examples.length ? ` Examples: ${agent.examples.map((example) => `<example>${example}</example>`).join("")}` : "";
|
|
125
78
|
const lines = [];
|
|
126
79
|
const header = {
|
|
127
|
-
name: agent.
|
|
128
|
-
description: agent.
|
|
129
|
-
tools: agent.
|
|
130
|
-
model: agent.
|
|
131
|
-
color: agent.
|
|
80
|
+
name: agent.name,
|
|
81
|
+
description: agent.description + examples,
|
|
82
|
+
tools: agent.tools.map((tool) => asClaudeTool(tool)).join(", "),
|
|
83
|
+
model: agent.model,
|
|
84
|
+
color: agent.color
|
|
132
85
|
};
|
|
133
86
|
lines.push(`---`);
|
|
134
87
|
lines.push(import_utilsBundle.yaml.stringify(header, { lineWidth: 1e5 }) + `---`);
|
|
@@ -143,12 +96,12 @@ class OpencodeGenerator {
|
|
|
143
96
|
defaultAgentName: "Build",
|
|
144
97
|
promptsFolder: prompts ? ".opencode/prompts" : void 0
|
|
145
98
|
});
|
|
146
|
-
const agents = await
|
|
99
|
+
const agents = await loadAgentSpecs();
|
|
147
100
|
for (const agent of agents) {
|
|
148
101
|
const prompt = [agent.instructions];
|
|
149
102
|
prompt.push("");
|
|
150
103
|
prompt.push(...agent.examples.map((example) => `<example>${example}</example>`));
|
|
151
|
-
await writeFile(`.opencode/prompts/${agent.
|
|
104
|
+
await writeFile(`.opencode/prompts/${agent.name}.md`, prompt.join("\n"), "\u{1F916}", "agent definition");
|
|
152
105
|
}
|
|
153
106
|
await writeFile("opencode.json", OpencodeGenerator.configuration(agents), "\u{1F527}", "opencode configuration");
|
|
154
107
|
initRepoDone();
|
|
@@ -176,13 +129,13 @@ class OpencodeGenerator {
|
|
|
176
129
|
result["agent"] = {};
|
|
177
130
|
for (const agent of agents) {
|
|
178
131
|
const tools = {};
|
|
179
|
-
result["agent"][agent.
|
|
180
|
-
description: agent.
|
|
132
|
+
result["agent"][agent.name] = {
|
|
133
|
+
description: agent.description,
|
|
181
134
|
mode: "subagent",
|
|
182
|
-
prompt: `{file:.opencode/prompts/${agent.
|
|
135
|
+
prompt: `{file:.opencode/prompts/${agent.name}.md}`,
|
|
183
136
|
tools
|
|
184
137
|
};
|
|
185
|
-
for (const tool of agent.
|
|
138
|
+
for (const tool of agent.tools)
|
|
186
139
|
asOpencodeTool(tools, tool);
|
|
187
140
|
}
|
|
188
141
|
result["mcp"]["playwright-test"] = {
|
|
@@ -200,10 +153,10 @@ class CopilotGenerator {
|
|
|
200
153
|
promptsFolder: prompts ? ".github/prompts" : void 0,
|
|
201
154
|
promptSuffix: "prompt"
|
|
202
155
|
});
|
|
203
|
-
const agents = await
|
|
156
|
+
const agents = await loadAgentSpecs();
|
|
204
157
|
await import_fs.default.promises.mkdir(".github/agents", { recursive: true });
|
|
205
158
|
for (const agent of agents)
|
|
206
|
-
await writeFile(`.github/agents/${agent.
|
|
159
|
+
await writeFile(`.github/agents/${agent.name}.agent.md`, CopilotGenerator.agentSpec(agent), "\u{1F916}", "agent definition");
|
|
207
160
|
await deleteFile(`.github/chatmodes/ \u{1F3AD} planner.chatmode.md`, "legacy planner chatmode");
|
|
208
161
|
await deleteFile(`.github/chatmodes/\u{1F3AD} generator.chatmode.md`, "legacy generator chatmode");
|
|
209
162
|
await deleteFile(`.github/chatmodes/\u{1F3AD} healer.chatmode.md`, "legacy healer chatmode");
|
|
@@ -228,14 +181,14 @@ class CopilotGenerator {
|
|
|
228
181
|
const examples = agent.examples.length ? ` Examples: ${agent.examples.map((example) => `<example>${example}</example>`).join("")}` : "";
|
|
229
182
|
const lines = [];
|
|
230
183
|
const header = {
|
|
231
|
-
"name": agent.
|
|
232
|
-
"description": agent.
|
|
233
|
-
"tools": agent.
|
|
184
|
+
"name": agent.name,
|
|
185
|
+
"description": agent.description + examples,
|
|
186
|
+
"tools": agent.tools,
|
|
234
187
|
"model": "Claude Sonnet 4",
|
|
235
188
|
"mcp-servers": CopilotGenerator.mcpServers
|
|
236
189
|
};
|
|
237
190
|
lines.push(`---`);
|
|
238
|
-
lines.push(import_utilsBundle.yaml.stringify(header) + `---`);
|
|
191
|
+
lines.push(import_utilsBundle.yaml.stringify(header, { lineWidth: 1e5 }) + `---`);
|
|
239
192
|
lines.push("");
|
|
240
193
|
lines.push(agent.instructions);
|
|
241
194
|
lines.push("");
|
|
@@ -260,7 +213,7 @@ class VSCodeGenerator {
|
|
|
260
213
|
await initRepo(config, projectName, {
|
|
261
214
|
promptsFolder: void 0
|
|
262
215
|
});
|
|
263
|
-
const agents = await
|
|
216
|
+
const agents = await loadAgentSpecs();
|
|
264
217
|
const nameMap = /* @__PURE__ */ new Map([
|
|
265
218
|
["playwright-test-planner", " \u{1F3AD} planner"],
|
|
266
219
|
["playwright-test-generator", "\u{1F3AD} generator"],
|
|
@@ -268,7 +221,7 @@ class VSCodeGenerator {
|
|
|
268
221
|
]);
|
|
269
222
|
await import_fs.default.promises.mkdir(".github/chatmodes", { recursive: true });
|
|
270
223
|
for (const agent of agents)
|
|
271
|
-
await writeFile(`.github/chatmodes/${nameMap.get(agent.
|
|
224
|
+
await writeFile(`.github/chatmodes/${nameMap.get(agent.name)}.chatmode.md`, VSCodeGenerator.agentSpec(agent), "\u{1F916}", "chatmode definition");
|
|
272
225
|
await VSCodeGenerator.appendToMCPJson();
|
|
273
226
|
initRepoDone();
|
|
274
227
|
}
|
|
@@ -307,7 +260,7 @@ class VSCodeGenerator {
|
|
|
307
260
|
return `${vscodeMcpName}/${second}`;
|
|
308
261
|
return vscodeToolMap.get(first) || first;
|
|
309
262
|
}
|
|
310
|
-
const tools = agent.
|
|
263
|
+
const tools = agent.tools.map(asVscodeTool).flat().sort((a, b) => {
|
|
311
264
|
const indexA = vscodeToolsOrder.indexOf(a);
|
|
312
265
|
const indexB = vscodeToolsOrder.indexOf(b);
|
|
313
266
|
if (indexA === -1 && indexB === -1)
|
|
@@ -320,7 +273,7 @@ class VSCodeGenerator {
|
|
|
320
273
|
}).map((tool) => `'${tool}'`).join(", ");
|
|
321
274
|
const lines = [];
|
|
322
275
|
lines.push(`---`);
|
|
323
|
-
lines.push(`description: ${agent.
|
|
276
|
+
lines.push(`description: ${agent.description}.`);
|
|
324
277
|
lines.push(`tools: [${tools}]`);
|
|
325
278
|
lines.push(`---`);
|
|
326
279
|
lines.push("");
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/agents/generateAgents.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 { colors, yaml } from 'playwright-core/lib/utilsBundle';\nimport { mkdirIfNeeded } from 'playwright-core/lib/utils';\n\nimport { FullConfigInternal } from '../common/config';\nimport { defaultSeedFile, findSeedFile, seedFileContent, seedProject } from '../mcp/test/seed';\n\ninterface AgentHeader {\n name: string;\n description: string;\n model: string;\n color: string;\n tools: string[];\n}\n\ninterface Agent {\n header: AgentHeader;\n instructions: string;\n examples: string[];\n}\n\n/* eslint-disable no-console */\n\nclass AgentParser {\n static async loadAgents(): Promise<Agent[]> {\n const files = await fs.promises.readdir(__dirname);\n return Promise.all(files.filter(file => file.endsWith('.agent.md')).map(file => AgentParser.parseFile(path.join(__dirname, file))));\n }\n\n static async parseFile(filePath: string): Promise<Agent> {\n const source = await fs.promises.readFile(filePath, 'utf-8');\n const { header, content } = this.extractYamlAndContent(source);\n const { instructions, examples } = this.extractInstructionsAndExamples(content);\n return { header, instructions, examples };\n }\n\n static extractYamlAndContent(markdown: string): { header: AgentHeader; content: string } {\n const lines = markdown.split('\\n');\n\n if (lines[0] !== '---')\n throw new Error('Markdown file must start with YAML front matter (---)');\n\n let yamlEndIndex = -1;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i] === '---') {\n yamlEndIndex = i;\n break;\n }\n }\n\n if (yamlEndIndex === -1)\n throw new Error('YAML front matter must be closed with ---');\n\n const yamlLines = lines.slice(1, yamlEndIndex);\n const yamlRaw = yamlLines.join('\\n');\n const contentLines = lines.slice(yamlEndIndex + 1);\n const content = contentLines.join('\\n');\n\n let header: AgentHeader;\n try {\n header = yaml.parse(yamlRaw) as AgentHeader;\n } catch (error: any) {\n throw new Error(`Failed to parse YAML header: ${error.message}`);\n }\n\n if (!header.name)\n throw new Error('YAML header must contain a \"name\" field');\n\n if (!header.description)\n throw new Error('YAML header must contain a \"description\" field');\n\n return { header, content };\n }\n\n static extractInstructionsAndExamples(content: string): { instructions: string; examples: string[] } {\n const examples: string[] = [];\n\n const instructions = content.split('<example>')[0].trim();\n const exampleRegex = /<example>([\\s\\S]*?)<\\/example>/g;\n let match: RegExpExecArray | null;\n\n while ((match = exampleRegex.exec(content)) !== null) {\n const example = match[1].trim();\n examples.push(example.replace(/[\\n]/g, ' ').replace(/ +/g, ' '));\n }\n\n return { instructions, examples };\n }\n}\n\nexport class ClaudeGenerator {\n static async init(config: FullConfigInternal, projectName: string, prompts: boolean) {\n await initRepo(config, projectName, {\n promptsFolder: prompts ? '.claude/prompts' : undefined,\n });\n\n const agents = await AgentParser.loadAgents();\n\n await fs.promises.mkdir('.claude/agents', { recursive: true });\n for (const agent of agents)\n await writeFile(`.claude/agents/${agent.header.name}.md`, ClaudeGenerator.agentSpec(agent), '\uD83E\uDD16', 'agent definition');\n\n await writeFile('.mcp.json', JSON.stringify({\n mcpServers: {\n 'playwright-test': {\n command: 'npx',\n args: ['playwright', 'run-test-mcp-server'],\n }\n }\n }, null, 2), '\uD83D\uDD27', 'mcp configuration');\n\n initRepoDone();\n }\n\n static agentSpec(agent: Agent): string {\n const claudeToolMap = new Map<string, string[]>([\n ['search', ['Glob', 'Grep', 'Read', 'LS']],\n ['edit', ['Edit', 'MultiEdit', 'Write']],\n ]);\n\n function asClaudeTool(tool: string): string {\n const [first, second] = tool.split('/');\n if (!second)\n return (claudeToolMap.get(first) || [first]).join(', ');\n return `mcp__${first}__${second}`;\n }\n\n const examples = agent.examples.length ? ` Examples: ${agent.examples.map(example => `<example>${example}</example>`).join('')}` : '';\n const lines: string[] = [];\n const header = {\n name: agent.header.name,\n description: agent.header.description + examples,\n tools: agent.header.tools.map(tool => asClaudeTool(tool)).join(', '),\n model: agent.header.model,\n color: agent.header.color,\n };\n lines.push(`---`);\n lines.push(yaml.stringify(header, { lineWidth: 100000 }) + `---`);\n lines.push('');\n lines.push(agent.instructions);\n return lines.join('\\n');\n }\n}\n\nexport class OpencodeGenerator {\n static async init(config: FullConfigInternal, projectName: string, prompts: boolean) {\n await initRepo(config, projectName, {\n defaultAgentName: 'Build',\n promptsFolder: prompts ? '.opencode/prompts' : undefined\n });\n\n const agents = await AgentParser.loadAgents();\n\n for (const agent of agents) {\n const prompt = [agent.instructions];\n prompt.push('');\n prompt.push(...agent.examples.map(example => `<example>${example}</example>`));\n await writeFile(`.opencode/prompts/${agent.header.name}.md`, prompt.join('\\n'), '\uD83E\uDD16', 'agent definition');\n }\n\n await writeFile('opencode.json', OpencodeGenerator.configuration(agents), '\uD83D\uDD27', 'opencode configuration');\n\n initRepoDone();\n }\n\n static configuration(agents: Agent[]): string {\n const opencodeToolMap = new Map<string, string[]>([\n ['search', ['ls', 'glob', 'grep', 'read']],\n ['edit', ['edit', 'write']],\n ]);\n\n const asOpencodeTool = (tools: Record<string, boolean>, tool: string) => {\n const [first, second] = tool.split('/');\n if (!second) {\n for (const tool of opencodeToolMap.get(first) || [first])\n tools[tool] = true;\n } else {\n tools[`${first}*${second}`] = true;\n }\n };\n\n const result: Record<string, any> = {};\n result['$schema'] = 'https://opencode.ai/config.json';\n result['mcp'] = {};\n result['tools'] = {\n 'playwright*': false,\n };\n result['agent'] = {};\n for (const agent of agents) {\n const tools: Record<string, boolean> = {};\n result['agent'][agent.header.name] = {\n description: agent.header.description,\n mode: 'subagent',\n prompt: `{file:.opencode/prompts/${agent.header.name}.md}`,\n tools,\n };\n for (const tool of agent.header.tools)\n asOpencodeTool(tools, tool);\n }\n\n result['mcp']['playwright-test'] = {\n type: 'local',\n command: ['npx', 'playwright', 'run-test-mcp-server'],\n enabled: true,\n };\n\n return JSON.stringify(result, null, 2);\n }\n}\nexport class CopilotGenerator {\n static async init(config: FullConfigInternal, projectName: string, prompts: boolean) {\n\n await initRepo(config, projectName, {\n defaultAgentName: 'agent',\n promptsFolder: prompts ? '.github/prompts' : undefined,\n promptSuffix: 'prompt'\n });\n\n const agents = await AgentParser.loadAgents();\n\n await fs.promises.mkdir('.github/agents', { recursive: true });\n for (const agent of agents)\n await writeFile(`.github/agents/${agent.header.name}.agent.md`, CopilotGenerator.agentSpec(agent), '\uD83E\uDD16', 'agent definition');\n\n await deleteFile(`.github/chatmodes/ \uD83C\uDFAD planner.chatmode.md`, 'legacy planner chatmode');\n await deleteFile(`.github/chatmodes/\uD83C\uDFAD generator.chatmode.md`, 'legacy generator chatmode');\n await deleteFile(`.github/chatmodes/\uD83C\uDFAD healer.chatmode.md`, 'legacy healer chatmode');\n await deleteFile(`.github/agents/ \uD83C\uDFAD planner.agent.md`, 'legacy planner agent');\n await deleteFile(`.github/agents/\uD83C\uDFAD generator.agent.md`, 'legacy generator agent');\n await deleteFile(`.github/agents/\uD83C\uDFAD healer.agent.md`, 'legacy healer agent');\n\n await VSCodeGenerator.appendToMCPJson();\n\n const mcpConfig = { mcpServers: CopilotGenerator.mcpServers };\n\n if (!fs.existsSync('.github/copilot-setup-steps.yml')) {\n const yaml = fs.readFileSync(path.join(__dirname, 'copilot-setup-steps.yml'), 'utf-8');\n await writeFile('.github/workflows/copilot-setup-steps.yml', yaml, '\uD83D\uDD27', 'GitHub Copilot setup steps');\n }\n\n console.log('');\n console.log('');\n console.log(' \uD83D\uDD27 TODO: GitHub > Settings > Copilot > Coding agent > MCP configuration');\n console.log('------------------------------------------------------------------');\n console.log(JSON.stringify(mcpConfig, null, 2));\n console.log('------------------------------------------------------------------');\n\n initRepoDone();\n }\n\n static agentSpec(agent: Agent): string {\n const examples = agent.examples.length ? ` Examples: ${agent.examples.map(example => `<example>${example}</example>`).join('')}` : '';\n const lines: string[] = [];\n const header = {\n 'name': agent.header.name,\n 'description': agent.header.description + examples,\n 'tools': agent.header.tools,\n 'model': 'Claude Sonnet 4',\n 'mcp-servers': CopilotGenerator.mcpServers,\n };\n lines.push(`---`);\n lines.push(yaml.stringify(header) + `---`);\n lines.push('');\n lines.push(agent.instructions);\n lines.push('');\n return lines.join('\\n');\n }\n\n static mcpServers = {\n 'playwright-test': {\n 'type': 'stdio',\n 'command': 'npx',\n 'args': [\n 'playwright',\n 'run-test-mcp-server'\n ],\n 'tools': ['*']\n },\n };\n}\n\nexport class VSCodeGenerator {\n static async init(config: FullConfigInternal, projectName: string) {\n await initRepo(config, projectName, {\n promptsFolder: undefined\n });\n const agents = await AgentParser.loadAgents();\n\n const nameMap = new Map<string, string>([\n ['playwright-test-planner', ' \uD83C\uDFAD planner'],\n ['playwright-test-generator', '\uD83C\uDFAD generator'],\n ['playwright-test-healer', '\uD83C\uDFAD healer'],\n ]);\n\n await fs.promises.mkdir('.github/chatmodes', { recursive: true });\n for (const agent of agents)\n await writeFile(`.github/chatmodes/${nameMap.get(agent.header.name)}.chatmode.md`, VSCodeGenerator.agentSpec(agent), '\uD83E\uDD16', 'chatmode definition');\n\n await VSCodeGenerator.appendToMCPJson();\n\n initRepoDone();\n }\n\n static async appendToMCPJson() {\n await fs.promises.mkdir('.vscode', { recursive: true });\n\n const mcpJsonPath = '.vscode/mcp.json';\n let mcpJson: any = {\n servers: {},\n inputs: []\n };\n try {\n mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf8'));\n } catch {\n }\n\n if (!mcpJson.servers)\n mcpJson.servers = {};\n\n mcpJson.servers['playwright-test'] = {\n type: 'stdio',\n command: 'npx',\n args: ['playwright', 'run-test-mcp-server'],\n };\n await writeFile(mcpJsonPath, JSON.stringify(mcpJson, null, 2), '\uD83D\uDD27', 'mcp configuration');\n }\n\n static agentSpec(agent: Agent): string {\n const vscodeToolMap = new Map<string, string[]>([\n ['search', ['search/listDirectory', 'search/fileSearch', 'search/textSearch']],\n ['read', ['search/readFile']],\n ['edit', ['edit/editFiles']],\n ['write', ['edit/createFile', 'edit/createDirectory']],\n ]);\n const vscodeToolsOrder = ['edit/createFile', 'edit/createDirectory', 'edit/editFiles', 'search/fileSearch', 'search/textSearch', 'search/listDirectory', 'search/readFile'];\n const vscodeMcpName = 'playwright-test';\n\n function asVscodeTool(tool: string): string | string[] {\n const [first, second] = tool.split('/');\n if (second)\n return `${vscodeMcpName}/${second}`;\n return vscodeToolMap.get(first) || first;\n }\n const tools = agent.header.tools.map(asVscodeTool).flat().sort((a, b) => {\n // VSCode insists on the specific tools order when editing agent config.\n const indexA = vscodeToolsOrder.indexOf(a);\n const indexB = vscodeToolsOrder.indexOf(b);\n if (indexA === -1 && indexB === -1)\n return a.localeCompare(b);\n if (indexA === -1)\n return 1;\n if (indexB === -1)\n return -1;\n return indexA - indexB;\n }).map(tool => `'${tool}'`).join(', ');\n\n const lines: string[] = [];\n lines.push(`---`);\n lines.push(`description: ${agent.header.description}.`);\n lines.push(`tools: [${tools}]`);\n lines.push(`---`);\n lines.push('');\n lines.push(agent.instructions);\n for (const example of agent.examples)\n lines.push(`<example>${example}</example>`);\n\n lines.push('');\n return lines.join('\\n');\n }\n}\n\nasync function writeFile(filePath: string, content: string, icon: string, description: string) {\n console.log(` ${icon} ${path.relative(process.cwd(), filePath)} ${colors.dim('- ' + description)}`);\n await mkdirIfNeeded(filePath);\n await fs.promises.writeFile(filePath, content, 'utf-8');\n}\n\nasync function deleteFile(filePath: string, description: string) {\n try {\n if (!fs.existsSync(filePath))\n return;\n } catch {\n return;\n }\n\n console.log(` \u2702\uFE0F ${path.relative(process.cwd(), filePath)} ${colors.dim('- ' + description)}`);\n await fs.promises.unlink(filePath);\n}\n\ntype RepoParams = {\n promptsFolder?: string;\n promptSuffix?: string;\n defaultAgentName?: string;\n};\n\nasync function initRepo(config: FullConfigInternal, projectName: string, options: RepoParams) {\n const project = seedProject(config, projectName);\n console.log(` \uD83C\uDFAD Using project \"${project.project.name}\" as a primary project`);\n\n if (!fs.existsSync('specs')) {\n await fs.promises.mkdir('specs');\n await writeFile(path.join('specs', 'README.md'), `# Specs\n\nThis is a directory for test plans.\n`, '\uD83D\uDCDD', 'directory for test plans');\n }\n\n let seedFile = await findSeedFile(project);\n if (!seedFile) {\n seedFile = defaultSeedFile(project);\n await writeFile(seedFile, seedFileContent, '\uD83C\uDF31', 'default environment seed file');\n }\n\n if (options.promptsFolder) {\n await fs.promises.mkdir(options.promptsFolder, { recursive: true });\n\n for (const promptFile of await fs.promises.readdir(__dirname)) {\n if (!promptFile.endsWith('.prompt.md'))\n continue;\n const shortName = promptFile.replace('.prompt.md', '');\n const fileName = options.promptSuffix ? `${shortName}.${options.promptSuffix}.md` : `${shortName}.md`;\n const content = await loadPrompt(promptFile, {\n defaultAgentName: 'default',\n ...options,\n seedFile: path.relative(process.cwd(), seedFile)\n });\n await writeFile(path.join(options.promptsFolder, fileName), content, '\uD83D\uDCDD', 'prompt template');\n }\n }\n}\n\nfunction initRepoDone() {\n console.log(' \u2705 Done.');\n}\n\nasync function loadPrompt(file: string, params: Record<string, string>) {\n const content = await fs.promises.readFile(path.join(__dirname, file), 'utf-8');\n return Object.entries(params).reduce((acc, [key, value]) => {\n return acc.replace(new RegExp(`\\\\\\${${key}}`, 'g'), value);\n }, content);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "path", "tool", "yaml"]
|
|
7
|
+
}
|
|
@@ -17,6 +17,7 @@ tools:
|
|
|
17
17
|
- playwright-test/browser_navigate_back
|
|
18
18
|
- playwright-test/browser_network_requests
|
|
19
19
|
- playwright-test/browser_press_key
|
|
20
|
+
- playwright-test/browser_run_code
|
|
20
21
|
- playwright-test/browser_select_option
|
|
21
22
|
- playwright-test/browser_snapshot
|
|
22
23
|
- playwright-test/browser_take_screenshot
|
package/lib/common/config.js
CHANGED
|
@@ -87,20 +87,22 @@ class FullConfigInternal {
|
|
|
87
87
|
maxFailures: takeFirst(configCLIOverrides.debug ? 1 : void 0, configCLIOverrides.maxFailures, userConfig.maxFailures, 0),
|
|
88
88
|
metadata: metadata ?? userConfig.metadata,
|
|
89
89
|
preserveOutput: takeFirst(userConfig.preserveOutput, "always"),
|
|
90
|
+
projects: [],
|
|
91
|
+
quiet: takeFirst(configCLIOverrides.quiet, userConfig.quiet, false),
|
|
90
92
|
reporter: takeFirst(configCLIOverrides.reporter, resolveReporters(userConfig.reporter, configDir), [[defaultReporter]]),
|
|
91
93
|
reportSlowTests: takeFirst(userConfig.reportSlowTests, {
|
|
92
94
|
max: 5,
|
|
93
95
|
threshold: 3e5
|
|
94
96
|
/* 5 minutes */
|
|
95
97
|
}),
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
// @ts-expect-error runAgents is hidden
|
|
99
|
+
runAgents: takeFirst(configCLIOverrides.runAgents, "none"),
|
|
98
100
|
shard: takeFirst(configCLIOverrides.shard, userConfig.shard, null),
|
|
99
101
|
tags: globalTags,
|
|
100
102
|
updateSnapshots: takeFirst(configCLIOverrides.updateSnapshots, userConfig.updateSnapshots, "missing"),
|
|
101
103
|
updateSourceMethod: takeFirst(configCLIOverrides.updateSourceMethod, userConfig.updateSourceMethod, "patch"),
|
|
102
104
|
version: require("../../package.json").version,
|
|
103
|
-
workers: resolveWorkers(takeFirst(configCLIOverrides.debug ? 1 : void 0, configCLIOverrides.workers, userConfig.workers, "50%")),
|
|
105
|
+
workers: resolveWorkers(takeFirst(configCLIOverrides.debug || configCLIOverrides.pause ? 1 : void 0, configCLIOverrides.workers, userConfig.workers, "50%")),
|
|
104
106
|
webServer: null
|
|
105
107
|
};
|
|
106
108
|
for (const key in userConfig) {
|
|
@@ -251,7 +253,7 @@ function toReporters(reporters) {
|
|
|
251
253
|
return [[reporters]];
|
|
252
254
|
return reporters;
|
|
253
255
|
}
|
|
254
|
-
const builtInReporters = ["list", "line", "dot", "json", "junit", "null", "github", "html", "blob"];
|
|
256
|
+
const builtInReporters = ["list", "line", "dot", "json", "junit", "null", "github", "html", "blob", "smoothdeploy"];
|
|
255
257
|
function resolveScript(id, rootDir) {
|
|
256
258
|
if (!id)
|
|
257
259
|
return void 0;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/common/config.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 os from 'os';\nimport path from 'path';\n\nimport { getPackageJsonPath, mergeObjects } from '../util';\n\nimport type { Config, Fixtures, Metadata, Project, ReporterDescription } from '../../types/test';\nimport type { TestRunnerPluginRegistration } from '../plugins';\nimport type { TestCaseFilter } from '../util';\nimport type { ConfigCLIOverrides } from './ipc';\nimport type { Location } from '../../types/testReporter';\nimport type { FullConfig, FullProject } from '../../types/testReporter';\n\nexport type ConfigLocation = {\n resolvedConfigFile?: string;\n configDir: string;\n};\n\nexport type FixturesWithLocation = {\n fixtures: Fixtures;\n location: Location;\n};\n\nexport const defaultTimeout = 30000;\n\nexport class FullConfigInternal {\n readonly config: FullConfig;\n readonly configDir: string;\n readonly configCLIOverrides: ConfigCLIOverrides;\n readonly webServers: NonNullable<FullConfig['webServer']>[];\n readonly plugins: TestRunnerPluginRegistration[];\n readonly projects: FullProjectInternal[] = [];\n readonly singleTSConfigPath?: string;\n readonly captureGitInfo: Config['captureGitInfo'];\n readonly failOnFlakyTests: boolean;\n cliArgs: string[] = [];\n cliGrep: string | undefined;\n cliGrepInvert: string | undefined;\n cliOnlyChanged: string | undefined;\n cliProjectFilter?: string[];\n cliListOnly = false;\n cliPassWithNoTests?: boolean;\n cliLastFailed?: boolean;\n cliTestList?: string;\n cliTestListInvert?: string;\n preOnlyTestFilters: TestCaseFilter[] = [];\n postShardTestFilters: TestCaseFilter[] = [];\n defineConfigWasUsed = false;\n\n globalSetups: string[] = [];\n globalTeardowns: string[] = [];\n\n constructor(location: ConfigLocation, userConfig: Config, configCLIOverrides: ConfigCLIOverrides, metadata?: Metadata) {\n if (configCLIOverrides.projects && userConfig.projects)\n throw new Error(`Cannot use --browser option when configuration file defines projects. Specify browserName in the projects instead.`);\n\n const { resolvedConfigFile, configDir } = location;\n const packageJsonPath = getPackageJsonPath(configDir);\n const packageJsonDir = packageJsonPath ? path.dirname(packageJsonPath) : process.cwd();\n\n this.configDir = configDir;\n this.configCLIOverrides = configCLIOverrides;\n const privateConfiguration = (userConfig as any)['@playwright/test'];\n this.plugins = (privateConfiguration?.plugins || []).map((p: any) => ({ factory: p }));\n this.singleTSConfigPath = pathResolve(configDir, userConfig.tsconfig);\n this.captureGitInfo = userConfig.captureGitInfo;\n this.failOnFlakyTests = takeFirst(configCLIOverrides.failOnFlakyTests, userConfig.failOnFlakyTests, false);\n\n this.globalSetups = (Array.isArray(userConfig.globalSetup) ? userConfig.globalSetup : [userConfig.globalSetup]).map(s => resolveScript(s, configDir)).filter(script => script !== undefined);\n this.globalTeardowns = (Array.isArray(userConfig.globalTeardown) ? userConfig.globalTeardown : [userConfig.globalTeardown]).map(s => resolveScript(s, configDir)).filter(script => script !== undefined);\n\n // Make sure we reuse same metadata instance between FullConfigInternal instances,\n // so that plugins such as gitCommitInfoPlugin can populate metadata once.\n userConfig.metadata = userConfig.metadata || {};\n\n const globalTags = Array.isArray(userConfig.tag) ? userConfig.tag : (userConfig.tag ? [userConfig.tag] : []);\n for (const tag of globalTags) {\n if (tag[0] !== '@')\n throw new Error(`Tag must start with \"@\" symbol, got \"${tag}\" instead.`);\n }\n\n this.config = {\n configFile: resolvedConfigFile,\n rootDir: pathResolve(configDir, userConfig.testDir) || configDir,\n forbidOnly: takeFirst(configCLIOverrides.forbidOnly, userConfig.forbidOnly, false),\n fullyParallel: takeFirst(configCLIOverrides.fullyParallel, userConfig.fullyParallel, false),\n globalSetup: this.globalSetups[0] ?? null,\n globalTeardown: this.globalTeardowns[0] ?? null,\n globalTimeout: takeFirst(configCLIOverrides.debug ? 0 : undefined, configCLIOverrides.globalTimeout, userConfig.globalTimeout, 0),\n grep: takeFirst(userConfig.grep, defaultGrep),\n grepInvert: takeFirst(userConfig.grepInvert, null),\n maxFailures: takeFirst(configCLIOverrides.debug ? 1 : undefined, configCLIOverrides.maxFailures, userConfig.maxFailures, 0),\n metadata: metadata ?? userConfig.metadata,\n preserveOutput: takeFirst(userConfig.preserveOutput, 'always'),\n reporter: takeFirst(configCLIOverrides.reporter, resolveReporters(userConfig.reporter, configDir), [[defaultReporter]]),\n reportSlowTests: takeFirst(userConfig.reportSlowTests, { max: 5, threshold: 300_000 /* 5 minutes */ }),\n quiet: takeFirst(configCLIOverrides.quiet, userConfig.quiet, false),\n projects: [],\n shard: takeFirst(configCLIOverrides.shard, userConfig.shard, null),\n tags: globalTags,\n updateSnapshots: takeFirst(configCLIOverrides.updateSnapshots, userConfig.updateSnapshots, 'missing'),\n updateSourceMethod: takeFirst(configCLIOverrides.updateSourceMethod, userConfig.updateSourceMethod, 'patch'),\n version: require('../../package.json').version,\n workers: resolveWorkers(takeFirst(configCLIOverrides.debug ? 1 : undefined, configCLIOverrides.workers, userConfig.workers, '50%')),\n webServer: null,\n };\n for (const key in userConfig) {\n if (key.startsWith('@'))\n (this.config as any)[key] = (userConfig as any)[key];\n }\n\n (this.config as any)[configInternalSymbol] = this;\n\n const webServers = takeFirst(userConfig.webServer, null);\n if (Array.isArray(webServers)) { // multiple web server mode\n // Due to previous choices, this value shows up to the user in globalSetup as part of FullConfig. Arrays are not supported by the old type.\n this.config.webServer = null;\n this.webServers = webServers;\n } else if (webServers) { // legacy singleton mode\n this.config.webServer = webServers;\n this.webServers = [webServers];\n } else {\n this.webServers = [];\n }\n\n // When no projects are defined, do not use config.workers as a hard limit for project.workers.\n const projectConfigs = configCLIOverrides.projects || userConfig.projects || [{ ...userConfig, workers: undefined }];\n this.projects = projectConfigs.map(p => new FullProjectInternal(configDir, userConfig, this, p, this.configCLIOverrides, packageJsonDir));\n resolveProjectDependencies(this.projects);\n this._assignUniqueProjectIds(this.projects);\n this.config.projects = this.projects.map(p => p.project);\n }\n\n private _assignUniqueProjectIds(projects: FullProjectInternal[]) {\n const usedNames = new Set();\n for (const p of projects) {\n const name = p.project.name || '';\n for (let i = 0; i < projects.length; ++i) {\n const candidate = name + (i ? i : '');\n if (usedNames.has(candidate))\n continue;\n p.id = candidate;\n (p.project as any).__projectId = p.id;\n usedNames.add(candidate);\n break;\n }\n }\n }\n}\n\nexport class FullProjectInternal {\n readonly project: FullProject;\n readonly fullConfig: FullConfigInternal;\n readonly fullyParallel: boolean;\n readonly expect: Project['expect'];\n readonly respectGitIgnore: boolean;\n readonly snapshotPathTemplate: string | undefined;\n readonly ignoreSnapshots: boolean;\n readonly workers: number | undefined;\n id = '';\n deps: FullProjectInternal[] = [];\n teardown: FullProjectInternal | undefined;\n\n constructor(configDir: string, config: Config, fullConfig: FullConfigInternal, projectConfig: Project, configCLIOverrides: ConfigCLIOverrides, packageJsonDir: string) {\n this.fullConfig = fullConfig;\n const testDir = takeFirst(pathResolve(configDir, projectConfig.testDir), pathResolve(configDir, config.testDir), fullConfig.configDir);\n this.snapshotPathTemplate = takeFirst(projectConfig.snapshotPathTemplate, config.snapshotPathTemplate);\n\n this.project = {\n grep: takeFirst(projectConfig.grep, config.grep, defaultGrep),\n grepInvert: takeFirst(projectConfig.grepInvert, config.grepInvert, null),\n outputDir: takeFirst(configCLIOverrides.outputDir, pathResolve(configDir, projectConfig.outputDir), pathResolve(configDir, config.outputDir), path.join(packageJsonDir, 'test-results')),\n // Note: we either apply the cli override for repeatEach or not, depending on whether the\n // project is top-level vs dependency. See collectProjectsAndTestFiles in loadUtils.\n repeatEach: takeFirst(projectConfig.repeatEach, config.repeatEach, 1),\n retries: takeFirst(configCLIOverrides.retries, projectConfig.retries, config.retries, 0),\n metadata: takeFirst(projectConfig.metadata, config.metadata, {}),\n name: takeFirst(projectConfig.name, config.name, ''),\n testDir,\n snapshotDir: takeFirst(pathResolve(configDir, projectConfig.snapshotDir), pathResolve(configDir, config.snapshotDir), testDir),\n testIgnore: takeFirst(projectConfig.testIgnore, config.testIgnore, []),\n testMatch: takeFirst(projectConfig.testMatch, config.testMatch, '**/*.@(spec|test).?(c|m)[jt]s?(x)'),\n timeout: takeFirst(configCLIOverrides.debug ? 0 : undefined, configCLIOverrides.timeout, projectConfig.timeout, config.timeout, defaultTimeout),\n use: mergeObjects(config.use, projectConfig.use, configCLIOverrides.use),\n dependencies: projectConfig.dependencies || [],\n teardown: projectConfig.teardown,\n };\n this.fullyParallel = takeFirst(configCLIOverrides.fullyParallel, projectConfig.fullyParallel, config.fullyParallel, undefined);\n this.expect = takeFirst(projectConfig.expect, config.expect, {});\n if (this.expect.toHaveScreenshot?.stylePath) {\n const stylePaths = Array.isArray(this.expect.toHaveScreenshot.stylePath) ? this.expect.toHaveScreenshot.stylePath : [this.expect.toHaveScreenshot.stylePath];\n this.expect.toHaveScreenshot.stylePath = stylePaths.map(stylePath => path.resolve(configDir, stylePath));\n }\n this.respectGitIgnore = takeFirst(projectConfig.respectGitIgnore, config.respectGitIgnore, !projectConfig.testDir && !config.testDir);\n this.ignoreSnapshots = takeFirst(configCLIOverrides.ignoreSnapshots, projectConfig.ignoreSnapshots, config.ignoreSnapshots, false);\n this.workers = projectConfig.workers ? resolveWorkers(projectConfig.workers) : undefined;\n if (configCLIOverrides.debug && this.workers)\n this.workers = 1;\n }\n}\n\nexport function takeFirst<T>(...args: (T | undefined)[]): T {\n for (const arg of args) {\n if (arg !== undefined)\n return arg;\n }\n return undefined as any as T;\n}\n\nfunction pathResolve(baseDir: string, relative: string | undefined): string | undefined {\n if (!relative)\n return undefined;\n return path.resolve(baseDir, relative);\n}\n\nfunction resolveReporters(reporters: Config['reporter'], rootDir: string): ReporterDescription[] | undefined {\n return toReporters(reporters as any)?.map(([id, arg]) => {\n if (builtInReporters.includes(id as any))\n return [id, arg];\n return [require.resolve(id, { paths: [rootDir] }), arg];\n });\n}\n\nfunction resolveWorkers(workers: string | number): number {\n if (typeof workers === 'string') {\n if (workers.endsWith('%')) {\n const cpus = os.cpus().length;\n return Math.max(1, Math.floor(cpus * (parseInt(workers, 10) / 100)));\n }\n const parsedWorkers = parseInt(workers, 10);\n if (isNaN(parsedWorkers))\n throw new Error(`Workers ${workers} must be a number or percentage.`);\n return parsedWorkers;\n }\n return workers;\n}\n\nfunction resolveProjectDependencies(projects: FullProjectInternal[]) {\n const teardownSet = new Set<FullProjectInternal>();\n for (const project of projects) {\n for (const dependencyName of project.project.dependencies) {\n const dependencies = projects.filter(p => p.project.name === dependencyName);\n if (!dependencies.length)\n throw new Error(`Project '${project.project.name}' depends on unknown project '${dependencyName}'`);\n if (dependencies.length > 1)\n throw new Error(`Project dependencies should have unique names, reading ${dependencyName}`);\n project.deps.push(...dependencies);\n }\n if (project.project.teardown) {\n const teardowns = projects.filter(p => p.project.name === project.project.teardown);\n if (!teardowns.length)\n throw new Error(`Project '${project.project.name}' has unknown teardown project '${project.project.teardown}'`);\n if (teardowns.length > 1)\n throw new Error(`Project teardowns should have unique names, reading ${project.project.teardown}`);\n const teardown = teardowns[0];\n project.teardown = teardown;\n teardownSet.add(teardown);\n }\n }\n for (const teardown of teardownSet) {\n if (teardown.deps.length)\n throw new Error(`Teardown project ${teardown.project.name} must not have dependencies`);\n }\n for (const project of projects) {\n for (const dep of project.deps) {\n if (teardownSet.has(dep))\n throw new Error(`Project ${project.project.name} must not depend on a teardown project ${dep.project.name}`);\n }\n }\n}\n\nexport function toReporters(reporters: BuiltInReporter | ReporterDescription[] | undefined): ReporterDescription[] | undefined {\n if (!reporters)\n return;\n if (typeof reporters === 'string')\n return [[reporters]];\n return reporters;\n}\n\nexport const builtInReporters = ['list', 'line', 'dot', 'json', 'junit', 'null', 'github', 'html', 'blob'] as const;\nexport type BuiltInReporter = typeof builtInReporters[number];\n\nexport type ContextReuseMode = 'none' | 'when-possible';\n\nfunction resolveScript(id: string | undefined, rootDir: string): string | undefined {\n if (!id)\n return undefined;\n const localPath = path.resolve(rootDir, id);\n if (fs.existsSync(localPath))\n return localPath;\n return require.resolve(id, { paths: [rootDir] });\n}\n\nexport const defaultGrep = /.*/;\nexport const defaultReporter = process.env.CI ? 'dot' : 'list';\n\nconst configInternalSymbol = Symbol('configInternalSymbol');\n\nexport function getProjectId(project: FullProject): string {\n return (project as any).__projectId!;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "os", "fs"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/common/configLoader.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 { isRegExp } from 'playwright-core/lib/utils';\n\nimport { requireOrImport, setSingleTSConfig, setTransformConfig } from '../transform/transform';\nimport { errorWithFile, fileIsModule } from '../util';\nimport { FullConfigInternal } from './config';\nimport { configureESMLoader, configureESMLoaderTransformConfig, registerESMLoader } from './esmLoaderHost';\nimport { addToCompilationCache } from '../transform/compilationCache';\n\nimport type { ConfigLocation } from './config';\nimport type { ConfigCLIOverrides, SerializedConfig } from './ipc';\nimport type { Config, Project } from '../../types/test';\n\nconst kDefineConfigWasUsed = Symbol('defineConfigWasUsed');\nexport const defineConfig = (...configs: any[]) => {\n let result = configs[0];\n for (let i = 1; i < configs.length; ++i) {\n const config = configs[i];\n const prevProjects = result.projects;\n result = {\n ...result,\n ...config,\n expect: {\n ...result.expect,\n ...config.expect,\n },\n use: {\n ...result.use,\n ...config.use,\n },\n build: {\n ...result.build,\n ...config.build,\n },\n webServer: [\n ...(Array.isArray(result.webServer) ? result.webServer : (result.webServer ? [result.webServer] : [])),\n ...(Array.isArray(config.webServer) ? config.webServer : (config.webServer ? [config.webServer] : [])),\n ]\n };\n\n if (!result.projects && !config.projects)\n continue;\n\n const projectOverrides = new Map<string, any>();\n for (const project of config.projects || [])\n projectOverrides.set(project.name, project);\n\n const projects = [];\n for (const project of prevProjects || []) {\n const projectOverride = projectOverrides.get(project.name);\n if (projectOverride) {\n projects.push({\n ...project,\n ...projectOverride,\n use: {\n ...project.use,\n ...projectOverride.use,\n }\n });\n projectOverrides.delete(project.name);\n } else {\n projects.push(project);\n }\n }\n projects.push(...projectOverrides.values());\n result.projects = projects;\n }\n result[kDefineConfigWasUsed] = true;\n return result;\n};\n\nexport async function deserializeConfig(data: SerializedConfig): Promise<FullConfigInternal> {\n if (data.compilationCache)\n addToCompilationCache(data.compilationCache);\n return await loadConfig(data.location, data.configCLIOverrides, undefined, data.metadata ? JSON.parse(data.metadata) : undefined);\n}\n\nasync function loadUserConfig(location: ConfigLocation): Promise<Config> {\n let object = location.resolvedConfigFile ? await requireOrImport(location.resolvedConfigFile) : {};\n if (object && typeof object === 'object' && ('default' in object))\n object = object['default'];\n return object as Config;\n}\n\nexport async function loadConfig(location: ConfigLocation, overrides?: ConfigCLIOverrides, ignoreProjectDependencies = false, metadata?: Config['metadata']): Promise<FullConfigInternal> {\n // 0. Setup ESM loader if needed.\n if (!registerESMLoader()) {\n // In Node.js < 18, complain if the config file is ESM. Historically, we would restart\n // the process with --loader, but now we require newer Node.js.\n if (location.resolvedConfigFile && fileIsModule(location.resolvedConfigFile))\n throw errorWithFile(location.resolvedConfigFile, `Playwright requires Node.js 18.19 or higher to load esm modules. Please update your version of Node.js.`);\n }\n\n // 1. Setup tsconfig; configure ESM loader with tsconfig and compilation cache.\n setSingleTSConfig(overrides?.tsconfig);\n await configureESMLoader();\n\n // 2. Load and validate playwright config.\n const userConfig = await loadUserConfig(location);\n validateConfig(location.resolvedConfigFile || '<default config>', userConfig);\n const fullConfig = new FullConfigInternal(location, userConfig, overrides || {}, metadata);\n fullConfig.defineConfigWasUsed = !!(userConfig as any)[kDefineConfigWasUsed];\n if (ignoreProjectDependencies) {\n for (const project of fullConfig.projects) {\n project.deps = [];\n project.teardown = undefined;\n }\n }\n\n // 3. Load transform options from the playwright config.\n const babelPlugins = (userConfig as any)['@playwright/test']?.babelPlugins || [];\n const external = userConfig.build?.external || [];\n setTransformConfig({ babelPlugins, external });\n if (!overrides?.tsconfig)\n setSingleTSConfig(fullConfig?.singleTSConfigPath);\n\n // 4. Send transform options to ESM loader.\n await configureESMLoaderTransformConfig();\n\n return fullConfig;\n}\n\nfunction validateConfig(file: string, config: Config) {\n if (typeof config !== 'object' || !config)\n throw errorWithFile(file, `Configuration file must export a single object`);\n\n validateProject(file, config, 'config');\n\n if ('forbidOnly' in config && config.forbidOnly !== undefined) {\n if (typeof config.forbidOnly !== 'boolean')\n throw errorWithFile(file, `config.forbidOnly must be a boolean`);\n }\n\n if ('globalSetup' in config && config.globalSetup !== undefined) {\n if (Array.isArray(config.globalSetup)) {\n config.globalSetup.forEach((item, index) => {\n if (typeof item !== 'string')\n throw errorWithFile(file, `config.globalSetup[${index}] must be a string`);\n });\n } else if (typeof config.globalSetup !== 'string') {\n throw errorWithFile(file, `config.globalSetup must be a string`);\n }\n }\n\n if ('globalTeardown' in config && config.globalTeardown !== undefined) {\n if (Array.isArray(config.globalTeardown)) {\n config.globalTeardown.forEach((item, index) => {\n if (typeof item !== 'string')\n throw errorWithFile(file, `config.globalTeardown[${index}] must be a string`);\n });\n } else if (typeof config.globalTeardown !== 'string') {\n throw errorWithFile(file, `config.globalTeardown must be a string`);\n }\n }\n\n if ('globalTimeout' in config && config.globalTimeout !== undefined) {\n if (typeof config.globalTimeout !== 'number' || config.globalTimeout < 0)\n throw errorWithFile(file, `config.globalTimeout must be a non-negative number`);\n }\n\n if ('grep' in config && config.grep !== undefined) {\n if (Array.isArray(config.grep)) {\n config.grep.forEach((item, index) => {\n if (!isRegExp(item))\n throw errorWithFile(file, `config.grep[${index}] must be a RegExp`);\n });\n } else if (!isRegExp(config.grep)) {\n throw errorWithFile(file, `config.grep must be a RegExp`);\n }\n }\n\n if ('grepInvert' in config && config.grepInvert !== undefined) {\n if (Array.isArray(config.grepInvert)) {\n config.grepInvert.forEach((item, index) => {\n if (!isRegExp(item))\n throw errorWithFile(file, `config.grepInvert[${index}] must be a RegExp`);\n });\n } else if (!isRegExp(config.grepInvert)) {\n throw errorWithFile(file, `config.grepInvert must be a RegExp`);\n }\n }\n\n if ('maxFailures' in config && config.maxFailures !== undefined) {\n if (typeof config.maxFailures !== 'number' || config.maxFailures < 0)\n throw errorWithFile(file, `config.maxFailures must be a non-negative number`);\n }\n\n if ('preserveOutput' in config && config.preserveOutput !== undefined) {\n if (typeof config.preserveOutput !== 'string' || !['always', 'never', 'failures-only'].includes(config.preserveOutput))\n throw errorWithFile(file, `config.preserveOutput must be one of \"always\", \"never\" or \"failures-only\"`);\n }\n\n if ('projects' in config && config.projects !== undefined) {\n if (!Array.isArray(config.projects))\n throw errorWithFile(file, `config.projects must be an array`);\n config.projects.forEach((project, index) => {\n validateProject(file, project, `config.projects[${index}]`);\n });\n }\n\n if ('quiet' in config && config.quiet !== undefined) {\n if (typeof config.quiet !== 'boolean')\n throw errorWithFile(file, `config.quiet must be a boolean`);\n }\n\n if ('reporter' in config && config.reporter !== undefined) {\n if (Array.isArray(config.reporter)) {\n config.reporter.forEach((item, index) => {\n if (!Array.isArray(item) || item.length <= 0 || item.length > 2 || typeof item[0] !== 'string')\n throw errorWithFile(file, `config.reporter[${index}] must be a tuple [name, optionalArgument]`);\n });\n } else if (typeof config.reporter !== 'string') {\n throw errorWithFile(file, `config.reporter must be a string`);\n }\n }\n\n if ('reportSlowTests' in config && config.reportSlowTests !== undefined && config.reportSlowTests !== null) {\n if (!config.reportSlowTests || typeof config.reportSlowTests !== 'object')\n throw errorWithFile(file, `config.reportSlowTests must be an object`);\n if (!('max' in config.reportSlowTests) || typeof config.reportSlowTests.max !== 'number' || config.reportSlowTests.max < 0)\n throw errorWithFile(file, `config.reportSlowTests.max must be a non-negative number`);\n if (!('threshold' in config.reportSlowTests) || typeof config.reportSlowTests.threshold !== 'number' || config.reportSlowTests.threshold < 0)\n throw errorWithFile(file, `config.reportSlowTests.threshold must be a non-negative number`);\n }\n\n if ('shard' in config && config.shard !== undefined && config.shard !== null) {\n if (!config.shard || typeof config.shard !== 'object')\n throw errorWithFile(file, `config.shard must be an object`);\n if (!('total' in config.shard) || typeof config.shard.total !== 'number' || config.shard.total < 1)\n throw errorWithFile(file, `config.shard.total must be a positive number`);\n if (!('current' in config.shard) || typeof config.shard.current !== 'number' || config.shard.current < 1 || config.shard.current > config.shard.total)\n throw errorWithFile(file, `config.shard.current must be a positive number, not greater than config.shard.total`);\n }\n\n if ('updateSnapshots' in config && config.updateSnapshots !== undefined) {\n if (typeof config.updateSnapshots !== 'string' || !['all', 'changed', 'missing', 'none'].includes(config.updateSnapshots))\n throw errorWithFile(file, `config.updateSnapshots must be one of \"all\", \"changed\", \"missing\" or \"none\"`);\n }\n\n if ('tsconfig' in config && config.tsconfig !== undefined) {\n if (typeof config.tsconfig !== 'string')\n throw errorWithFile(file, `config.tsconfig must be a string`);\n if (!fs.existsSync(path.resolve(file, '..', config.tsconfig)))\n throw errorWithFile(file, `config.tsconfig does not exist`);\n }\n}\n\nfunction validateProject(file: string, project: Project, title: string) {\n if (typeof project !== 'object' || !project)\n throw errorWithFile(file, `${title} must be an object`);\n\n if ('name' in project && project.name !== undefined) {\n if (typeof project.name !== 'string')\n throw errorWithFile(file, `${title}.name must be a string`);\n }\n\n if ('outputDir' in project && project.outputDir !== undefined) {\n if (typeof project.outputDir !== 'string')\n throw errorWithFile(file, `${title}.outputDir must be a string`);\n }\n\n if ('repeatEach' in project && project.repeatEach !== undefined) {\n if (typeof project.repeatEach !== 'number' || project.repeatEach < 0)\n throw errorWithFile(file, `${title}.repeatEach must be a non-negative number`);\n }\n\n if ('retries' in project && project.retries !== undefined) {\n if (typeof project.retries !== 'number' || project.retries < 0)\n throw errorWithFile(file, `${title}.retries must be a non-negative number`);\n }\n\n if ('testDir' in project && project.testDir !== undefined) {\n if (typeof project.testDir !== 'string')\n throw errorWithFile(file, `${title}.testDir must be a string`);\n }\n\n for (const prop of ['testIgnore', 'testMatch'] as const) {\n if (prop in project && project[prop] !== undefined) {\n const value = project[prop];\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (typeof item !== 'string' && !isRegExp(item))\n throw errorWithFile(file, `${title}.${prop}[${index}] must be a string or a RegExp`);\n });\n } else if (typeof value !== 'string' && !isRegExp(value)) {\n throw errorWithFile(file, `${title}.${prop} must be a string or a RegExp`);\n }\n }\n }\n\n if ('timeout' in project && project.timeout !== undefined) {\n if (typeof project.timeout !== 'number' || project.timeout < 0)\n throw errorWithFile(file, `${title}.timeout must be a non-negative number`);\n }\n\n if ('use' in project && project.use !== undefined) {\n if (!project.use || typeof project.use !== 'object')\n throw errorWithFile(file, `${title}.use must be an object`);\n }\n\n if ('ignoreSnapshots' in project && project.ignoreSnapshots !== undefined) {\n if (typeof project.ignoreSnapshots !== 'boolean')\n throw errorWithFile(file, `${title}.ignoreSnapshots must be a boolean`);\n }\n\n if ('workers' in project && project.workers !== undefined) {\n if (typeof project.workers === 'number' && project.workers <= 0)\n throw errorWithFile(file, `${title}.workers must be a positive number`);\n else if (typeof project.workers === 'string' && !project.workers.endsWith('%'))\n throw errorWithFile(file, `${title}.workers must be a number or percentage`);\n }\n}\n\nexport function resolveConfigLocation(configFile: string | undefined): ConfigLocation {\n const configFileOrDirectory = configFile ? path.resolve(process.cwd(), configFile) : process.cwd();\n const resolvedConfigFile = resolveConfigFile(configFileOrDirectory);\n return {\n resolvedConfigFile,\n configDir: resolvedConfigFile ? path.dirname(resolvedConfigFile) : configFileOrDirectory,\n };\n}\n\nfunction resolveConfigFile(configFileOrDirectory: string): string | undefined {\n const resolveConfig = (configFile: string) => {\n if (fs.existsSync(configFile))\n return configFile;\n };\n\n const resolveConfigFileFromDirectory = (directory: string) => {\n for (const ext of ['.ts', '.js', '.mts', '.mjs', '.cts', '.cjs']) {\n const configFile = resolveConfig(path.resolve(directory, 'playwright.config' + ext));\n if (configFile)\n return configFile;\n }\n };\n\n if (!fs.existsSync(configFileOrDirectory))\n throw new Error(`${configFileOrDirectory} does not exist`);\n if (fs.statSync(configFileOrDirectory).isDirectory()) {\n // When passed a directory, look for a config file inside.\n const configFile = resolveConfigFileFromDirectory(configFileOrDirectory);\n if (configFile)\n return configFile;\n // If there is no config, assume this as a root testing directory.\n return undefined;\n }\n // When passed a file, it must be a config file.\n return configFileOrDirectory!;\n}\n\nexport async function loadConfigFromFile(configFile: string | undefined, overrides?: ConfigCLIOverrides, ignoreDeps?: boolean): Promise<FullConfigInternal> {\n return await loadConfig(resolveConfigLocation(configFile), overrides, ignoreDeps);\n}\n\nexport async function loadEmptyConfigForMergeReports() {\n // Merge reports is \"different\" for no good reason. It should not pick up local config from the cwd.\n return await loadConfig({ configDir: process.cwd() });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,gBAAe;AACf,kBAAiB;AAEjB,mBAAyB;AAEzB,uBAAuE;AACvE,kBAA4C;AAC5C,oBAAmC;AACnC,2BAAyF;AACzF,8BAAsC;AAMtC,MAAM,uBAAuB,OAAO,qBAAqB;AAClD,MAAM,eAAe,IAAI,YAAmB;AACjD,MAAI,SAAS,QAAQ,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,eAAe,OAAO;AAC5B,aAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACZ;AAAA,MACA,KAAK;AAAA,QACH,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,QACT,GAAI,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAa,OAAO,YAAY,CAAC,OAAO,SAAS,IAAI,CAAC;AAAA,QACnG,GAAI,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAa,OAAO,YAAY,CAAC,OAAO,SAAS,IAAI,CAAC;AAAA,MACrG;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,YAAY,CAAC,OAAO;AAC9B;AAEF,UAAM,mBAAmB,oBAAI,IAAiB;AAC9C,eAAW,WAAW,OAAO,YAAY,CAAC;AACxC,uBAAiB,IAAI,QAAQ,MAAM,OAAO;AAE5C,UAAM,WAAW,CAAC;AAClB,eAAW,WAAW,gBAAgB,CAAC,GAAG;AACxC,YAAM,kBAAkB,iBAAiB,IAAI,QAAQ,IAAI;AACzD,UAAI,iBAAiB;AACnB,iBAAS,KAAK;AAAA,UACZ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,KAAK;AAAA,YACH,GAAG,QAAQ;AAAA,YACX,GAAG,gBAAgB;AAAA,UACrB;AAAA,QACF,CAAC;AACD,yBAAiB,OAAO,QAAQ,IAAI;AAAA,MACtC,OAAO;AACL,iBAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AACA,aAAS,KAAK,GAAG,iBAAiB,OAAO,CAAC;AAC1C,WAAO,WAAW;AAAA,EACpB;AACA,SAAO,oBAAoB,IAAI;AAC/B,SAAO;AACT;AAEA,eAAsB,kBAAkB,MAAqD;AAC3F,MAAI,KAAK;AACP,uDAAsB,KAAK,gBAAgB;AAC7C,SAAO,MAAM,WAAW,KAAK,UAAU,KAAK,oBAAoB,QAAW,KAAK,WAAW,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAS;AAClI;AAEA,eAAe,eAAe,UAA2C;AACvE,MAAI,SAAS,SAAS,qBAAqB,UAAM,kCAAgB,SAAS,kBAAkB,IAAI,CAAC;AACjG,MAAI,UAAU,OAAO,WAAW,YAAa,aAAa;AACxD,aAAS,OAAO,SAAS;AAC3B,SAAO;AACT;AAEA,eAAsB,WAAW,UAA0B,WAAgC,4BAA4B,OAAO,UAA4D;AAExL,MAAI,KAAC,wCAAkB,GAAG;AAGxB,QAAI,SAAS,0BAAsB,0BAAa,SAAS,kBAAkB;AACzE,gBAAM,2BAAc,SAAS,oBAAoB,yGAAyG;AAAA,EAC9J;AAGA,0CAAkB,WAAW,QAAQ;AACrC,YAAM,yCAAmB;AAGzB,QAAM,aAAa,MAAM,eAAe,QAAQ;AAChD,iBAAe,SAAS,sBAAsB,oBAAoB,UAAU;AAC5E,QAAM,aAAa,IAAI,iCAAmB,UAAU,YAAY,aAAa,CAAC,GAAG,QAAQ;AACzF,aAAW,sBAAsB,CAAC,CAAE,WAAmB,oBAAoB;AAC3E,MAAI,2BAA2B;AAC7B,eAAW,WAAW,WAAW,UAAU;AACzC,cAAQ,OAAO,CAAC;AAChB,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAGA,QAAM,eAAgB,WAAmB,kBAAkB,GAAG,gBAAgB,CAAC;AAC/E,QAAM,WAAW,WAAW,OAAO,YAAY,CAAC;AAChD,2CAAmB,EAAE,cAAc,SAAS,CAAC;AAC7C,MAAI,CAAC,WAAW;AACd,4CAAkB,YAAY,kBAAkB;AAGlD,YAAM,wDAAkC;AAExC,SAAO;AACT;AAEA,SAAS,eAAe,MAAc,QAAgB;AACpD,MAAI,OAAO,WAAW,YAAY,CAAC;AACjC,cAAM,2BAAc,MAAM,gDAAgD;AAE5E,kBAAgB,MAAM,QAAQ,QAAQ;AAEtC,MAAI,gBAAgB,UAAU,OAAO,eAAe,QAAW;AAC7D,QAAI,OAAO,OAAO,eAAe;AAC/B,gBAAM,2BAAc,MAAM,qCAAqC;AAAA,EACnE;AAEA,MAAI,iBAAiB,UAAU,OAAO,gBAAgB,QAAW;AAC/D,QAAI,MAAM,QAAQ,OAAO,WAAW,GAAG;AACrC,aAAO,YAAY,QAAQ,CAAC,MAAM,UAAU;AAC1C,YAAI,OAAO,SAAS;AAClB,oBAAM,2BAAc,MAAM,sBAAsB,KAAK,oBAAoB;AAAA,MAC7E,CAAC;AAAA,IACH,WAAW,OAAO,OAAO,gBAAgB,UAAU;AACjD,gBAAM,2BAAc,MAAM,qCAAqC;AAAA,IACjE;AAAA,EACF;AAEA,MAAI,oBAAoB,UAAU,OAAO,mBAAmB,QAAW;AACrE,QAAI,MAAM,QAAQ,OAAO,cAAc,GAAG;AACxC,aAAO,eAAe,QAAQ,CAAC,MAAM,UAAU;AAC7C,YAAI,OAAO,SAAS;AAClB,oBAAM,2BAAc,MAAM,yBAAyB,KAAK,oBAAoB;AAAA,MAChF,CAAC;AAAA,IACH,WAAW,OAAO,OAAO,mBAAmB,UAAU;AACpD,gBAAM,2BAAc,MAAM,wCAAwC;AAAA,IACpE;AAAA,EACF;AAEA,MAAI,mBAAmB,UAAU,OAAO,kBAAkB,QAAW;AACnE,QAAI,OAAO,OAAO,kBAAkB,YAAY,OAAO,gBAAgB;AACrE,gBAAM,2BAAc,MAAM,oDAAoD;AAAA,EAClF;AAEA,MAAI,UAAU,UAAU,OAAO,SAAS,QAAW;AACjD,QAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC9B,aAAO,KAAK,QAAQ,CAAC,MAAM,UAAU;AACnC,YAAI,KAAC,uBAAS,IAAI;AAChB,oBAAM,2BAAc,MAAM,eAAe,KAAK,oBAAoB;AAAA,MACtE,CAAC;AAAA,IACH,WAAW,KAAC,uBAAS,OAAO,IAAI,GAAG;AACjC,gBAAM,2BAAc,MAAM,8BAA8B;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,gBAAgB,UAAU,OAAO,eAAe,QAAW;AAC7D,QAAI,MAAM,QAAQ,OAAO,UAAU,GAAG;AACpC,aAAO,WAAW,QAAQ,CAAC,MAAM,UAAU;AACzC,YAAI,KAAC,uBAAS,IAAI;AAChB,oBAAM,2BAAc,MAAM,qBAAqB,KAAK,oBAAoB;AAAA,MAC5E,CAAC;AAAA,IACH,WAAW,KAAC,uBAAS,OAAO,UAAU,GAAG;AACvC,gBAAM,2BAAc,MAAM,oCAAoC;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,iBAAiB,UAAU,OAAO,gBAAgB,QAAW;AAC/D,QAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,cAAc;AACjE,gBAAM,2BAAc,MAAM,kDAAkD;AAAA,EAChF;AAEA,MAAI,oBAAoB,UAAU,OAAO,mBAAmB,QAAW;AACrE,QAAI,OAAO,OAAO,mBAAmB,YAAY,CAAC,CAAC,UAAU,SAAS,eAAe,EAAE,SAAS,OAAO,cAAc;AACnH,gBAAM,2BAAc,MAAM,2EAA2E;AAAA,EACzG;AAEA,MAAI,cAAc,UAAU,OAAO,aAAa,QAAW;AACzD,QAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ;AAChC,gBAAM,2BAAc,MAAM,kCAAkC;AAC9D,WAAO,SAAS,QAAQ,CAAC,SAAS,UAAU;AAC1C,sBAAgB,MAAM,SAAS,mBAAmB,KAAK,GAAG;AAAA,IAC5D,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,UAAU,OAAO,UAAU,QAAW;AACnD,QAAI,OAAO,OAAO,UAAU;AAC1B,gBAAM,2BAAc,MAAM,gCAAgC;AAAA,EAC9D;AAEA,MAAI,cAAc,UAAU,OAAO,aAAa,QAAW;AACzD,QAAI,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClC,aAAO,SAAS,QAAQ,CAAC,MAAM,UAAU;AACvC,YAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,OAAO,KAAK,CAAC,MAAM;AACpF,oBAAM,2BAAc,MAAM,mBAAmB,KAAK,4CAA4C;AAAA,MAClG,CAAC;AAAA,IACH,WAAW,OAAO,OAAO,aAAa,UAAU;AAC9C,gBAAM,2BAAc,MAAM,kCAAkC;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,qBAAqB,UAAU,OAAO,oBAAoB,UAAa,OAAO,oBAAoB,MAAM;AAC1G,QAAI,CAAC,OAAO,mBAAmB,OAAO,OAAO,oBAAoB;AAC/D,gBAAM,2BAAc,MAAM,0CAA0C;AACtE,QAAI,EAAE,SAAS,OAAO,oBAAoB,OAAO,OAAO,gBAAgB,QAAQ,YAAY,OAAO,gBAAgB,MAAM;AACvH,gBAAM,2BAAc,MAAM,0DAA0D;AACtF,QAAI,EAAE,eAAe,OAAO,oBAAoB,OAAO,OAAO,gBAAgB,cAAc,YAAY,OAAO,gBAAgB,YAAY;AACzI,gBAAM,2BAAc,MAAM,gEAAgE;AAAA,EAC9F;AAEA,MAAI,WAAW,UAAU,OAAO,UAAU,UAAa,OAAO,UAAU,MAAM;AAC5E,QAAI,CAAC,OAAO,SAAS,OAAO,OAAO,UAAU;AAC3C,gBAAM,2BAAc,MAAM,gCAAgC;AAC5D,QAAI,EAAE,WAAW,OAAO,UAAU,OAAO,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,QAAQ;AAC/F,gBAAM,2BAAc,MAAM,8CAA8C;AAC1E,QAAI,EAAE,aAAa,OAAO,UAAU,OAAO,OAAO,MAAM,YAAY,YAAY,OAAO,MAAM,UAAU,KAAK,OAAO,MAAM,UAAU,OAAO,MAAM;AAC9I,gBAAM,2BAAc,MAAM,qFAAqF;AAAA,EACnH;AAEA,MAAI,qBAAqB,UAAU,OAAO,oBAAoB,QAAW;AACvE,QAAI,OAAO,OAAO,oBAAoB,YAAY,CAAC,CAAC,OAAO,WAAW,WAAW,MAAM,EAAE,SAAS,OAAO,eAAe;AACtH,gBAAM,2BAAc,MAAM,6EAA6E;AAAA,EAC3G;AAEA,MAAI,cAAc,UAAU,OAAO,aAAa,QAAW;AACzD,QAAI,OAAO,OAAO,aAAa;AAC7B,gBAAM,2BAAc,MAAM,kCAAkC;AAC9D,QAAI,CAAC,UAAAA,QAAG,WAAW,YAAAC,QAAK,QAAQ,MAAM,MAAM,OAAO,QAAQ,CAAC;AAC1D,gBAAM,2BAAc,MAAM,gCAAgC;AAAA,EAC9D;AACF;AAEA,SAAS,gBAAgB,MAAc,SAAkB,OAAe;AACtE,MAAI,OAAO,YAAY,YAAY,CAAC;AAClC,cAAM,2BAAc,MAAM,GAAG,KAAK,oBAAoB;AAExD,MAAI,UAAU,WAAW,QAAQ,SAAS,QAAW;AACnD,QAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAM,2BAAc,MAAM,GAAG,KAAK,wBAAwB;AAAA,EAC9D;AAEA,MAAI,eAAe,WAAW,QAAQ,cAAc,QAAW;AAC7D,QAAI,OAAO,QAAQ,cAAc;AAC/B,gBAAM,2BAAc,MAAM,GAAG,KAAK,6BAA6B;AAAA,EACnE;AAEA,MAAI,gBAAgB,WAAW,QAAQ,eAAe,QAAW;AAC/D,QAAI,OAAO,QAAQ,eAAe,YAAY,QAAQ,aAAa;AACjE,gBAAM,2BAAc,MAAM,GAAG,KAAK,2CAA2C;AAAA,EACjF;AAEA,MAAI,aAAa,WAAW,QAAQ,YAAY,QAAW;AACzD,QAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,UAAU;AAC3D,gBAAM,2BAAc,MAAM,GAAG,KAAK,wCAAwC;AAAA,EAC9E;AAEA,MAAI,aAAa,WAAW,QAAQ,YAAY,QAAW;AACzD,QAAI,OAAO,QAAQ,YAAY;AAC7B,gBAAM,2BAAc,MAAM,GAAG,KAAK,2BAA2B;AAAA,EACjE;AAEA,aAAW,QAAQ,CAAC,cAAc,WAAW,GAAY;AACvD,QAAI,QAAQ,WAAW,QAAQ,IAAI,MAAM,QAAW;AAClD,YAAM,QAAQ,QAAQ,IAAI;AAC1B,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,cAAI,OAAO,SAAS,YAAY,KAAC,uBAAS,IAAI;AAC5C,sBAAM,2BAAc,MAAM,GAAG,KAAK,IAAI,IAAI,IAAI,KAAK,gCAAgC;AAAA,QACvF,CAAC;AAAA,MACH,WAAW,OAAO,UAAU,YAAY,KAAC,uBAAS,KAAK,GAAG;AACxD,kBAAM,2BAAc,MAAM,GAAG,KAAK,IAAI,IAAI,+BAA+B;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,QAAQ,YAAY,QAAW;AACzD,QAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,UAAU;AAC3D,gBAAM,2BAAc,MAAM,GAAG,KAAK,wCAAwC;AAAA,EAC9E;AAEA,MAAI,SAAS,WAAW,QAAQ,QAAQ,QAAW;AACjD,QAAI,CAAC,QAAQ,OAAO,OAAO,QAAQ,QAAQ;AACzC,gBAAM,2BAAc,MAAM,GAAG,KAAK,wBAAwB;AAAA,EAC9D;AAEA,MAAI,qBAAqB,WAAW,QAAQ,oBAAoB,QAAW;AACzE,QAAI,OAAO,QAAQ,oBAAoB;AACrC,gBAAM,2BAAc,MAAM,GAAG,KAAK,oCAAoC;AAAA,EAC1E;AAEA,MAAI,aAAa,WAAW,QAAQ,YAAY,QAAW;AACzD,QAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,WAAW;AAC5D,gBAAM,2BAAc,MAAM,GAAG,KAAK,oCAAoC;AAAA,aAC/D,OAAO,QAAQ,YAAY,YAAY,CAAC,QAAQ,QAAQ,SAAS,GAAG;AAC3E,gBAAM,2BAAc,MAAM,GAAG,KAAK,yCAAyC;AAAA,EAC/E;AACF;AAEO,SAAS,sBAAsB,YAAgD;AACpF,QAAM,wBAAwB,aAAa,YAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU,IAAI,QAAQ,IAAI;AACjG,QAAM,qBAAqB,kBAAkB,qBAAqB;AAClE,SAAO;AAAA,IACL;AAAA,IACA,WAAW,qBAAqB,YAAAA,QAAK,QAAQ,kBAAkB,IAAI;AAAA,EACrE;AACF;AAEA,SAAS,kBAAkB,uBAAmD;AAC5E,QAAM,gBAAgB,CAAC,eAAuB;AAC5C,QAAI,UAAAD,QAAG,WAAW,UAAU;AAC1B,aAAO;AAAA,EACX;AAEA,QAAM,iCAAiC,CAAC,cAAsB;AAC5D,eAAW,OAAO,CAAC,OAAO,OAAO,QAAQ,QAAQ,QAAQ,MAAM,GAAG;AAChE,YAAM,aAAa,cAAc,YAAAC,QAAK,QAAQ,WAAW,sBAAsB,GAAG,CAAC;AACnF,UAAI;AACF,eAAO;AAAA,IACX;AAAA,EACF;AAEA,MAAI,CAAC,UAAAD,QAAG,WAAW,qBAAqB;AACtC,UAAM,IAAI,MAAM,GAAG,qBAAqB,iBAAiB;AAC3D,MAAI,UAAAA,QAAG,SAAS,qBAAqB,EAAE,YAAY,GAAG;AAEpD,UAAM,aAAa,+BAA+B,qBAAqB;AACvE,QAAI;AACF,aAAO;AAET,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,mBAAmB,YAAgC,WAAgC,YAAmD;AAC1J,SAAO,MAAM,WAAW,sBAAsB,UAAU,GAAG,WAAW,UAAU;AAClF;AAEA,eAAsB,iCAAiC;AAErD,SAAO,MAAM,WAAW,EAAE,WAAW,QAAQ,IAAI,EAAE,CAAC;AACtD;",
|
|
6
|
+
"names": ["fs", "path"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/common/esmLoaderHost.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 url from 'url';\n\nimport { addToCompilationCache, serializeCompilationCache } from '../transform/compilationCache';\nimport { PortTransport } from '../transform/portTransport';\nimport { singleTSConfig, transformConfig } from '../transform/transform';\n\nlet loaderChannel: PortTransport | undefined;\n\nexport function registerESMLoader() {\n // Opt-out switch.\n if (process.env.PW_DISABLE_TS_ESM)\n return true;\n\n if (loaderChannel)\n return true;\n\n const register = require('node:module').register;\n if (!register)\n return false;\n\n const { port1, port2 } = new MessageChannel();\n // register will wait until the loader is initialized.\n register(url.pathToFileURL(require.resolve('../transform/esmLoader')), {\n data: { port: port2 },\n transferList: [port2],\n });\n loaderChannel = createPortTransport(port1);\n return true;\n}\n\nfunction createPortTransport(port: MessagePort) {\n return new PortTransport(port, async (method, params) => {\n if (method === 'pushToCompilationCache')\n addToCompilationCache(params.cache);\n });\n}\n\nexport async function startCollectingFileDeps() {\n if (!loaderChannel)\n return;\n await loaderChannel.send('startCollectingFileDeps', {});\n}\n\nexport async function stopCollectingFileDeps(file: string) {\n if (!loaderChannel)\n return;\n await loaderChannel.send('stopCollectingFileDeps', { file });\n}\n\nexport async function incorporateCompilationCache() {\n if (!loaderChannel)\n return;\n // This is needed to gather dependency information from the esm loader\n // that is populated from the resolve hook. We do not need to push\n // this information proactively during load, but gather it at the end.\n const result = await loaderChannel.send('getCompilationCache', {});\n addToCompilationCache(result.cache);\n}\n\nexport async function configureESMLoader() {\n if (!loaderChannel)\n return;\n await loaderChannel.send('setSingleTSConfig', { tsconfig: singleTSConfig() });\n await loaderChannel.send('addToCompilationCache', { cache: serializeCompilationCache() });\n}\n\nexport async function configureESMLoaderTransformConfig() {\n if (!loaderChannel)\n return;\n await loaderChannel.send('setSingleTSConfig', { tsconfig: singleTSConfig() });\n await loaderChannel.send('setTransformConfig', { config: transformConfig() });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,iBAAgB;AAEhB,8BAAiE;AACjE,2BAA8B;AAC9B,uBAAgD;AAEhD,IAAI;AAEG,SAAS,oBAAoB;AAElC,MAAI,QAAQ,IAAI;AACd,WAAO;AAET,MAAI;AACF,WAAO;AAET,QAAM,WAAW,QAAQ,aAAa,EAAE;AACxC,MAAI,CAAC;AACH,WAAO;AAET,QAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAE5C,WAAS,WAAAA,QAAI,cAAc,gBAAgB,wBAAwB,CAAC,GAAG;AAAA,IACrE,MAAM,EAAE,MAAM,MAAM;AAAA,IACpB,cAAc,CAAC,KAAK;AAAA,EACtB,CAAC;AACD,kBAAgB,oBAAoB,KAAK;AACzC,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAmB;AAC9C,SAAO,IAAI,mCAAc,MAAM,OAAO,QAAQ,WAAW;AACvD,QAAI,WAAW;AACb,yDAAsB,OAAO,KAAK;AAAA,EACtC,CAAC;AACH;AAEA,eAAsB,0BAA0B;AAC9C,MAAI,CAAC;AACH;AACF,QAAM,cAAc,KAAK,2BAA2B,CAAC,CAAC;AACxD;AAEA,eAAsB,uBAAuB,MAAc;AACzD,MAAI,CAAC;AACH;AACF,QAAM,cAAc,KAAK,0BAA0B,EAAE,KAAK,CAAC;AAC7D;AAEA,eAAsB,8BAA8B;AAClD,MAAI,CAAC;AACH;AAIF,QAAM,SAAS,MAAM,cAAc,KAAK,uBAAuB,CAAC,CAAC;AACjE,qDAAsB,OAAO,KAAK;AACpC;AAEA,eAAsB,qBAAqB;AACzC,MAAI,CAAC;AACH;AACF,QAAM,cAAc,KAAK,qBAAqB,EAAE,cAAU,iCAAe,EAAE,CAAC;AAC5E,QAAM,cAAc,KAAK,yBAAyB,EAAE,WAAO,mDAA0B,EAAE,CAAC;AAC1F;AAEA,eAAsB,oCAAoC;AACxD,MAAI,CAAC;AACH;AACF,QAAM,cAAc,KAAK,qBAAqB,EAAE,cAAU,iCAAe,EAAE,CAAC;AAC5E,QAAM,cAAc,KAAK,sBAAsB,EAAE,YAAQ,kCAAgB,EAAE,CAAC;AAC9E;",
|
|
6
|
+
"names": ["url"]
|
|
7
|
+
}
|
|
@@ -18,26 +18,11 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var expectBundle_exports = {};
|
|
20
20
|
__export(expectBundle_exports, {
|
|
21
|
-
|
|
22
|
-
EXPECTED_COLOR: () => EXPECTED_COLOR,
|
|
23
|
-
INVERTED_COLOR: () => INVERTED_COLOR,
|
|
24
|
-
RECEIVED_COLOR: () => RECEIVED_COLOR,
|
|
25
|
-
expect: () => expect,
|
|
26
|
-
printReceived: () => printReceived
|
|
21
|
+
expect: () => expect
|
|
27
22
|
});
|
|
28
23
|
module.exports = __toCommonJS(expectBundle_exports);
|
|
29
24
|
const expect = require("./expectBundleImpl").expect;
|
|
30
|
-
const EXPECTED_COLOR = require("./expectBundleImpl").EXPECTED_COLOR;
|
|
31
|
-
const INVERTED_COLOR = require("./expectBundleImpl").INVERTED_COLOR;
|
|
32
|
-
const RECEIVED_COLOR = require("./expectBundleImpl").RECEIVED_COLOR;
|
|
33
|
-
const DIM_COLOR = require("./expectBundleImpl").DIM_COLOR;
|
|
34
|
-
const printReceived = require("./expectBundleImpl").printReceived;
|
|
35
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
36
26
|
0 && (module.exports = {
|
|
37
|
-
|
|
38
|
-
EXPECTED_COLOR,
|
|
39
|
-
INVERTED_COLOR,
|
|
40
|
-
RECEIVED_COLOR,
|
|
41
|
-
expect,
|
|
42
|
-
printReceived
|
|
27
|
+
expect
|
|
43
28
|
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/common/expectBundle.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\nexport const expect: typeof import('../../bundles/expect/node_modules/expect/build').expect = require('./expectBundleImpl').expect;\nexport const EXPECTED_COLOR: typeof import('../../bundles/expect/node_modules/jest-matcher-utils/build').EXPECTED_COLOR = require('./expectBundleImpl').EXPECTED_COLOR;\nexport const INVERTED_COLOR: typeof import('../../bundles/expect/node_modules/jest-matcher-utils/build').INVERTED_COLOR = require('./expectBundleImpl').INVERTED_COLOR;\nexport const RECEIVED_COLOR: typeof import('../../bundles/expect/node_modules/jest-matcher-utils/build').RECEIVED_COLOR = require('./expectBundleImpl').RECEIVED_COLOR;\nexport const DIM_COLOR: typeof import('../../bundles/expect/node_modules/jest-matcher-utils/build').DIM_COLOR = require('./expectBundleImpl').DIM_COLOR;\nexport const printReceived: typeof import('../../bundles/expect/node_modules/jest-matcher-utils/build').printReceived = require('./expectBundleImpl').printReceived;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,MAAM,SAAiF,QAAQ,oBAAoB,EAAE;AACrH,MAAM,iBAA6G,QAAQ,oBAAoB,EAAE;AACjJ,MAAM,iBAA6G,QAAQ,oBAAoB,EAAE;AACjJ,MAAM,iBAA6G,QAAQ,oBAAoB,EAAE;AACjJ,MAAM,YAAmG,QAAQ,oBAAoB,EAAE;AACvI,MAAM,gBAA2G,QAAQ,oBAAoB,EAAE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|