@jsenv/test 1.1.2 → 1.1.4
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.
- package/dist/jsenv_test.js +4 -2
- package/package.json +3 -3
- package/src/coverage/babel_plugin_instrument.js +15 -15
- package/src/coverage/coverage_reporter_html_directory.js +10 -10
- package/src/coverage/coverage_reporter_json_file.js +7 -7
- package/src/coverage/coverage_reporter_text_log.js +8 -8
- package/src/coverage/empty_coverage_factory.js +24 -24
- package/src/coverage/file_by_file_coverage.js +10 -10
- package/src/coverage/istanbul_coverage_composition.js +16 -16
- package/src/coverage/istanbul_coverage_map_from_coverage.js +8 -8
- package/src/coverage/list_files_not_covered.js +4 -4
- package/src/coverage/missing_coverage.js +17 -17
- package/src/coverage/report_to_coverage.js +52 -52
- package/src/coverage/v8_and_istanbul.js +17 -16
- package/src/coverage/v8_coverage.js +8 -8
- package/src/coverage/v8_coverage_composition.js +12 -12
- package/src/coverage/v8_coverage_node_directory.js +42 -42
- package/src/coverage/v8_coverage_to_istanbul.js +45 -45
- package/src/execution/execute.js +21 -21
- package/src/execution/execute_steps.js +129 -129
- package/src/execution/execute_test_plan.js +72 -68
- package/src/execution/execution_colors.js +2 -2
- package/src/execution/execution_steps.js +20 -20
- package/src/execution/gc.js +5 -5
- package/src/execution/logs_file_execution.js +126 -126
- package/src/execution/logs_file_execution.test.mjs +11 -11
- package/src/execution/run.js +51 -51
- package/src/execution/web_server_param.js +24 -24
- package/src/main.js +7 -7
- package/src/runtime_browsers/chromium.js +7 -7
- package/src/runtime_browsers/firefox.js +10 -10
- package/src/runtime_browsers/middleware_istanbul.js +23 -23
- package/src/runtime_browsers/middleware_js_supervisor.js +32 -32
- package/src/runtime_browsers/using_playwright.js +186 -186
- package/src/runtime_browsers/webkit.js +11 -11
- package/src/runtime_node/child_exec_options.js +43 -43
- package/src/runtime_node/controllable_child_process.mjs +47 -47
- package/src/runtime_node/controllable_worker_thread.mjs +37 -37
- package/src/runtime_node/exec_options.js +26 -26
- package/src/runtime_node/execute_using_dynamic_import.js +26 -26
- package/src/runtime_node/exit_codes.js +4 -4
- package/src/runtime_node/importmap_node_loader.mjs +24 -24
- package/src/runtime_node/importmap_node_loader_file_url.js +1 -1
- package/src/runtime_node/kill_process_tree.js +30 -30
- package/src/runtime_node/no_experimental_warnings.cjs +4 -4
- package/src/runtime_node/no_experimental_warnings_file_url.js +1 -1
- package/src/runtime_node/node_child_process.js +128 -128
- package/src/runtime_node/node_execution_performance.js +28 -28
- package/src/runtime_node/node_worker_thread.js +108 -108
- package/src/runtime_node/profiler_v8_coverage.js +21 -21
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { writeFileSync } from "node:fs"
|
|
2
|
-
import { createDetailedMessage } from "@jsenv/log"
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { createDetailedMessage } from "@jsenv/log";
|
|
3
3
|
import {
|
|
4
4
|
Abort,
|
|
5
5
|
createCallbackListNotifiedOnce,
|
|
6
6
|
raceProcessTeardownEvents,
|
|
7
7
|
raceCallbacks,
|
|
8
|
-
} from "@jsenv/abort"
|
|
9
|
-
import { urlIsInsideOf } from "@jsenv/urls"
|
|
10
|
-
import { memoize } from "@jsenv/utils/src/memoize/memoize.js"
|
|
11
|
-
import { WEB_URL_CONVERTER } from "@jsenv/core/src/helpers/web_url_converter.js"
|
|
8
|
+
} from "@jsenv/abort";
|
|
9
|
+
import { urlIsInsideOf } from "@jsenv/urls";
|
|
10
|
+
import { memoize } from "@jsenv/utils/src/memoize/memoize.js";
|
|
11
|
+
import { WEB_URL_CONVERTER } from "@jsenv/core/src/helpers/web_url_converter.js";
|
|
12
12
|
|
|
13
|
-
import { filterV8Coverage } from "../coverage/v8_coverage.js"
|
|
14
|
-
import { composeTwoFileByFileIstanbulCoverages } from "../coverage/istanbul_coverage_composition.js"
|
|
15
|
-
import { initJsSupervisorMiddleware } from "./middleware_js_supervisor.js"
|
|
16
|
-
import { initIstanbulMiddleware } from "./middleware_istanbul.js"
|
|
13
|
+
import { filterV8Coverage } from "../coverage/v8_coverage.js";
|
|
14
|
+
import { composeTwoFileByFileIstanbulCoverages } from "../coverage/istanbul_coverage_composition.js";
|
|
15
|
+
import { initJsSupervisorMiddleware } from "./middleware_js_supervisor.js";
|
|
16
|
+
import { initIstanbulMiddleware } from "./middleware_istanbul.js";
|
|
17
17
|
|
|
18
|
-
const browserPromiseCache = new Map()
|
|
18
|
+
const browserPromiseCache = new Map();
|
|
19
19
|
|
|
20
20
|
export const createRuntimeUsingPlaywright = ({
|
|
21
21
|
browserName,
|
|
@@ -28,7 +28,7 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
28
28
|
playwrightLaunchOptions = {},
|
|
29
29
|
ignoreHTTPSErrors = true,
|
|
30
30
|
}) => {
|
|
31
|
-
const label = `${browserName}${browserVersion}
|
|
31
|
+
const label = `${browserName}${browserVersion}`;
|
|
32
32
|
const runtime = {
|
|
33
33
|
type: "browser",
|
|
34
34
|
name: browserName,
|
|
@@ -36,7 +36,7 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
36
36
|
capabilities: {
|
|
37
37
|
coverageV8: coveragePlaywrightAPIAvailable,
|
|
38
38
|
},
|
|
39
|
-
}
|
|
39
|
+
};
|
|
40
40
|
|
|
41
41
|
runtime.run = async ({
|
|
42
42
|
signal = new AbortController().signal,
|
|
@@ -57,24 +57,24 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
57
57
|
keepRunning,
|
|
58
58
|
onConsole,
|
|
59
59
|
}) => {
|
|
60
|
-
const fileUrl = new URL(fileRelativeUrl, rootDirectoryUrl).href
|
|
60
|
+
const fileUrl = new URL(fileRelativeUrl, rootDirectoryUrl).href;
|
|
61
61
|
if (!urlIsInsideOf(fileUrl, webServer.rootDirectoryUrl)) {
|
|
62
62
|
throw new Error(`Cannot execute file that is outside web server root directory
|
|
63
63
|
--- file ---
|
|
64
64
|
${fileUrl}
|
|
65
65
|
--- web server root directory url ---
|
|
66
|
-
${webServer.rootDirectoryUrl}`)
|
|
66
|
+
${webServer.rootDirectoryUrl}`);
|
|
67
67
|
}
|
|
68
|
-
const fileServerUrl = WEB_URL_CONVERTER.asWebUrl(fileUrl, webServer)
|
|
69
|
-
const cleanupCallbackList = createCallbackListNotifiedOnce()
|
|
68
|
+
const fileServerUrl = WEB_URL_CONVERTER.asWebUrl(fileUrl, webServer);
|
|
69
|
+
const cleanupCallbackList = createCallbackListNotifiedOnce();
|
|
70
70
|
const cleanup = memoize(async (reason) => {
|
|
71
|
-
await cleanupCallbackList.notify({ reason })
|
|
72
|
-
})
|
|
71
|
+
await cleanupCallbackList.notify({ reason });
|
|
72
|
+
});
|
|
73
73
|
|
|
74
|
-
const isBrowserDedicatedToExecution = isolatedTab || !stopAfterAllSignal
|
|
74
|
+
const isBrowserDedicatedToExecution = isolatedTab || !stopAfterAllSignal;
|
|
75
75
|
let browserAndContextPromise = isBrowserDedicatedToExecution
|
|
76
76
|
? null
|
|
77
|
-
: browserPromiseCache.get(label)
|
|
77
|
+
: browserPromiseCache.get(label);
|
|
78
78
|
if (!browserAndContextPromise) {
|
|
79
79
|
browserAndContextPromise = (async () => {
|
|
80
80
|
const browser = await launchBrowserUsingPlaywright({
|
|
@@ -85,82 +85,82 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
85
85
|
...playwrightLaunchOptions,
|
|
86
86
|
headless: headful === undefined ? !keepRunning : !headful,
|
|
87
87
|
},
|
|
88
|
-
})
|
|
88
|
+
});
|
|
89
89
|
if (browser._initializer.version) {
|
|
90
|
-
runtime.version = browser._initializer.version
|
|
90
|
+
runtime.version = browser._initializer.version;
|
|
91
91
|
}
|
|
92
|
-
const browserContext = await browser.newContext({ ignoreHTTPSErrors })
|
|
93
|
-
return { browser, browserContext }
|
|
94
|
-
})()
|
|
92
|
+
const browserContext = await browser.newContext({ ignoreHTTPSErrors });
|
|
93
|
+
return { browser, browserContext };
|
|
94
|
+
})();
|
|
95
95
|
if (!isBrowserDedicatedToExecution) {
|
|
96
|
-
browserPromiseCache.set(label, browserAndContextPromise)
|
|
96
|
+
browserPromiseCache.set(label, browserAndContextPromise);
|
|
97
97
|
cleanupCallbackList.add(() => {
|
|
98
|
-
browserPromiseCache.delete(label)
|
|
99
|
-
})
|
|
98
|
+
browserPromiseCache.delete(label);
|
|
99
|
+
});
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
const { browser, browserContext } = await browserAndContextPromise
|
|
102
|
+
const { browser, browserContext } = await browserAndContextPromise;
|
|
103
103
|
const closeBrowser = async () => {
|
|
104
104
|
const disconnected = browser.isConnected()
|
|
105
105
|
? new Promise((resolve) => {
|
|
106
106
|
const disconnectedCallback = () => {
|
|
107
|
-
browser.removeListener("disconnected", disconnectedCallback)
|
|
108
|
-
resolve()
|
|
109
|
-
}
|
|
110
|
-
browser.on("disconnected", disconnectedCallback)
|
|
107
|
+
browser.removeListener("disconnected", disconnectedCallback);
|
|
108
|
+
resolve();
|
|
109
|
+
};
|
|
110
|
+
browser.on("disconnected", disconnectedCallback);
|
|
111
111
|
})
|
|
112
|
-
: Promise.resolve()
|
|
112
|
+
: Promise.resolve();
|
|
113
113
|
// for some reason without this 150ms timeout
|
|
114
114
|
// browser.close() never resolves (playwright does not like something)
|
|
115
|
-
await new Promise((resolve) => setTimeout(resolve, 150))
|
|
115
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
116
116
|
try {
|
|
117
|
-
await browser.close()
|
|
117
|
+
await browser.close();
|
|
118
118
|
} catch (e) {
|
|
119
119
|
if (isTargetClosedError(e)) {
|
|
120
|
-
return
|
|
120
|
+
return;
|
|
121
121
|
}
|
|
122
|
-
throw e
|
|
122
|
+
throw e;
|
|
123
123
|
}
|
|
124
|
-
await disconnected
|
|
125
|
-
}
|
|
124
|
+
await disconnected;
|
|
125
|
+
};
|
|
126
126
|
|
|
127
|
-
const page = await browserContext.newPage()
|
|
127
|
+
const page = await browserContext.newPage();
|
|
128
128
|
|
|
129
129
|
const istanbulInstrumentationEnabled =
|
|
130
130
|
coverageEnabled &&
|
|
131
131
|
(!runtime.capabilities.coverageV8 ||
|
|
132
|
-
coverageMethodForBrowsers === "istanbul")
|
|
132
|
+
coverageMethodForBrowsers === "istanbul");
|
|
133
133
|
if (istanbulInstrumentationEnabled) {
|
|
134
134
|
await initIstanbulMiddleware(page, {
|
|
135
135
|
webServer,
|
|
136
136
|
rootDirectoryUrl,
|
|
137
137
|
coverageConfig,
|
|
138
|
-
})
|
|
138
|
+
});
|
|
139
139
|
}
|
|
140
140
|
if (!webServer.isJsenvDevServer) {
|
|
141
141
|
await initJsSupervisorMiddleware(page, {
|
|
142
142
|
webServer,
|
|
143
143
|
fileUrl,
|
|
144
144
|
fileServerUrl,
|
|
145
|
-
})
|
|
145
|
+
});
|
|
146
146
|
}
|
|
147
147
|
const closePage = async () => {
|
|
148
148
|
try {
|
|
149
|
-
await page.close()
|
|
149
|
+
await page.close();
|
|
150
150
|
} catch (e) {
|
|
151
151
|
if (isTargetClosedError(e)) {
|
|
152
|
-
return
|
|
152
|
+
return;
|
|
153
153
|
}
|
|
154
|
-
throw e
|
|
154
|
+
throw e;
|
|
155
155
|
}
|
|
156
|
-
}
|
|
156
|
+
};
|
|
157
157
|
|
|
158
158
|
const result = {
|
|
159
159
|
status: "pending",
|
|
160
160
|
namespace: null,
|
|
161
161
|
errors: [],
|
|
162
|
-
}
|
|
163
|
-
const callbacks = []
|
|
162
|
+
};
|
|
163
|
+
const callbacks = [];
|
|
164
164
|
if (coverageEnabled) {
|
|
165
165
|
if (
|
|
166
166
|
runtime.capabilities.coverageV8 &&
|
|
@@ -168,9 +168,9 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
168
168
|
) {
|
|
169
169
|
await page.coverage.startJSCoverage({
|
|
170
170
|
// reportAnonymousScripts: true,
|
|
171
|
-
})
|
|
171
|
+
});
|
|
172
172
|
callbacks.push(async () => {
|
|
173
|
-
const v8CoveragesWithWebUrls = await page.coverage.stopJSCoverage()
|
|
173
|
+
const v8CoveragesWithWebUrls = await page.coverage.stopJSCoverage();
|
|
174
174
|
// we convert urls starting with http:// to file:// because we later
|
|
175
175
|
// convert the url to filesystem path in istanbulCoverageFromV8Coverage function
|
|
176
176
|
const v8CoveragesWithFsUrls = v8CoveragesWithWebUrls.map(
|
|
@@ -178,47 +178,47 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
178
178
|
const fsUrl = WEB_URL_CONVERTER.asFileUrl(
|
|
179
179
|
v8CoveragesWithWebUrl.url,
|
|
180
180
|
webServer,
|
|
181
|
-
)
|
|
181
|
+
);
|
|
182
182
|
return {
|
|
183
183
|
...v8CoveragesWithWebUrl,
|
|
184
184
|
url: fsUrl,
|
|
185
|
-
}
|
|
185
|
+
};
|
|
186
186
|
},
|
|
187
|
-
)
|
|
187
|
+
);
|
|
188
188
|
const coverage = await filterV8Coverage(
|
|
189
189
|
{ result: v8CoveragesWithFsUrls },
|
|
190
190
|
{
|
|
191
191
|
rootDirectoryUrl,
|
|
192
192
|
coverageConfig,
|
|
193
193
|
},
|
|
194
|
-
)
|
|
194
|
+
);
|
|
195
195
|
writeFileSync(
|
|
196
196
|
new URL(coverageFileUrl),
|
|
197
197
|
JSON.stringify(coverage, null, " "),
|
|
198
|
-
)
|
|
199
|
-
})
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
200
|
} else {
|
|
201
201
|
callbacks.push(() => {
|
|
202
|
-
const scriptExecutionResults = result.namespace
|
|
202
|
+
const scriptExecutionResults = result.namespace;
|
|
203
203
|
if (scriptExecutionResults) {
|
|
204
204
|
const coverage =
|
|
205
|
-
generateCoverageForPage(scriptExecutionResults) || {}
|
|
205
|
+
generateCoverageForPage(scriptExecutionResults) || {};
|
|
206
206
|
writeFileSync(
|
|
207
207
|
new URL(coverageFileUrl),
|
|
208
208
|
JSON.stringify(coverage, null, " "),
|
|
209
|
-
)
|
|
209
|
+
);
|
|
210
210
|
}
|
|
211
|
-
})
|
|
211
|
+
});
|
|
212
212
|
}
|
|
213
213
|
} else {
|
|
214
214
|
callbacks.push(() => {
|
|
215
|
-
const scriptExecutionResults = result.namespace
|
|
215
|
+
const scriptExecutionResults = result.namespace;
|
|
216
216
|
if (scriptExecutionResults) {
|
|
217
217
|
Object.keys(scriptExecutionResults).forEach((fileRelativeUrl) => {
|
|
218
|
-
delete scriptExecutionResults[fileRelativeUrl].coverage
|
|
219
|
-
})
|
|
218
|
+
delete scriptExecutionResults[fileRelativeUrl].coverage;
|
|
219
|
+
});
|
|
220
220
|
}
|
|
221
|
-
})
|
|
221
|
+
});
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
if (collectPerformance) {
|
|
@@ -227,26 +227,26 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
227
227
|
/* eslint-disable no-undef */
|
|
228
228
|
/* istanbul ignore next */
|
|
229
229
|
() => {
|
|
230
|
-
const { performance } = window
|
|
230
|
+
const { performance } = window;
|
|
231
231
|
if (!performance) {
|
|
232
|
-
return null
|
|
232
|
+
return null;
|
|
233
233
|
}
|
|
234
|
-
const measures = {}
|
|
235
|
-
const measurePerfEntries = performance.getEntriesByType("measure")
|
|
234
|
+
const measures = {};
|
|
235
|
+
const measurePerfEntries = performance.getEntriesByType("measure");
|
|
236
236
|
measurePerfEntries.forEach((measurePerfEntry) => {
|
|
237
|
-
measures[measurePerfEntry.name] = measurePerfEntry.duration
|
|
238
|
-
})
|
|
237
|
+
measures[measurePerfEntry.name] = measurePerfEntry.duration;
|
|
238
|
+
});
|
|
239
239
|
return {
|
|
240
240
|
timeOrigin: performance.timeOrigin,
|
|
241
241
|
timing: performance.timing.toJSON(),
|
|
242
242
|
navigation: performance.navigation.toJSON(),
|
|
243
243
|
measures,
|
|
244
|
-
}
|
|
244
|
+
};
|
|
245
245
|
},
|
|
246
246
|
/* eslint-enable no-undef */
|
|
247
|
-
)
|
|
248
|
-
result.performance = performance
|
|
249
|
-
})
|
|
247
|
+
);
|
|
248
|
+
result.performance = performance;
|
|
249
|
+
});
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
// https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-console
|
|
@@ -258,18 +258,18 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
258
258
|
onConsole({
|
|
259
259
|
type: consoleMessage.type(),
|
|
260
260
|
text: `${extractTextFromConsoleMessage(consoleMessage)}\n`,
|
|
261
|
-
})
|
|
261
|
+
});
|
|
262
262
|
},
|
|
263
|
-
})
|
|
264
|
-
cleanupCallbackList.add(removeConsoleListener)
|
|
265
|
-
const actionOperation = Abort.startOperation()
|
|
266
|
-
actionOperation.addAbortSignal(signal)
|
|
263
|
+
});
|
|
264
|
+
cleanupCallbackList.add(removeConsoleListener);
|
|
265
|
+
const actionOperation = Abort.startOperation();
|
|
266
|
+
actionOperation.addAbortSignal(signal);
|
|
267
267
|
|
|
268
268
|
const winnerPromise = new Promise((resolve, reject) => {
|
|
269
269
|
raceCallbacks(
|
|
270
270
|
{
|
|
271
271
|
aborted: (cb) => {
|
|
272
|
-
return actionOperation.addAbortCallback(cb)
|
|
272
|
+
return actionOperation.addAbortCallback(cb);
|
|
273
273
|
},
|
|
274
274
|
// https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-error
|
|
275
275
|
error: (cb) => {
|
|
@@ -278,11 +278,11 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
278
278
|
eventType: "error",
|
|
279
279
|
callback: (error) => {
|
|
280
280
|
if (shouldIgnoreError(error, "error")) {
|
|
281
|
-
return
|
|
281
|
+
return;
|
|
282
282
|
}
|
|
283
|
-
cb(transformErrorHook(error))
|
|
283
|
+
cb(transformErrorHook(error));
|
|
284
284
|
},
|
|
285
|
-
})
|
|
285
|
+
});
|
|
286
286
|
},
|
|
287
287
|
// https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-pageerror
|
|
288
288
|
// pageerror: () => {
|
|
@@ -304,157 +304,157 @@ export const createRuntimeUsingPlaywright = ({
|
|
|
304
304
|
// https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md#event-disconnected
|
|
305
305
|
if (isBrowserDedicatedToExecution) {
|
|
306
306
|
browser.on("disconnected", async () => {
|
|
307
|
-
cb({ reason: "browser disconnected" })
|
|
308
|
-
})
|
|
309
|
-
cleanupCallbackList.add(closePage)
|
|
310
|
-
cleanupCallbackList.add(closeBrowser)
|
|
307
|
+
cb({ reason: "browser disconnected" });
|
|
308
|
+
});
|
|
309
|
+
cleanupCallbackList.add(closePage);
|
|
310
|
+
cleanupCallbackList.add(closeBrowser);
|
|
311
311
|
} else {
|
|
312
312
|
const disconnectedCallback = async () => {
|
|
313
|
-
throw new Error("browser disconnected during execution")
|
|
314
|
-
}
|
|
315
|
-
browser.on("disconnected", disconnectedCallback)
|
|
313
|
+
throw new Error("browser disconnected during execution");
|
|
314
|
+
};
|
|
315
|
+
browser.on("disconnected", disconnectedCallback);
|
|
316
316
|
page.on("close", () => {
|
|
317
|
-
cb({ reason: "page closed" })
|
|
318
|
-
})
|
|
319
|
-
cleanupCallbackList.add(closePage)
|
|
317
|
+
cb({ reason: "page closed" });
|
|
318
|
+
});
|
|
319
|
+
cleanupCallbackList.add(closePage);
|
|
320
320
|
cleanupCallbackList.add(() => {
|
|
321
|
-
browser.removeListener("disconnected", disconnectedCallback)
|
|
322
|
-
})
|
|
323
|
-
const notifyPrevious = stopAfterAllSignal.notify
|
|
321
|
+
browser.removeListener("disconnected", disconnectedCallback);
|
|
322
|
+
});
|
|
323
|
+
const notifyPrevious = stopAfterAllSignal.notify;
|
|
324
324
|
stopAfterAllSignal.notify = async () => {
|
|
325
|
-
await notifyPrevious()
|
|
326
|
-
browser.removeListener("disconnected", disconnectedCallback)
|
|
325
|
+
await notifyPrevious();
|
|
326
|
+
browser.removeListener("disconnected", disconnectedCallback);
|
|
327
327
|
logger.debug(
|
|
328
328
|
`stopAfterAllSignal notified -> closing ${browserName}`,
|
|
329
|
-
)
|
|
330
|
-
await closeBrowser()
|
|
331
|
-
}
|
|
329
|
+
);
|
|
330
|
+
await closeBrowser();
|
|
331
|
+
};
|
|
332
332
|
}
|
|
333
333
|
},
|
|
334
334
|
response: async (cb) => {
|
|
335
335
|
try {
|
|
336
|
-
await page.goto(fileServerUrl, { timeout: 0 })
|
|
336
|
+
await page.goto(fileServerUrl, { timeout: 0 });
|
|
337
337
|
const returnValue = await page.evaluate(
|
|
338
338
|
/* eslint-disable no-undef */
|
|
339
339
|
/* istanbul ignore next */
|
|
340
340
|
async () => {
|
|
341
|
-
let startTime
|
|
341
|
+
let startTime;
|
|
342
342
|
try {
|
|
343
|
-
startTime = window.performance.timing.navigationStart
|
|
343
|
+
startTime = window.performance.timing.navigationStart;
|
|
344
344
|
} catch (e) {
|
|
345
|
-
startTime = Date.now()
|
|
345
|
+
startTime = Date.now();
|
|
346
346
|
}
|
|
347
347
|
if (!window.__supervisor__) {
|
|
348
|
-
throw new Error("window.__supervisor__ is undefined")
|
|
348
|
+
throw new Error("window.__supervisor__ is undefined");
|
|
349
349
|
}
|
|
350
350
|
const executionResultFromJsenvSupervisor =
|
|
351
|
-
await window.__supervisor__.getDocumentExecutionResult()
|
|
351
|
+
await window.__supervisor__.getDocumentExecutionResult();
|
|
352
352
|
return {
|
|
353
353
|
type: "window_supervisor",
|
|
354
354
|
startTime,
|
|
355
355
|
endTime: Date.now(),
|
|
356
356
|
executionResults:
|
|
357
357
|
executionResultFromJsenvSupervisor.executionResults,
|
|
358
|
-
}
|
|
358
|
+
};
|
|
359
359
|
},
|
|
360
360
|
/* eslint-enable no-undef */
|
|
361
|
-
)
|
|
362
|
-
cb(returnValue)
|
|
361
|
+
);
|
|
362
|
+
cb(returnValue);
|
|
363
363
|
} catch (e) {
|
|
364
|
-
reject(e)
|
|
364
|
+
reject(e);
|
|
365
365
|
}
|
|
366
366
|
},
|
|
367
367
|
},
|
|
368
368
|
resolve,
|
|
369
|
-
)
|
|
370
|
-
})
|
|
369
|
+
);
|
|
370
|
+
});
|
|
371
371
|
|
|
372
372
|
const writeResult = async () => {
|
|
373
|
-
const winner = await winnerPromise
|
|
373
|
+
const winner = await winnerPromise;
|
|
374
374
|
if (winner.name === "aborted") {
|
|
375
|
-
result.status = "aborted"
|
|
376
|
-
return
|
|
375
|
+
result.status = "aborted";
|
|
376
|
+
return;
|
|
377
377
|
}
|
|
378
378
|
if (winner.name === "error") {
|
|
379
|
-
let error = winner.data
|
|
380
|
-
result.status = "failed"
|
|
381
|
-
result.errors.push(error)
|
|
382
|
-
return
|
|
379
|
+
let error = winner.data;
|
|
380
|
+
result.status = "failed";
|
|
381
|
+
result.errors.push(error);
|
|
382
|
+
return;
|
|
383
383
|
}
|
|
384
384
|
if (winner.name === "pageerror") {
|
|
385
|
-
let error = winner.data
|
|
386
|
-
result.status = "failed"
|
|
387
|
-
result.errors.push(error)
|
|
388
|
-
return
|
|
385
|
+
let error = winner.data;
|
|
386
|
+
result.status = "failed";
|
|
387
|
+
result.errors.push(error);
|
|
388
|
+
return;
|
|
389
389
|
}
|
|
390
390
|
if (winner.name === "closed") {
|
|
391
|
-
result.status = "failed"
|
|
391
|
+
result.status = "failed";
|
|
392
392
|
result.errors.push(
|
|
393
393
|
isBrowserDedicatedToExecution
|
|
394
394
|
? new Error(`browser disconnected during execution`)
|
|
395
395
|
: new Error(`page closed during execution`),
|
|
396
|
-
)
|
|
397
|
-
return
|
|
396
|
+
);
|
|
397
|
+
return;
|
|
398
398
|
}
|
|
399
399
|
// winner.name === "response"
|
|
400
|
-
const { executionResults } = winner.data
|
|
401
|
-
result.status = "completed"
|
|
402
|
-
result.namespace = executionResults
|
|
400
|
+
const { executionResults } = winner.data;
|
|
401
|
+
result.status = "completed";
|
|
402
|
+
result.namespace = executionResults;
|
|
403
403
|
Object.keys(executionResults).forEach((key) => {
|
|
404
|
-
const executionResult = executionResults[key]
|
|
404
|
+
const executionResult = executionResults[key];
|
|
405
405
|
if (executionResult.status === "failed") {
|
|
406
|
-
result.status = "failed"
|
|
406
|
+
result.status = "failed";
|
|
407
407
|
if (executionResult.exception) {
|
|
408
408
|
result.errors.push({
|
|
409
409
|
...executionResult.exception,
|
|
410
410
|
stack: executionResult.exception.text,
|
|
411
|
-
})
|
|
411
|
+
});
|
|
412
412
|
} else {
|
|
413
413
|
result.errors.push({
|
|
414
414
|
...executionResult.error,
|
|
415
415
|
stack: executionResult.error.stack,
|
|
416
|
-
})
|
|
416
|
+
});
|
|
417
417
|
}
|
|
418
418
|
}
|
|
419
|
-
})
|
|
420
|
-
}
|
|
419
|
+
});
|
|
420
|
+
};
|
|
421
421
|
|
|
422
422
|
try {
|
|
423
|
-
await writeResult()
|
|
423
|
+
await writeResult();
|
|
424
424
|
if (collectPerformance) {
|
|
425
|
-
result.performance = performance
|
|
425
|
+
result.performance = performance;
|
|
426
426
|
}
|
|
427
427
|
await callbacks.reduce(async (previous, callback) => {
|
|
428
|
-
await previous
|
|
429
|
-
await callback()
|
|
430
|
-
}, Promise.resolve())
|
|
428
|
+
await previous;
|
|
429
|
+
await callback();
|
|
430
|
+
}, Promise.resolve());
|
|
431
431
|
} catch (e) {
|
|
432
|
-
result.status = "failed"
|
|
433
|
-
result.errors = [e]
|
|
432
|
+
result.status = "failed";
|
|
433
|
+
result.errors = [e];
|
|
434
434
|
}
|
|
435
435
|
if (keepRunning) {
|
|
436
|
-
stopSignal.notify = cleanup
|
|
436
|
+
stopSignal.notify = cleanup;
|
|
437
437
|
} else {
|
|
438
|
-
await cleanup("execution done")
|
|
438
|
+
await cleanup("execution done");
|
|
439
439
|
}
|
|
440
|
-
return result
|
|
441
|
-
}
|
|
442
|
-
return runtime
|
|
443
|
-
}
|
|
440
|
+
return result;
|
|
441
|
+
};
|
|
442
|
+
return runtime;
|
|
443
|
+
};
|
|
444
444
|
|
|
445
445
|
const generateCoverageForPage = (scriptExecutionResults) => {
|
|
446
|
-
let istanbulCoverageComposed = null
|
|
446
|
+
let istanbulCoverageComposed = null;
|
|
447
447
|
Object.keys(scriptExecutionResults).forEach((fileRelativeUrl) => {
|
|
448
|
-
const istanbulCoverage = scriptExecutionResults[fileRelativeUrl].coverage
|
|
448
|
+
const istanbulCoverage = scriptExecutionResults[fileRelativeUrl].coverage;
|
|
449
449
|
istanbulCoverageComposed = istanbulCoverageComposed
|
|
450
450
|
? composeTwoFileByFileIstanbulCoverages(
|
|
451
451
|
istanbulCoverageComposed,
|
|
452
452
|
istanbulCoverage,
|
|
453
453
|
)
|
|
454
|
-
: istanbulCoverage
|
|
455
|
-
})
|
|
456
|
-
return istanbulCoverageComposed
|
|
457
|
-
}
|
|
454
|
+
: istanbulCoverage;
|
|
455
|
+
});
|
|
456
|
+
return istanbulCoverageComposed;
|
|
457
|
+
};
|
|
458
458
|
|
|
459
459
|
const launchBrowserUsingPlaywright = async ({
|
|
460
460
|
signal,
|
|
@@ -462,9 +462,9 @@ const launchBrowserUsingPlaywright = async ({
|
|
|
462
462
|
stopOnExit,
|
|
463
463
|
playwrightLaunchOptions,
|
|
464
464
|
}) => {
|
|
465
|
-
const launchBrowserOperation = Abort.startOperation()
|
|
466
|
-
launchBrowserOperation.addAbortSignal(signal)
|
|
467
|
-
const playwright = await importPlaywright({ browserName })
|
|
465
|
+
const launchBrowserOperation = Abort.startOperation();
|
|
466
|
+
launchBrowserOperation.addAbortSignal(signal);
|
|
467
|
+
const playwright = await importPlaywright({ browserName });
|
|
468
468
|
if (stopOnExit) {
|
|
469
469
|
launchBrowserOperation.addAbortSource((abort) => {
|
|
470
470
|
return raceProcessTeardownEvents(
|
|
@@ -476,10 +476,10 @@ const launchBrowserUsingPlaywright = async ({
|
|
|
476
476
|
exit: true,
|
|
477
477
|
},
|
|
478
478
|
abort,
|
|
479
|
-
)
|
|
480
|
-
})
|
|
479
|
+
);
|
|
480
|
+
});
|
|
481
481
|
}
|
|
482
|
-
const browserClass = playwright[browserName]
|
|
482
|
+
const browserClass = playwright[browserName];
|
|
483
483
|
try {
|
|
484
484
|
const browser = await browserClass.launch({
|
|
485
485
|
...playwrightLaunchOptions,
|
|
@@ -488,24 +488,24 @@ const launchBrowserUsingPlaywright = async ({
|
|
|
488
488
|
handleSIGINT: false,
|
|
489
489
|
handleSIGTERM: false,
|
|
490
490
|
handleSIGHUP: false,
|
|
491
|
-
})
|
|
492
|
-
launchBrowserOperation.throwIfAborted()
|
|
493
|
-
return browser
|
|
491
|
+
});
|
|
492
|
+
launchBrowserOperation.throwIfAborted();
|
|
493
|
+
return browser;
|
|
494
494
|
} catch (e) {
|
|
495
495
|
if (launchBrowserOperation.signal.aborted && isTargetClosedError(e)) {
|
|
496
496
|
// rethrow the abort error
|
|
497
|
-
launchBrowserOperation.throwIfAborted()
|
|
497
|
+
launchBrowserOperation.throwIfAborted();
|
|
498
498
|
}
|
|
499
|
-
throw e
|
|
499
|
+
throw e;
|
|
500
500
|
} finally {
|
|
501
|
-
await launchBrowserOperation.end()
|
|
501
|
+
await launchBrowserOperation.end();
|
|
502
502
|
}
|
|
503
|
-
}
|
|
503
|
+
};
|
|
504
504
|
|
|
505
505
|
const importPlaywright = async ({ browserName }) => {
|
|
506
506
|
try {
|
|
507
|
-
const namespace = await import("playwright")
|
|
508
|
-
return namespace
|
|
507
|
+
const namespace = await import("playwright");
|
|
508
|
+
return namespace;
|
|
509
509
|
} catch (e) {
|
|
510
510
|
if (e.code === "ERR_MODULE_NOT_FOUND") {
|
|
511
511
|
throw new Error(
|
|
@@ -516,24 +516,24 @@ const importPlaywright = async ({ browserName }) => {
|
|
|
516
516
|
},
|
|
517
517
|
),
|
|
518
518
|
{ cause: e },
|
|
519
|
-
)
|
|
519
|
+
);
|
|
520
520
|
}
|
|
521
|
-
throw e
|
|
521
|
+
throw e;
|
|
522
522
|
}
|
|
523
|
-
}
|
|
523
|
+
};
|
|
524
524
|
|
|
525
525
|
const isTargetClosedError = (error) => {
|
|
526
526
|
if (error.message.match(/Protocol error \(.*?\): Target closed/)) {
|
|
527
|
-
return true
|
|
527
|
+
return true;
|
|
528
528
|
}
|
|
529
529
|
if (error.message.match(/Protocol error \(.*?\): Browser.*?closed/)) {
|
|
530
|
-
return true
|
|
530
|
+
return true;
|
|
531
531
|
}
|
|
532
|
-
return error.message.includes("browserContext.close: Browser closed")
|
|
533
|
-
}
|
|
532
|
+
return error.message.includes("browserContext.close: Browser closed");
|
|
533
|
+
};
|
|
534
534
|
|
|
535
535
|
const extractTextFromConsoleMessage = (consoleMessage) => {
|
|
536
|
-
return consoleMessage.text()
|
|
536
|
+
return consoleMessage.text();
|
|
537
537
|
// ensure we use a string so that istanbul won't try
|
|
538
538
|
// to put any coverage statement inside it
|
|
539
539
|
// ideally we should use uneval no ?
|
|
@@ -563,11 +563,11 @@ const extractTextFromConsoleMessage = (consoleMessage) => {
|
|
|
563
563
|
// return `${previous} ${string}`
|
|
564
564
|
// }, "")
|
|
565
565
|
// return text
|
|
566
|
-
}
|
|
566
|
+
};
|
|
567
567
|
|
|
568
568
|
const registerEvent = ({ object, eventType, callback }) => {
|
|
569
|
-
object.on(eventType, callback)
|
|
569
|
+
object.on(eventType, callback);
|
|
570
570
|
return () => {
|
|
571
|
-
object.removeListener(eventType, callback)
|
|
572
|
-
}
|
|
573
|
-
}
|
|
571
|
+
object.removeListener(eventType, callback);
|
|
572
|
+
};
|
|
573
|
+
};
|