@jsenv/test 1.1.2 → 1.1.3
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 +2 -2
- 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
package/src/execution/run.js
CHANGED
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* - File execution result is returned, it contains status/errors/namespace/consoleCalls
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { createId } from "@paralleldrive/cuid2"
|
|
14
|
-
import { Abort, raceCallbacks } from "@jsenv/abort"
|
|
15
|
-
import { ensureParentDirectories } from "@jsenv/filesystem"
|
|
13
|
+
import { createId } from "@paralleldrive/cuid2";
|
|
14
|
+
import { Abort, raceCallbacks } from "@jsenv/abort";
|
|
15
|
+
import { ensureParentDirectories } from "@jsenv/filesystem";
|
|
16
16
|
|
|
17
17
|
export const run = async ({
|
|
18
18
|
signal = new AbortController().signal,
|
|
@@ -31,16 +31,16 @@ export const run = async ({
|
|
|
31
31
|
status: "pending",
|
|
32
32
|
errors: [],
|
|
33
33
|
namespace: null,
|
|
34
|
-
}
|
|
35
|
-
const callbacks = []
|
|
34
|
+
};
|
|
35
|
+
const callbacks = [];
|
|
36
36
|
|
|
37
|
-
const onConsoleRef = { current: () => {} }
|
|
38
|
-
const stopSignal = { notify: () => {} }
|
|
39
|
-
const runtimeLabel = `${runtime.name}/${runtime.version}
|
|
37
|
+
const onConsoleRef = { current: () => {} };
|
|
38
|
+
const stopSignal = { notify: () => {} };
|
|
39
|
+
const runtimeLabel = `${runtime.name}/${runtime.version}`;
|
|
40
40
|
|
|
41
|
-
const runOperation = Abort.startOperation()
|
|
42
|
-
runOperation.addAbortSignal(signal)
|
|
43
|
-
let timeoutAbortSource
|
|
41
|
+
const runOperation = Abort.startOperation();
|
|
42
|
+
runOperation.addAbortSignal(signal);
|
|
43
|
+
let timeoutAbortSource;
|
|
44
44
|
if (
|
|
45
45
|
// ideally we would rather log than the timeout is ignored
|
|
46
46
|
// when keepRunning is true
|
|
@@ -48,59 +48,59 @@ export const run = async ({
|
|
|
48
48
|
typeof allocatedMs === "number" &&
|
|
49
49
|
allocatedMs !== Infinity
|
|
50
50
|
) {
|
|
51
|
-
timeoutAbortSource = runOperation.timeout(allocatedMs)
|
|
51
|
+
timeoutAbortSource = runOperation.timeout(allocatedMs);
|
|
52
52
|
}
|
|
53
|
-
const consoleCalls = []
|
|
53
|
+
const consoleCalls = [];
|
|
54
54
|
onConsoleRef.current = ({ type, text }) => {
|
|
55
55
|
if (mirrorConsole) {
|
|
56
56
|
if (type === "error") {
|
|
57
|
-
process.stderr.write(text)
|
|
57
|
+
process.stderr.write(text);
|
|
58
58
|
} else {
|
|
59
|
-
process.stdout.write(text)
|
|
59
|
+
process.stdout.write(text);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
if (collectConsole) {
|
|
63
|
-
consoleCalls.push({ type, text })
|
|
63
|
+
consoleCalls.push({ type, text });
|
|
64
64
|
}
|
|
65
|
-
}
|
|
65
|
+
};
|
|
66
66
|
if (collectConsole) {
|
|
67
|
-
result.consoleCalls = consoleCalls
|
|
67
|
+
result.consoleCalls = consoleCalls;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// we do not keep coverage in memory, it can grow very big
|
|
71
71
|
// instead we store it on the filesystem
|
|
72
72
|
// and they can be read later at "coverageFileUrl"
|
|
73
|
-
let coverageFileUrl
|
|
73
|
+
let coverageFileUrl;
|
|
74
74
|
if (coverageEnabled) {
|
|
75
75
|
coverageFileUrl = new URL(
|
|
76
76
|
`./${runtime.name}/${createId()}.json`,
|
|
77
77
|
coverageTempDirectoryUrl,
|
|
78
|
-
).href
|
|
79
|
-
await ensureParentDirectories(coverageFileUrl)
|
|
78
|
+
).href;
|
|
79
|
+
await ensureParentDirectories(coverageFileUrl);
|
|
80
80
|
if (coverageEnabled) {
|
|
81
|
-
result.coverageFileUrl = coverageFileUrl
|
|
81
|
+
result.coverageFileUrl = coverageFileUrl;
|
|
82
82
|
// written within the child_process/worker_thread or during runtime.run()
|
|
83
83
|
// for browsers
|
|
84
84
|
// (because it takes time to serialize and transfer the coverage object)
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
const startMs = Date.now()
|
|
88
|
+
const startMs = Date.now();
|
|
89
89
|
callbacks.push(() => {
|
|
90
|
-
result.duration = Date.now() - startMs
|
|
91
|
-
})
|
|
90
|
+
result.duration = Date.now() - startMs;
|
|
91
|
+
});
|
|
92
92
|
|
|
93
93
|
try {
|
|
94
|
-
logger.debug(`run() ${runtimeLabel}`)
|
|
95
|
-
runOperation.throwIfAborted()
|
|
94
|
+
logger.debug(`run() ${runtimeLabel}`);
|
|
95
|
+
runOperation.throwIfAborted();
|
|
96
96
|
const winnerPromise = new Promise((resolve) => {
|
|
97
97
|
raceCallbacks(
|
|
98
98
|
{
|
|
99
99
|
aborted: (cb) => {
|
|
100
|
-
runOperation.signal.addEventListener("abort", cb)
|
|
100
|
+
runOperation.signal.addEventListener("abort", cb);
|
|
101
101
|
return () => {
|
|
102
|
-
runOperation.signal.removeEventListener("abort", cb)
|
|
103
|
-
}
|
|
102
|
+
runOperation.signal.removeEventListener("abort", cb);
|
|
103
|
+
};
|
|
104
104
|
},
|
|
105
105
|
runned: async (cb) => {
|
|
106
106
|
try {
|
|
@@ -114,47 +114,47 @@ export const run = async ({
|
|
|
114
114
|
keepRunning,
|
|
115
115
|
stopSignal,
|
|
116
116
|
onConsole: (log) => onConsoleRef.current(log),
|
|
117
|
-
})
|
|
118
|
-
cb(runResult)
|
|
117
|
+
});
|
|
118
|
+
cb(runResult);
|
|
119
119
|
} catch (e) {
|
|
120
120
|
cb({
|
|
121
121
|
status: "failed",
|
|
122
122
|
errors: [e],
|
|
123
|
-
})
|
|
123
|
+
});
|
|
124
124
|
}
|
|
125
125
|
},
|
|
126
126
|
},
|
|
127
127
|
resolve,
|
|
128
|
-
)
|
|
129
|
-
})
|
|
130
|
-
const winner = await winnerPromise
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
const winner = await winnerPromise;
|
|
131
131
|
if (winner.name === "aborted") {
|
|
132
|
-
runOperation.throwIfAborted()
|
|
132
|
+
runOperation.throwIfAborted();
|
|
133
133
|
}
|
|
134
|
-
const { status, namespace, errors, performance } = winner.data
|
|
135
|
-
result.status = status
|
|
136
|
-
result.errors.push(...errors)
|
|
137
|
-
result.namespace = namespace
|
|
134
|
+
const { status, namespace, errors, performance } = winner.data;
|
|
135
|
+
result.status = status;
|
|
136
|
+
result.errors.push(...errors);
|
|
137
|
+
result.namespace = namespace;
|
|
138
138
|
if (collectPerformance) {
|
|
139
|
-
result.performance = performance
|
|
139
|
+
result.performance = performance;
|
|
140
140
|
}
|
|
141
141
|
} catch (e) {
|
|
142
142
|
if (Abort.isAbortError(e)) {
|
|
143
143
|
if (timeoutAbortSource && timeoutAbortSource.signal.aborted) {
|
|
144
|
-
result.status = "timedout"
|
|
144
|
+
result.status = "timedout";
|
|
145
145
|
} else {
|
|
146
|
-
result.status = "aborted"
|
|
146
|
+
result.status = "aborted";
|
|
147
147
|
}
|
|
148
148
|
} else {
|
|
149
|
-
result.status = "failed"
|
|
150
|
-
result.errors.push(e)
|
|
149
|
+
result.status = "failed";
|
|
150
|
+
result.errors.push(e);
|
|
151
151
|
}
|
|
152
152
|
} finally {
|
|
153
|
-
await runOperation.end()
|
|
153
|
+
await runOperation.end();
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
callbacks.forEach((callback) => {
|
|
157
|
-
callback()
|
|
158
|
-
})
|
|
159
|
-
return result
|
|
160
|
-
}
|
|
157
|
+
callback();
|
|
158
|
+
});
|
|
159
|
+
return result;
|
|
160
|
+
};
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { assertAndNormalizeDirectoryUrl } from "@jsenv/filesystem"
|
|
2
|
-
import { pingServer } from "@jsenv/core/src/helpers/ping_server.js"
|
|
3
|
-
import { basicFetch } from "@jsenv/core/src/helpers/basic_fetch.js"
|
|
1
|
+
import { assertAndNormalizeDirectoryUrl } from "@jsenv/filesystem";
|
|
2
|
+
import { pingServer } from "@jsenv/core/src/helpers/ping_server.js";
|
|
3
|
+
import { basicFetch } from "@jsenv/core/src/helpers/basic_fetch.js";
|
|
4
4
|
|
|
5
5
|
export const assertAndNormalizeWebServer = async (webServer) => {
|
|
6
6
|
if (!webServer) {
|
|
7
7
|
throw new TypeError(
|
|
8
8
|
`webServer is required when running tests on browser(s)`,
|
|
9
|
-
)
|
|
9
|
+
);
|
|
10
10
|
}
|
|
11
11
|
const unexpectedParamNames = Object.keys(webServer).filter((key) => {
|
|
12
|
-
return !["origin", "moduleUrl", "rootDirectoryUrl"].includes(key)
|
|
13
|
-
})
|
|
12
|
+
return !["origin", "moduleUrl", "rootDirectoryUrl"].includes(key);
|
|
13
|
+
});
|
|
14
14
|
if (unexpectedParamNames.length > 0) {
|
|
15
15
|
throw new TypeError(
|
|
16
16
|
`${unexpectedParamNames.join(",")}: there is no such param to webServer`,
|
|
17
|
-
)
|
|
17
|
+
);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
let aServerIsListening = await pingServer(webServer.origin)
|
|
20
|
+
let aServerIsListening = await pingServer(webServer.origin);
|
|
21
21
|
if (!aServerIsListening) {
|
|
22
22
|
if (!webServer.moduleUrl) {
|
|
23
23
|
throw new TypeError(
|
|
24
24
|
`webServer.moduleUrl is required as there is no server listening "${webServer.origin}"`,
|
|
25
|
-
)
|
|
25
|
+
);
|
|
26
26
|
}
|
|
27
27
|
try {
|
|
28
|
-
process.env.IMPORTED_BY_TEST_PLAN = "1"
|
|
29
|
-
await import(webServer.moduleUrl)
|
|
30
|
-
delete process.env.IMPORTED_BY_TEST_PLAN
|
|
28
|
+
process.env.IMPORTED_BY_TEST_PLAN = "1";
|
|
29
|
+
await import(webServer.moduleUrl);
|
|
30
|
+
delete process.env.IMPORTED_BY_TEST_PLAN;
|
|
31
31
|
} catch (e) {
|
|
32
32
|
if (e.code === "ERR_MODULE_NOT_FOUND") {
|
|
33
33
|
throw new Error(
|
|
34
34
|
`webServer.moduleUrl does not lead to a file at "${webServer.moduleUrl}"`,
|
|
35
|
-
)
|
|
35
|
+
);
|
|
36
36
|
}
|
|
37
|
-
throw e
|
|
37
|
+
throw e;
|
|
38
38
|
}
|
|
39
|
-
aServerIsListening = await pingServer(webServer.origin)
|
|
39
|
+
aServerIsListening = await pingServer(webServer.origin);
|
|
40
40
|
if (!aServerIsListening) {
|
|
41
41
|
throw new Error(
|
|
42
42
|
`webServer.moduleUrl did not start a server listening at "${webServer.origin}", check file at "${webServer.moduleUrl}"`,
|
|
43
|
-
)
|
|
43
|
+
);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
const { headers } = await basicFetch(webServer.origin, {
|
|
@@ -49,25 +49,25 @@ export const assertAndNormalizeWebServer = async (webServer) => {
|
|
|
49
49
|
headers: {
|
|
50
50
|
"x-server-inspect": "1",
|
|
51
51
|
},
|
|
52
|
-
})
|
|
52
|
+
});
|
|
53
53
|
if (String(headers["server"]).includes("jsenv_dev_server")) {
|
|
54
|
-
webServer.isJsenvDevServer = true
|
|
54
|
+
webServer.isJsenvDevServer = true;
|
|
55
55
|
const { json } = await basicFetch(`${webServer.origin}/__params__.json`, {
|
|
56
56
|
rejectUnauthorized: false,
|
|
57
|
-
})
|
|
57
|
+
});
|
|
58
58
|
if (webServer.rootDirectoryUrl === undefined) {
|
|
59
|
-
const jsenvDevServerParams = await json()
|
|
60
|
-
webServer.rootDirectoryUrl = jsenvDevServerParams.sourceDirectoryUrl
|
|
59
|
+
const jsenvDevServerParams = await json();
|
|
60
|
+
webServer.rootDirectoryUrl = jsenvDevServerParams.sourceDirectoryUrl;
|
|
61
61
|
} else {
|
|
62
62
|
webServer.rootDirectoryUrl = assertAndNormalizeDirectoryUrl(
|
|
63
63
|
webServer.rootDirectoryUrl,
|
|
64
64
|
"webServer.rootDirectoryUrl",
|
|
65
|
-
)
|
|
65
|
+
);
|
|
66
66
|
}
|
|
67
67
|
} else {
|
|
68
68
|
webServer.rootDirectoryUrl = assertAndNormalizeDirectoryUrl(
|
|
69
69
|
webServer.rootDirectoryUrl,
|
|
70
70
|
"webServer.rootDirectoryUrl",
|
|
71
|
-
)
|
|
71
|
+
);
|
|
72
72
|
}
|
|
73
|
-
}
|
|
73
|
+
};
|
package/src/main.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// test
|
|
2
|
-
export { executeTestPlan } from "./execution/execute_test_plan.js"
|
|
2
|
+
export { executeTestPlan } from "./execution/execute_test_plan.js";
|
|
3
3
|
// runtimes (used to execute tests)
|
|
4
|
-
export { chromium, chromiumIsolatedTab } from "./runtime_browsers/chromium.js"
|
|
5
|
-
export { firefox, firefoxIsolatedTab } from "./runtime_browsers/firefox.js"
|
|
6
|
-
export { webkit, webkitIsolatedTab } from "./runtime_browsers/webkit.js"
|
|
7
|
-
export { nodeChildProcess } from "./runtime_node/node_child_process.js"
|
|
8
|
-
export { nodeWorkerThread } from "./runtime_node/node_worker_thread.js"
|
|
4
|
+
export { chromium, chromiumIsolatedTab } from "./runtime_browsers/chromium.js";
|
|
5
|
+
export { firefox, firefoxIsolatedTab } from "./runtime_browsers/firefox.js";
|
|
6
|
+
export { webkit, webkitIsolatedTab } from "./runtime_browsers/webkit.js";
|
|
7
|
+
export { nodeChildProcess } from "./runtime_node/node_child_process.js";
|
|
8
|
+
export { nodeWorkerThread } from "./runtime_node/node_worker_thread.js";
|
|
9
9
|
// advanced
|
|
10
|
-
export { execute } from "./execution/execute.js"
|
|
10
|
+
export { execute } from "./execution/execute.js";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createRuntimeUsingPlaywright } from "./using_playwright.js"
|
|
1
|
+
import { createRuntimeUsingPlaywright } from "./using_playwright.js";
|
|
2
2
|
|
|
3
3
|
export const chromium = (params) => {
|
|
4
|
-
return createChromiumRuntine(params)
|
|
5
|
-
}
|
|
4
|
+
return createChromiumRuntine(params);
|
|
5
|
+
};
|
|
6
6
|
|
|
7
7
|
export const chromiumIsolatedTab = (params) => {
|
|
8
8
|
return createChromiumRuntine({
|
|
9
9
|
...params,
|
|
10
10
|
isolatedTab: true,
|
|
11
|
-
})
|
|
12
|
-
}
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
13
|
|
|
14
14
|
const createChromiumRuntine = (params) => {
|
|
15
15
|
return createRuntimeUsingPlaywright({
|
|
@@ -19,5 +19,5 @@ const createChromiumRuntine = (params) => {
|
|
|
19
19
|
browserVersion: "unset",
|
|
20
20
|
coveragePlaywrightAPIAvailable: true,
|
|
21
21
|
...params,
|
|
22
|
-
})
|
|
23
|
-
}
|
|
22
|
+
});
|
|
23
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createRuntimeUsingPlaywright } from "./using_playwright.js"
|
|
1
|
+
import { createRuntimeUsingPlaywright } from "./using_playwright.js";
|
|
2
2
|
|
|
3
3
|
export const firefox = (params) => {
|
|
4
|
-
return createFirefoxRuntime(params)
|
|
5
|
-
}
|
|
4
|
+
return createFirefoxRuntime(params);
|
|
5
|
+
};
|
|
6
6
|
|
|
7
7
|
export const firefoxIsolatedTab = (params) => {
|
|
8
8
|
return createRuntimeUsingPlaywright({
|
|
9
9
|
...params,
|
|
10
10
|
isolatedTab: true,
|
|
11
|
-
})
|
|
12
|
-
}
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
13
|
|
|
14
14
|
const createFirefoxRuntime = ({
|
|
15
15
|
disableOnWindowsBecauseFlaky,
|
|
@@ -22,13 +22,13 @@ const createFirefoxRuntime = ({
|
|
|
22
22
|
`Windows + firefox detected: executions on firefox will be ignored (firefox is flaky on windows).
|
|
23
23
|
To disable this warning, use disableOnWindowsBecauseFlaky: true
|
|
24
24
|
To ignore potential flakyness, use disableOnWindowsBecauseFlaky: false`,
|
|
25
|
-
)
|
|
26
|
-
disableOnWindowsBecauseFlaky = true
|
|
25
|
+
);
|
|
26
|
+
disableOnWindowsBecauseFlaky = true;
|
|
27
27
|
}
|
|
28
28
|
if (disableOnWindowsBecauseFlaky) {
|
|
29
29
|
return {
|
|
30
30
|
disabled: true,
|
|
31
|
-
}
|
|
31
|
+
};
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -39,5 +39,5 @@ To ignore potential flakyness, use disableOnWindowsBecauseFlaky: false`,
|
|
|
39
39
|
browserVersion: "unset",
|
|
40
40
|
isolatedTab: true,
|
|
41
41
|
...params,
|
|
42
|
-
})
|
|
43
|
-
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { URL_META } from "@jsenv/url-meta"
|
|
2
|
-
import { applyBabelPlugins } from "@jsenv/ast"
|
|
3
|
-
import { SOURCEMAP, generateSourcemapDataUrl } from "@jsenv/sourcemap"
|
|
4
|
-
import { WEB_URL_CONVERTER } from "@jsenv/core/src/helpers/web_url_converter.js"
|
|
1
|
+
import { URL_META } from "@jsenv/url-meta";
|
|
2
|
+
import { applyBabelPlugins } from "@jsenv/ast";
|
|
3
|
+
import { SOURCEMAP, generateSourcemapDataUrl } from "@jsenv/sourcemap";
|
|
4
|
+
import { WEB_URL_CONVERTER } from "@jsenv/core/src/helpers/web_url_converter.js";
|
|
5
5
|
|
|
6
|
-
import { babelPluginInstrument } from "../coverage/babel_plugin_instrument.js"
|
|
6
|
+
import { babelPluginInstrument } from "../coverage/babel_plugin_instrument.js";
|
|
7
7
|
|
|
8
8
|
export const initIstanbulMiddleware = async (
|
|
9
9
|
page,
|
|
@@ -12,21 +12,21 @@ export const initIstanbulMiddleware = async (
|
|
|
12
12
|
const associations = URL_META.resolveAssociations(
|
|
13
13
|
{ cover: coverageConfig },
|
|
14
14
|
rootDirectoryUrl,
|
|
15
|
-
)
|
|
15
|
+
);
|
|
16
16
|
await page.route("**", async (route) => {
|
|
17
|
-
const request = route.request()
|
|
18
|
-
const url = request.url() // transform into a local url
|
|
19
|
-
const fileUrl = WEB_URL_CONVERTER.asFileUrl(url, webServer)
|
|
17
|
+
const request = route.request();
|
|
18
|
+
const url = request.url(); // transform into a local url
|
|
19
|
+
const fileUrl = WEB_URL_CONVERTER.asFileUrl(url, webServer);
|
|
20
20
|
const needsInstrumentation = URL_META.applyAssociations({
|
|
21
21
|
url: fileUrl,
|
|
22
22
|
associations,
|
|
23
|
-
}).cover
|
|
23
|
+
}).cover;
|
|
24
24
|
if (!needsInstrumentation) {
|
|
25
|
-
route.fallback()
|
|
26
|
-
return
|
|
25
|
+
route.fallback();
|
|
26
|
+
return;
|
|
27
27
|
}
|
|
28
|
-
const response = await route.fetch()
|
|
29
|
-
const originalBody = await response.text()
|
|
28
|
+
const response = await route.fetch();
|
|
29
|
+
const originalBody = await response.text();
|
|
30
30
|
try {
|
|
31
31
|
const result = await applyBabelPlugins({
|
|
32
32
|
babelPlugins: [babelPluginInstrument],
|
|
@@ -38,13 +38,13 @@ export const initIstanbulMiddleware = async (
|
|
|
38
38
|
type: "js_module",
|
|
39
39
|
content: originalBody,
|
|
40
40
|
},
|
|
41
|
-
})
|
|
42
|
-
let code = result.code
|
|
41
|
+
});
|
|
42
|
+
let code = result.code;
|
|
43
43
|
code = SOURCEMAP.writeComment({
|
|
44
44
|
contentType: "text/javascript",
|
|
45
45
|
content: code,
|
|
46
46
|
specifier: generateSourcemapDataUrl(result.map),
|
|
47
|
-
})
|
|
47
|
+
});
|
|
48
48
|
route.fulfill({
|
|
49
49
|
response,
|
|
50
50
|
body: code,
|
|
@@ -52,14 +52,14 @@ export const initIstanbulMiddleware = async (
|
|
|
52
52
|
...response.headers(),
|
|
53
53
|
"content-length": Buffer.byteLength(code),
|
|
54
54
|
},
|
|
55
|
-
})
|
|
55
|
+
});
|
|
56
56
|
} catch (e) {
|
|
57
57
|
if (e.code === "PARSE_ERROR") {
|
|
58
|
-
route.fulfill({ response })
|
|
58
|
+
route.fulfill({ response });
|
|
59
59
|
} else {
|
|
60
|
-
console.error(e)
|
|
61
|
-
route.fulfill({ response })
|
|
60
|
+
console.error(e);
|
|
61
|
+
route.fulfill({ response });
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
})
|
|
65
|
-
}
|
|
64
|
+
});
|
|
65
|
+
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs"
|
|
2
|
-
import { urlToExtension } from "@jsenv/urls"
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { urlToExtension } from "@jsenv/urls";
|
|
3
3
|
import {
|
|
4
4
|
injectSupervisorIntoHTML,
|
|
5
5
|
supervisorFileUrl,
|
|
6
|
-
} from "@jsenv/core/src/plugins/supervisor/html_supervisor_injection.js"
|
|
6
|
+
} from "@jsenv/core/src/plugins/supervisor/html_supervisor_injection.js";
|
|
7
7
|
|
|
8
8
|
export const initJsSupervisorMiddleware = async (
|
|
9
9
|
page,
|
|
10
10
|
{ webServer, fileUrl, fileServerUrl },
|
|
11
11
|
) => {
|
|
12
|
-
const inlineScriptContents = new Map()
|
|
12
|
+
const inlineScriptContents = new Map();
|
|
13
13
|
|
|
14
14
|
const interceptHtmlToExecute = async ({ route }) => {
|
|
15
|
-
const response = await route.fetch()
|
|
16
|
-
const originalBody = await response.text()
|
|
15
|
+
const response = await route.fetch();
|
|
16
|
+
const originalBody = await response.text();
|
|
17
17
|
const injectionResult = await injectSupervisorIntoHTML(
|
|
18
18
|
{
|
|
19
19
|
content: originalBody,
|
|
@@ -27,11 +27,11 @@ export const initJsSupervisorMiddleware = async (
|
|
|
27
27
|
inlineAsRemote: true,
|
|
28
28
|
webServer,
|
|
29
29
|
onInlineScript: ({ src, textContent }) => {
|
|
30
|
-
const inlineScriptWebUrl = new URL(src, `${webServer.origin}/`).href
|
|
31
|
-
inlineScriptContents.set(inlineScriptWebUrl, textContent)
|
|
30
|
+
const inlineScriptWebUrl = new URL(src, `${webServer.origin}/`).href;
|
|
31
|
+
inlineScriptContents.set(inlineScriptWebUrl, textContent);
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
|
-
)
|
|
34
|
+
);
|
|
35
35
|
route.fulfill({
|
|
36
36
|
response,
|
|
37
37
|
body: injectionResult.content,
|
|
@@ -39,11 +39,11 @@ export const initJsSupervisorMiddleware = async (
|
|
|
39
39
|
...response.headers(),
|
|
40
40
|
"content-length": Buffer.byteLength(injectionResult.content),
|
|
41
41
|
},
|
|
42
|
-
})
|
|
43
|
-
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
44
|
|
|
45
45
|
const interceptInlineScript = ({ url, route }) => {
|
|
46
|
-
const inlineScriptContent = inlineScriptContents.get(url)
|
|
46
|
+
const inlineScriptContent = inlineScriptContents.get(url);
|
|
47
47
|
route.fulfill({
|
|
48
48
|
status: 200,
|
|
49
49
|
body: inlineScriptContent,
|
|
@@ -51,14 +51,14 @@ export const initJsSupervisorMiddleware = async (
|
|
|
51
51
|
"content-type": "text/javascript",
|
|
52
52
|
"content-length": Buffer.byteLength(inlineScriptContent),
|
|
53
53
|
},
|
|
54
|
-
})
|
|
55
|
-
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
56
|
|
|
57
57
|
const interceptFileSystemUrl = ({ url, route }) => {
|
|
58
|
-
const relativeUrl = url.slice(webServer.origin.length)
|
|
59
|
-
const fsPath = relativeUrl.slice("/@fs/".length)
|
|
60
|
-
const fsUrl = `file:///${fsPath}
|
|
61
|
-
const fileContent = readFileSync(new URL(fsUrl), "utf8")
|
|
58
|
+
const relativeUrl = url.slice(webServer.origin.length);
|
|
59
|
+
const fsPath = relativeUrl.slice("/@fs/".length);
|
|
60
|
+
const fsUrl = `file:///${fsPath}`;
|
|
61
|
+
const fileContent = readFileSync(new URL(fsUrl), "utf8");
|
|
62
62
|
route.fulfill({
|
|
63
63
|
status: 200,
|
|
64
64
|
body: fileContent,
|
|
@@ -66,33 +66,33 @@ export const initJsSupervisorMiddleware = async (
|
|
|
66
66
|
"content-type": "text/javascript",
|
|
67
67
|
"content-length": Buffer.byteLength(fileContent),
|
|
68
68
|
},
|
|
69
|
-
})
|
|
70
|
-
}
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
71
|
|
|
72
72
|
await page.route("**", async (route) => {
|
|
73
|
-
const request = route.request()
|
|
74
|
-
const url = request.url()
|
|
73
|
+
const request = route.request();
|
|
74
|
+
const url = request.url();
|
|
75
75
|
if (url === fileServerUrl && urlToExtension(url) === ".html") {
|
|
76
76
|
interceptHtmlToExecute({
|
|
77
77
|
url,
|
|
78
78
|
request,
|
|
79
79
|
route,
|
|
80
|
-
})
|
|
81
|
-
return
|
|
80
|
+
});
|
|
81
|
+
return;
|
|
82
82
|
}
|
|
83
83
|
if (inlineScriptContents.has(url)) {
|
|
84
84
|
interceptInlineScript({
|
|
85
85
|
url,
|
|
86
86
|
request,
|
|
87
87
|
route,
|
|
88
|
-
})
|
|
89
|
-
return
|
|
88
|
+
});
|
|
89
|
+
return;
|
|
90
90
|
}
|
|
91
|
-
const fsServerUrl = new URL("/@fs/", webServer.origin)
|
|
91
|
+
const fsServerUrl = new URL("/@fs/", webServer.origin);
|
|
92
92
|
if (url.startsWith(fsServerUrl)) {
|
|
93
|
-
interceptFileSystemUrl({ url, request, route })
|
|
94
|
-
return
|
|
93
|
+
interceptFileSystemUrl({ url, request, route });
|
|
94
|
+
return;
|
|
95
95
|
}
|
|
96
|
-
route.fallback()
|
|
97
|
-
})
|
|
98
|
-
}
|
|
96
|
+
route.fallback();
|
|
97
|
+
});
|
|
98
|
+
};
|