@ohos-ports/web-test-runner 1.0.0-beta.0
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/README.md +65 -0
- package/dist/TestRunnerStartError.d.ts +3 -0
- package/dist/TestRunnerStartError.d.ts.map +1 -0
- package/dist/TestRunnerStartError.js +7 -0
- package/dist/TestRunnerStartError.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -0
- package/dist/config/TestRunnerConfig.d.ts +10 -0
- package/dist/config/TestRunnerConfig.d.ts.map +1 -0
- package/dist/config/TestRunnerConfig.js +3 -0
- package/dist/config/TestRunnerConfig.js.map +1 -0
- package/dist/config/collectGroupConfigs.d.ts +3 -0
- package/dist/config/collectGroupConfigs.d.ts.map +1 -0
- package/dist/config/collectGroupConfigs.js +43 -0
- package/dist/config/collectGroupConfigs.js.map +1 -0
- package/dist/config/loadLauncher.d.ts +3 -0
- package/dist/config/loadLauncher.d.ts.map +1 -0
- package/dist/config/loadLauncher.js +43 -0
- package/dist/config/loadLauncher.js.map +1 -0
- package/dist/config/mergeConfigs.d.ts +3 -0
- package/dist/config/mergeConfigs.d.ts.map +1 -0
- package/dist/config/mergeConfigs.js +26 -0
- package/dist/config/mergeConfigs.js.map +1 -0
- package/dist/config/parseConfig.d.ts +9 -0
- package/dist/config/parseConfig.d.ts.map +1 -0
- package/dist/config/parseConfig.js +216 -0
- package/dist/config/parseConfig.js.map +1 -0
- package/dist/config/readCliArgs.d.ts +15 -0
- package/dist/config/readCliArgs.d.ts.map +1 -0
- package/dist/config/readCliArgs.js +148 -0
- package/dist/config/readCliArgs.js.map +1 -0
- package/dist/config/readFileConfig.d.ts +18 -0
- package/dist/config/readFileConfig.d.ts.map +1 -0
- package/dist/config/readFileConfig.js +22 -0
- package/dist/config/readFileConfig.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/TestRunnerLogger.d.ts +15 -0
- package/dist/logger/TestRunnerLogger.d.ts.map +1 -0
- package/dist/logger/TestRunnerLogger.js +48 -0
- package/dist/logger/TestRunnerLogger.js.map +1 -0
- package/dist/reporter/defaultReporter.d.ts +7 -0
- package/dist/reporter/defaultReporter.d.ts.map +1 -0
- package/dist/reporter/defaultReporter.js +51 -0
- package/dist/reporter/defaultReporter.js.map +1 -0
- package/dist/reporter/dotReporter.d.ts +4 -0
- package/dist/reporter/dotReporter.d.ts.map +1 -0
- package/dist/reporter/dotReporter.js +53 -0
- package/dist/reporter/dotReporter.js.map +1 -0
- package/dist/reporter/getCodeCoverage.d.ts +3 -0
- package/dist/reporter/getCodeCoverage.d.ts.map +1 -0
- package/dist/reporter/getCodeCoverage.js +36 -0
- package/dist/reporter/getCodeCoverage.js.map +1 -0
- package/dist/reporter/getTestProgress.d.ts +16 -0
- package/dist/reporter/getTestProgress.d.ts.map +1 -0
- package/dist/reporter/getTestProgress.js +105 -0
- package/dist/reporter/getTestProgress.js.map +1 -0
- package/dist/reporter/renderProgressBar.d.ts +2 -0
- package/dist/reporter/renderProgressBar.d.ts.map +1 -0
- package/dist/reporter/renderProgressBar.js +23 -0
- package/dist/reporter/renderProgressBar.js.map +1 -0
- package/dist/reporter/reportBrowserLogs.d.ts +3 -0
- package/dist/reporter/reportBrowserLogs.d.ts.map +1 -0
- package/dist/reporter/reportBrowserLogs.js +61 -0
- package/dist/reporter/reportBrowserLogs.js.map +1 -0
- package/dist/reporter/reportRequest404s.d.ts +3 -0
- package/dist/reporter/reportRequest404s.d.ts.map +1 -0
- package/dist/reporter/reportRequest404s.js +54 -0
- package/dist/reporter/reportRequest404s.js.map +1 -0
- package/dist/reporter/reportTestFileErrors.d.ts +3 -0
- package/dist/reporter/reportTestFileErrors.d.ts.map +1 -0
- package/dist/reporter/reportTestFileErrors.js +52 -0
- package/dist/reporter/reportTestFileErrors.js.map +1 -0
- package/dist/reporter/reportTestFileResults.d.ts +3 -0
- package/dist/reporter/reportTestFileResults.d.ts.map +1 -0
- package/dist/reporter/reportTestFileResults.js +25 -0
- package/dist/reporter/reportTestFileResults.js.map +1 -0
- package/dist/reporter/reportTestsErrors.d.ts +4 -0
- package/dist/reporter/reportTestsErrors.d.ts.map +1 -0
- package/dist/reporter/reportTestsErrors.js +129 -0
- package/dist/reporter/reportTestsErrors.js.map +1 -0
- package/dist/reporter/summaryReporter.d.ts +10 -0
- package/dist/reporter/summaryReporter.d.ts.map +1 -0
- package/dist/reporter/summaryReporter.js +73 -0
- package/dist/reporter/summaryReporter.js.map +1 -0
- package/dist/reporter/utils/getFailedOnBrowsers.d.ts +2 -0
- package/dist/reporter/utils/getFailedOnBrowsers.d.ts.map +1 -0
- package/dist/reporter/utils/getFailedOnBrowsers.js +13 -0
- package/dist/reporter/utils/getFailedOnBrowsers.js.map +1 -0
- package/dist/reporter/utils/getFlattenedTestResults.d.ts +3 -0
- package/dist/reporter/utils/getFlattenedTestResults.d.ts.map +1 -0
- package/dist/reporter/utils/getFlattenedTestResults.js +21 -0
- package/dist/reporter/utils/getFlattenedTestResults.js.map +1 -0
- package/dist/reporter/utils/getPassedFailedSkippedCount.d.ts +7 -0
- package/dist/reporter/utils/getPassedFailedSkippedCount.d.ts.map +1 -0
- package/dist/reporter/utils/getPassedFailedSkippedCount.js +30 -0
- package/dist/reporter/utils/getPassedFailedSkippedCount.js.map +1 -0
- package/dist/reporter/utils/toBrowserPath.d.ts +2 -0
- package/dist/reporter/utils/toBrowserPath.d.ts.map +1 -0
- package/dist/reporter/utils/toBrowserPath.js +11 -0
- package/dist/reporter/utils/toBrowserPath.js.map +1 -0
- package/dist/reporter/utils/toFilePath.d.ts +6 -0
- package/dist/reporter/utils/toFilePath.d.ts.map +1 -0
- package/dist/reporter/utils/toFilePath.js +15 -0
- package/dist/reporter/utils/toFilePath.js.map +1 -0
- package/dist/startTestRunner.d.ts +33 -0
- package/dist/startTestRunner.d.ts.map +1 -0
- package/dist/startTestRunner.js +61 -0
- package/dist/startTestRunner.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.mjs +38 -0
- package/package.json +107 -0
- package/scripts/ohos-postinstall-sign.js +117 -0
- package/src/TestRunnerStartError.ts +1 -0
- package/src/bin.ts +4 -0
- package/src/config/TestRunnerConfig.ts +14 -0
- package/src/config/collectGroupConfigs.ts +50 -0
- package/src/config/loadLauncher.ts +48 -0
- package/src/config/mergeConfigs.ts +26 -0
- package/src/config/parseConfig.ts +286 -0
- package/src/config/readCliArgs.ts +187 -0
- package/src/config/readFileConfig.ts +35 -0
- package/src/index.ts +11 -0
- package/src/logger/TestRunnerLogger.ts +54 -0
- package/src/reporter/defaultReporter.ts +78 -0
- package/src/reporter/dotReporter.ts +65 -0
- package/src/reporter/getCodeCoverage.ts +54 -0
- package/src/reporter/getTestProgress.ts +181 -0
- package/src/reporter/renderProgressBar.ts +27 -0
- package/src/reporter/reportBrowserLogs.ts +64 -0
- package/src/reporter/reportRequest404s.ts +55 -0
- package/src/reporter/reportTestFileErrors.ts +70 -0
- package/src/reporter/reportTestFileResults.ts +33 -0
- package/src/reporter/reportTestsErrors.ts +110 -0
- package/src/reporter/summaryReporter.ts +123 -0
- package/src/reporter/utils/getFailedOnBrowsers.ts +10 -0
- package/src/reporter/utils/getFlattenedTestResults.ts +24 -0
- package/src/reporter/utils/getPassedFailedSkippedCount.ts +31 -0
- package/src/reporter/utils/toBrowserPath.ts +5 -0
- package/src/reporter/utils/toFilePath.ts +9 -0
- package/src/startTestRunner.ts +101 -0
- package/web-test-runner.config.mjs +8 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.summaryReporter = summaryReporter;
|
|
4
|
+
const reportTestFileErrors_js_1 = require("./reportTestFileErrors.js");
|
|
5
|
+
const reportTestsErrors_js_1 = require("./reportTestsErrors.js");
|
|
6
|
+
const TestRunnerLogger_js_1 = require("../logger/TestRunnerLogger.js");
|
|
7
|
+
const reportBrowserLogs_js_1 = require("./reportBrowserLogs.js");
|
|
8
|
+
const color = ([x, y]) => (z) => `\x1b[${x}m${z}\x1b[${y}m${reset}`;
|
|
9
|
+
const reset = `\x1b[0m\x1b[0m`;
|
|
10
|
+
const green = color([32, 89]);
|
|
11
|
+
const red = color([31, 89]);
|
|
12
|
+
const dim = color([2, 0]);
|
|
13
|
+
/** Test reporter that summarizes all test for a given run */
|
|
14
|
+
function summaryReporter(opts) {
|
|
15
|
+
const { flatten = false, reportTestLogs = true, reportTestErrors = true } = opts ?? {};
|
|
16
|
+
let args;
|
|
17
|
+
let favoriteBrowser;
|
|
18
|
+
const testLogger = new TestRunnerLogger_js_1.TestRunnerLogger();
|
|
19
|
+
function log(logger, name, passed, skipped, prefix = ' ', postfix = '') {
|
|
20
|
+
const sign = skipped ? dim('-') : passed ? green('✓') : red('𐄂');
|
|
21
|
+
if (flatten)
|
|
22
|
+
logger.log(`${sign} ${name}${postfix}`);
|
|
23
|
+
else
|
|
24
|
+
logger.log(`${prefix} ${sign} ${name}`);
|
|
25
|
+
}
|
|
26
|
+
function logResults(logger, results, prefix, browser) {
|
|
27
|
+
const browserName = browser?.name ? ` ${dim(`[${browser.name}]`)}` : '';
|
|
28
|
+
for (const result of results?.tests ?? []) {
|
|
29
|
+
log(logger, flatten ? `${prefix ?? ''} ${result.name}` : result.name, result.passed, result.skipped, prefix, browserName);
|
|
30
|
+
}
|
|
31
|
+
for (const suite of results?.suites ?? []) {
|
|
32
|
+
logSuite(logger, suite, prefix, browser);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function logSuite(logger, suite, parent, browser) {
|
|
36
|
+
const browserName = browser?.name ? ` ${dim(`[${browser.name}]`)}` : '';
|
|
37
|
+
let pref = parent ? `${parent} ` : ' ';
|
|
38
|
+
if (flatten)
|
|
39
|
+
pref += `${suite.name}`;
|
|
40
|
+
else
|
|
41
|
+
logger.log(`${pref}${suite.name}${browserName}`);
|
|
42
|
+
logResults(logger, suite, pref, browser);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
start(_args) {
|
|
46
|
+
args = _args;
|
|
47
|
+
favoriteBrowser =
|
|
48
|
+
args.browserNames.find(name => {
|
|
49
|
+
const n = name.toLowerCase();
|
|
50
|
+
return n.includes('chrome') || n.includes('chromium') || n.includes('firefox');
|
|
51
|
+
}) ?? args.browserNames[0];
|
|
52
|
+
},
|
|
53
|
+
reportTestFileResults({ logger, sessionsForTestFile }) {
|
|
54
|
+
for (const session of sessionsForTestFile) {
|
|
55
|
+
logResults(logger, session.testResults, '', session.browser);
|
|
56
|
+
logger.log('');
|
|
57
|
+
}
|
|
58
|
+
if (reportTestLogs)
|
|
59
|
+
(0, reportBrowserLogs_js_1.reportBrowserLogs)(logger, sessionsForTestFile);
|
|
60
|
+
},
|
|
61
|
+
onTestRunFinished({ sessions }) {
|
|
62
|
+
if (reportTestErrors) {
|
|
63
|
+
const failedSessions = sessions.filter(s => !s.passed);
|
|
64
|
+
if (failedSessions.length > 0) {
|
|
65
|
+
testLogger.log('\n\nErrors Reported in Tests:\n\n');
|
|
66
|
+
(0, reportTestsErrors_js_1.reportTestsErrors)(testLogger, args.browserNames, favoriteBrowser, failedSessions);
|
|
67
|
+
(0, reportTestFileErrors_js_1.reportTestFileErrors)(testLogger, args.browserNames, favoriteBrowser, failedSessions, true);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=summaryReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryReporter.js","sourceRoot":"","sources":["../../src/reporter/summaryReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFailedOnBrowsers.d.ts","sourceRoot":"","sources":["../../../src/reporter/utils/getFailedOnBrowsers.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,UAStF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFailedOnBrowsers = getFailedOnBrowsers;
|
|
4
|
+
function getFailedOnBrowsers(allBrowserNames, failedBrowsers) {
|
|
5
|
+
if (allBrowserNames.length === 1 || failedBrowsers.length === allBrowserNames.length) {
|
|
6
|
+
return '';
|
|
7
|
+
}
|
|
8
|
+
const browserString = failedBrowsers.length === 1
|
|
9
|
+
? failedBrowsers[0]
|
|
10
|
+
: failedBrowsers.slice(0, -1).join(', ') + ' and ' + failedBrowsers.slice(-1);
|
|
11
|
+
return ` (failed on ${browserString})`;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=getFailedOnBrowsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFailedOnBrowsers.js","sourceRoot":"","sources":["../../../src/reporter/utils/getFailedOnBrowsers.ts"],"names":[],"mappings":";;AAAA,kDASC;AATD,SAAgB,mBAAmB,CAAC,eAAyB,EAAE,cAAwB;IACrF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;QACrF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,KAAK,CAAC;QACzB,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,eAAe,aAAa,GAAG,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFlattenedTestResults.d.ts","sourceRoot":"","sources":["../../../src/reporter/utils/getFlattenedTestResults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE9E,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,eAAe,gBAqBnE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFlattenedTestResults = getFlattenedTestResults;
|
|
4
|
+
function getFlattenedTestResults(testResults) {
|
|
5
|
+
const flattened = [];
|
|
6
|
+
function collectTests(prefix, tests) {
|
|
7
|
+
for (const test of tests) {
|
|
8
|
+
flattened.push({ ...test, name: `${prefix}${test.name}` });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function collectSuite(prefix, suite) {
|
|
12
|
+
collectTests(prefix, suite.tests);
|
|
13
|
+
for (const childSuite of suite.suites) {
|
|
14
|
+
const newPrefix = `${prefix}${childSuite.name} > `;
|
|
15
|
+
collectSuite(newPrefix, childSuite);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
collectSuite('', testResults);
|
|
19
|
+
return flattened;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=getFlattenedTestResults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFlattenedTestResults.js","sourceRoot":"","sources":["../../../src/reporter/utils/getFlattenedTestResults.ts"],"names":[],"mappings":";;AAEA,0DAqBC;AArBD,SAAgB,uBAAuB,CAAC,WAA4B;IAClE,MAAM,SAAS,GAAiB,EAAE,CAAC;IAEnC,SAAS,YAAY,CAAC,MAAc,EAAE,KAAmB;QACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,SAAS,YAAY,CAAC,MAAc,EAAE,KAAsB;QAC1D,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAElC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,GAAG,MAAM,GAAG,UAAU,CAAC,IAAI,KAAK,CAAC;YACnD,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAE9B,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type TestSuiteResult } from '@web/test-runner-core';
|
|
2
|
+
export declare function getPassedFailedSkippedCount(testResults: TestSuiteResult): {
|
|
3
|
+
passed: number;
|
|
4
|
+
failed: number;
|
|
5
|
+
skipped: number;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=getPassedFailedSkippedCount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPassedFailedSkippedCount.d.ts","sourceRoot":"","sources":["../../../src/reporter/utils/getPassedFailedSkippedCount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE9E,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,eAAe;;;;EA4BvE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPassedFailedSkippedCount = getPassedFailedSkippedCount;
|
|
4
|
+
function getPassedFailedSkippedCount(testResults) {
|
|
5
|
+
let passed = 0;
|
|
6
|
+
let failed = 0;
|
|
7
|
+
let skipped = 0;
|
|
8
|
+
function collectTests(tests) {
|
|
9
|
+
for (const test of tests) {
|
|
10
|
+
if (test.skipped) {
|
|
11
|
+
skipped += 1;
|
|
12
|
+
}
|
|
13
|
+
else if (test.passed) {
|
|
14
|
+
passed += 1;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
failed += 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function collectSuite(suite) {
|
|
22
|
+
collectTests(suite.tests);
|
|
23
|
+
for (const childSuite of suite.suites) {
|
|
24
|
+
collectSuite(childSuite);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
collectSuite(testResults);
|
|
28
|
+
return { passed, failed, skipped };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=getPassedFailedSkippedCount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPassedFailedSkippedCount.js","sourceRoot":"","sources":["../../../src/reporter/utils/getPassedFailedSkippedCount.ts"],"names":[],"mappings":";;AAEA,kEA4BC;AA5BD,SAAgB,2BAA2B,CAAC,WAA4B;IACtE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,SAAS,YAAY,CAAC,KAAmB;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,YAAY,CAAC,KAAsB;QAC1C,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toBrowserPath.d.ts","sourceRoot":"","sources":["../../../src/reporter/utils/toBrowserPath.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,UAE7C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toBrowserPath = toBrowserPath;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
function toBrowserPath(filePath) {
|
|
9
|
+
return filePath.split(path_1.default.sep).join('/');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=toBrowserPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toBrowserPath.js","sourceRoot":"","sources":["../../../src/reporter/utils/toBrowserPath.ts"],"names":[],"mappings":";;;;;AAEA,sCAEC;AAJD,gDAAwB;AAExB,SAAgB,aAAa,CAAC,QAAgB;IAC5C,OAAO,QAAQ,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toFilePath.d.ts","sourceRoot":"","sources":["../../../src/reporter/utils/toFilePath.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,UAE7C"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.toFilePath = toFilePath;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
/**
|
|
9
|
+
* Transforms a file system path to a browser URL. For example windows uses `\` on the file system,
|
|
10
|
+
* but it should use `/` in the browser.
|
|
11
|
+
*/
|
|
12
|
+
function toFilePath(browserPath) {
|
|
13
|
+
return browserPath.split('/').join(path_1.default.sep);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=toFilePath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toFilePath.js","sourceRoot":"","sources":["../../../src/reporter/utils/toFilePath.ts"],"names":[],"mappings":";;;;;AAMA,gCAEC;AARD,gDAAwB;AAExB;;;GAGG;AACH,SAAgB,UAAU,CAAC,WAAmB;IAC5C,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { TestRunner } from '@web/test-runner-core';
|
|
2
|
+
import { TestRunnerConfig } from './config/TestRunnerConfig.js';
|
|
3
|
+
export interface StartTestRunnerParams {
|
|
4
|
+
/**
|
|
5
|
+
* Optional config to merge with the user-defined config.
|
|
6
|
+
*/
|
|
7
|
+
config?: Partial<TestRunnerConfig>;
|
|
8
|
+
/**
|
|
9
|
+
* Whether to read CLI args. Default true.
|
|
10
|
+
*/
|
|
11
|
+
readCliArgs?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Whether to read a user config from the file system. Default true.
|
|
14
|
+
*/
|
|
15
|
+
readFileConfig?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Name of the configuration to read. Defaults to web-dev-server.config.{mjs,cjs,js}
|
|
18
|
+
*/
|
|
19
|
+
configName?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Whether to automatically exit the process when the server is stopped, killed or an error is thrown.
|
|
22
|
+
*/
|
|
23
|
+
autoExitProcess?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Array to read the CLI args from. Defaults to process.argv.
|
|
26
|
+
*/
|
|
27
|
+
argv?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Starts the test runner.
|
|
31
|
+
*/
|
|
32
|
+
export declare function startTestRunner(options?: StartTestRunnerParams): Promise<TestRunner | undefined>;
|
|
33
|
+
//# sourceMappingURL=startTestRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startTestRunner.d.ts","sourceRoot":"","sources":["../src/startTestRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAMhE,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,qBAA0B,mCA4DxE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startTestRunner = startTestRunner;
|
|
4
|
+
const test_runner_core_1 = require("@web/test-runner-core");
|
|
5
|
+
const nanocolors_1 = require("nanocolors");
|
|
6
|
+
const TestRunnerStartError_js_1 = require("./TestRunnerStartError.js");
|
|
7
|
+
const mergeConfigs_js_1 = require("./config/mergeConfigs.js");
|
|
8
|
+
const parseConfig_js_1 = require("./config/parseConfig.js");
|
|
9
|
+
const readCliArgs_js_1 = require("./config/readCliArgs.js");
|
|
10
|
+
const readFileConfig_js_1 = require("./config/readFileConfig.js");
|
|
11
|
+
/**
|
|
12
|
+
* Starts the test runner.
|
|
13
|
+
*/
|
|
14
|
+
async function startTestRunner(options = {}) {
|
|
15
|
+
const { config: extraConfig, readCliArgs: readCliArgsFlag = true, readFileConfig: readFileConfigFlag = true, configName, autoExitProcess = true, argv = process.argv, } = options;
|
|
16
|
+
try {
|
|
17
|
+
const cliArgs = readCliArgsFlag ? (0, readCliArgs_js_1.readCliArgs)({ argv }) : {};
|
|
18
|
+
const rawConfig = readFileConfigFlag
|
|
19
|
+
? await (0, readFileConfig_js_1.readFileConfig)({ configName, configPath: cliArgs.config })
|
|
20
|
+
: {};
|
|
21
|
+
const mergedConfig = (0, mergeConfigs_js_1.mergeConfigs)(extraConfig, rawConfig);
|
|
22
|
+
const { config, groupConfigs } = await (0, parseConfig_js_1.parseConfig)(mergedConfig, cliArgs);
|
|
23
|
+
const runner = new test_runner_core_1.TestRunner(config, groupConfigs);
|
|
24
|
+
const cli = new test_runner_core_1.TestRunnerCli(config, runner);
|
|
25
|
+
function stop() {
|
|
26
|
+
runner.stop();
|
|
27
|
+
}
|
|
28
|
+
if (autoExitProcess) {
|
|
29
|
+
['exit', 'SIGINT'].forEach(event => {
|
|
30
|
+
process.on(event, stop);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (autoExitProcess) {
|
|
34
|
+
process.on('uncaughtException', error => {
|
|
35
|
+
console.error(`Uncaught exception, stopping test runner..\n`, error);
|
|
36
|
+
stop();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
runner.on('stopped', passed => {
|
|
40
|
+
if (autoExitProcess) {
|
|
41
|
+
process.exit(passed ? 0 : 1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
await runner.start();
|
|
45
|
+
cli.start();
|
|
46
|
+
return runner;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof TestRunnerStartError_js_1.TestRunnerStartError) {
|
|
50
|
+
console.error(`\n${(0, nanocolors_1.red)('Error:')} ${error.message}\n`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.error(error);
|
|
54
|
+
}
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
// exit after a timeout to allow CLI to flush console output
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}, 0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=startTestRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startTestRunner.js","sourceRoot":"","sources":["../src/startTestRunner.ts"],"names":[],"mappings":";;AAwCA,0CA4DC;AApGD,4DAAkE;AAClE,2CAAiC;AAEjC,uEAAiE;AAEjE,8DAAwD;AACxD,4DAAsD;AACtD,4DAAsD;AACtD,kEAA4D;AA6B5D;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,UAAiC,EAAE;IACvE,MAAM,EACJ,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,eAAe,GAAG,IAAI,EACnC,cAAc,EAAE,kBAAkB,GAAG,IAAI,EACzC,UAAU,EACV,eAAe,GAAG,IAAI,EACtB,IAAI,GAAG,OAAO,CAAC,IAAI,GACpB,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,IAAA,4BAAW,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,kBAAkB;YAClC,CAAC,CAAC,MAAM,IAAA,kCAAc,EAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAClE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,YAAY,GAAG,IAAA,8BAAY,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,4BAAW,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAG,IAAI,6BAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,gCAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE9C,SAAS,IAAI;YACX,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACnB,CAAC,MAAM,EAAE,QAAQ,CAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACvD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,CAAC,EAAE;gBACtC,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;gBACrE,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;YAC5B,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,8CAAoB,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,IAAA,gBAAG,EAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,UAAU,CAAC,GAAG,EAAE;YACd,4DAA4D;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;AACH,CAAC"}
|
package/index.d.ts
ADDED
package/index.mjs
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// this file is autogenerated with the generate-mjs-dts-entrypoints script
|
|
2
|
+
import cjsEntrypoint from './dist/index.js';
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
chromeLauncher,
|
|
6
|
+
startTestRunner,
|
|
7
|
+
defaultReporter,
|
|
8
|
+
summaryReporter,
|
|
9
|
+
dotReporter,
|
|
10
|
+
formatError,
|
|
11
|
+
constants,
|
|
12
|
+
TestRunner,
|
|
13
|
+
TestRunnerCli,
|
|
14
|
+
BufferedLogger,
|
|
15
|
+
TestSessionManager,
|
|
16
|
+
SESSION_STATUS,
|
|
17
|
+
EventEmitter,
|
|
18
|
+
isTestFilePath,
|
|
19
|
+
fetchSourceMap,
|
|
20
|
+
} = cjsEntrypoint;
|
|
21
|
+
|
|
22
|
+
export {
|
|
23
|
+
BufferedLogger,
|
|
24
|
+
EventEmitter,
|
|
25
|
+
SESSION_STATUS,
|
|
26
|
+
TestRunner,
|
|
27
|
+
TestRunnerCli,
|
|
28
|
+
TestSessionManager,
|
|
29
|
+
chromeLauncher,
|
|
30
|
+
constants,
|
|
31
|
+
defaultReporter,
|
|
32
|
+
dotReporter,
|
|
33
|
+
fetchSourceMap,
|
|
34
|
+
formatError,
|
|
35
|
+
isTestFilePath,
|
|
36
|
+
startTestRunner,
|
|
37
|
+
summaryReporter,
|
|
38
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ohos-ports/web-test-runner",
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Test runner for web applications",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/ohos-ports/ohos-ports.git",
|
|
12
|
+
"directory": "ports/web-test-runner/1.0.0"
|
|
13
|
+
},
|
|
14
|
+
"author": "modern-web",
|
|
15
|
+
"homepage": "https://github.com/ohos-ports/ohos-ports/tree/master/ports/web-test-runner/1.0.0",
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"web-test-runner": "./dist/bin.js",
|
|
19
|
+
"wtr": "./dist/bin.js"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"import": {
|
|
24
|
+
"types": "./index.d.ts",
|
|
25
|
+
"default": "./index.mjs"
|
|
26
|
+
},
|
|
27
|
+
"require": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"default": "./dist/index.js"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=22.0.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"postinstall": "node scripts/ohos-postinstall-sign.js",
|
|
38
|
+
"build": "tsc",
|
|
39
|
+
"test": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\"",
|
|
40
|
+
"test:babel-coverage": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --config demo/babel-coverage.config.mjs",
|
|
41
|
+
"test:bare": "node dist/bin.js",
|
|
42
|
+
"test:coverage": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --coverage",
|
|
43
|
+
"test:coverage-babel": "node dist/bin.js --config demo/coverage-babel/config.mjs",
|
|
44
|
+
"test:custom-html": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --config demo/customhtml.config.mjs",
|
|
45
|
+
"test:filter-logs": "node dist/bin.js --config demo/filter-logs.config.mjs",
|
|
46
|
+
"test:focus": "node dist/bin.js --config demo/focus/config.mjs",
|
|
47
|
+
"test:groups": "node dist/bin.js --config demo/groups.config.mjs",
|
|
48
|
+
"test:groups-pattern": "node dist/bin.js --groups \"demo/test/groups/**/*.config.mjs\"",
|
|
49
|
+
"test:groups-shared-browser": "node dist/bin.js --config demo/groups-shared-browser.config.mjs",
|
|
50
|
+
"test:legacy": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --config demo/legacy.config.mjs",
|
|
51
|
+
"test:logging": "node dist/bin.js \"demo/test/logging.test.js\"",
|
|
52
|
+
"test:many": "node dist/bin.js \"demo/test/many/**/*.test.js\"",
|
|
53
|
+
"test:mixed": "node dist/bin.js \"demo/test/*.test.js\"",
|
|
54
|
+
"test:mocha-options": "node dist/bin.js --config \"demo/test/mocha-options/config.js\"",
|
|
55
|
+
"test:playwright": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --playwright --browsers chromium firefox webkit",
|
|
56
|
+
"test:puppeteer-firefox": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --puppeteer --browsers firefox",
|
|
57
|
+
"test:saucelabs": "node dist/bin.js --config demo/saucelabs.config.mjs",
|
|
58
|
+
"test:selenium": "node dist/bin.js --config demo/selenium.config.mjs",
|
|
59
|
+
"test:snapshots": "node dist/bin.js \"demo/test/pass-snapshot.test.js\" --coverage",
|
|
60
|
+
"test:source-maps": "node dist/bin.js --config demo/source-maps/config.mjs",
|
|
61
|
+
"test:tsc": "tsc -p demo/tsc/tsconfig.json && concurrently -k -r \"tsc -p demo/tsc/tsconfig.json --watch --preserveWatchOutput\" \"wtr --config demo/tsc/config.mjs --watch\"",
|
|
62
|
+
"test:virtual": "node dist/bin.js --config demo/virtual/config.mjs",
|
|
63
|
+
"test:watch": "node dist/bin.js \"demo/test/pass-*.test.{js,html}\" --watch"
|
|
64
|
+
},
|
|
65
|
+
"files": [
|
|
66
|
+
"*.d.ts",
|
|
67
|
+
"*.js",
|
|
68
|
+
"*.mjs",
|
|
69
|
+
"dist",
|
|
70
|
+
"src",
|
|
71
|
+
"scripts"
|
|
72
|
+
],
|
|
73
|
+
"keywords": [
|
|
74
|
+
"web",
|
|
75
|
+
"test",
|
|
76
|
+
"runner",
|
|
77
|
+
"testrunner",
|
|
78
|
+
"default",
|
|
79
|
+
"implementation",
|
|
80
|
+
"cli"
|
|
81
|
+
],
|
|
82
|
+
"dependencies": {
|
|
83
|
+
"@web/browser-logs": "^1.0.0",
|
|
84
|
+
"@web/config-loader": "^1.0.0",
|
|
85
|
+
"@web/dev-server": "^1.0.0",
|
|
86
|
+
"@web/test-runner-chrome": "^1.0.0",
|
|
87
|
+
"@web/test-runner-commands": "^1.0.0",
|
|
88
|
+
"@web/test-runner-core": "^1.0.0",
|
|
89
|
+
"@web/test-runner-mocha": "^1.0.0",
|
|
90
|
+
"camelcase": "^6.2.0",
|
|
91
|
+
"command-line-args": "^5.1.1",
|
|
92
|
+
"command-line-usage": "^7.0.1",
|
|
93
|
+
"convert-source-map": "^2.0.0",
|
|
94
|
+
"diff": "^5.2.2",
|
|
95
|
+
"globby": "^11.0.1",
|
|
96
|
+
"nanocolors": "^0.2.1",
|
|
97
|
+
"portfinder": "^1.0.32",
|
|
98
|
+
"source-map": "^0.7.3"
|
|
99
|
+
},
|
|
100
|
+
"devDependencies": {
|
|
101
|
+
"@types/diff": "^5.0.0",
|
|
102
|
+
"@web/dev-server-legacy": "^3.0.0",
|
|
103
|
+
"@web/test-runner-saucelabs": "^1.0.0",
|
|
104
|
+
"babel-plugin-istanbul": "^6.0.0",
|
|
105
|
+
"concurrently": "^8.0.1"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* HarmonyOS postinstall hook: sign native .node modules.
|
|
4
|
+
*
|
|
5
|
+
* On HarmonyOS, dynamically loaded ELF shared objects (including Node.js
|
|
6
|
+
* native addons, e.g. rollup's @rollup/rollup-openharmony-arm64) must be
|
|
7
|
+
* code-signed. Unsigned modules fail dlopen with "Permission denied",
|
|
8
|
+
* which blocks the whole require chain at module-load time.
|
|
9
|
+
*
|
|
10
|
+
* This hook walks node_modules for *.node files and self-signs each one
|
|
11
|
+
* with `binary-sign-tool` (HarmonyOS SDK toolchain) when it is available.
|
|
12
|
+
*
|
|
13
|
+
* On non-HarmonyOS platforms (or when the signing tool is absent) this is
|
|
14
|
+
* a silent no-op, so the package remains installable everywhere.
|
|
15
|
+
*/
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
const { execFileSync } = require('child_process');
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const path = require('path');
|
|
21
|
+
|
|
22
|
+
const OHOS_PLATFORMS = new Set(['openharmony', 'ohos']);
|
|
23
|
+
const SIGN_ALG = 'SHA256withECDSA';
|
|
24
|
+
|
|
25
|
+
function signingToolAvailable() {
|
|
26
|
+
try {
|
|
27
|
+
execFileSync('which', ['binary-sign-tool'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
28
|
+
return true;
|
|
29
|
+
} catch (e) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Sign one .node file in place. Returns true when (re)signed successfully. */
|
|
35
|
+
function signNativeModule(file) {
|
|
36
|
+
const outFile = `${file}.ohos-signed`;
|
|
37
|
+
try {
|
|
38
|
+
execFileSync(
|
|
39
|
+
'binary-sign-tool',
|
|
40
|
+
['sign', '-inFile', file, '-outFile', outFile, '-selfSign', '1', '-signAlg', SIGN_ALG],
|
|
41
|
+
{ stdio: ['ignore', 'ignore', 'ignore'] }
|
|
42
|
+
);
|
|
43
|
+
const st = fs.statSync(outFile);
|
|
44
|
+
if (st.isFile() && st.size > 0) {
|
|
45
|
+
fs.renameSync(outFile, file);
|
|
46
|
+
try { fs.chmodSync(file, 0o755); } catch (e) { /* best effort */ }
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
} catch (e) {
|
|
51
|
+
try { fs.unlinkSync(outFile); } catch (e2) { /* ignore */ }
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Walk a node_modules tree and sign every *.node file. */
|
|
57
|
+
function signAllNativeModules(nmRoot) {
|
|
58
|
+
const signed = [];
|
|
59
|
+
const stack = [nmRoot];
|
|
60
|
+
while (stack.length > 0) {
|
|
61
|
+
const dir = stack.pop();
|
|
62
|
+
let entries;
|
|
63
|
+
try {
|
|
64
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
65
|
+
} catch (e) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
const full = path.join(dir, entry.name);
|
|
70
|
+
if (entry.isDirectory()) {
|
|
71
|
+
if (entry.name === '.bin') continue;
|
|
72
|
+
stack.push(full);
|
|
73
|
+
} else if (entry.isFile() && entry.name.endsWith('.node')) {
|
|
74
|
+
if (signNativeModule(full)) signed.push(path.relative(nmRoot, full));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return signed;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Locate the nearest node_modules directory that hosts this package. */
|
|
82
|
+
function findHostNodeModules() {
|
|
83
|
+
let dir = __dirname;
|
|
84
|
+
for (let i = 0; i < 6; i++) {
|
|
85
|
+
const candidate = path.join(dir, 'node_modules');
|
|
86
|
+
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
87
|
+
// Only treat it as the host node_modules if this package lives inside it
|
|
88
|
+
if (path.resolve(dir).indexOf(path.resolve(candidate)) === 0) return candidate;
|
|
89
|
+
return candidate;
|
|
90
|
+
}
|
|
91
|
+
const parent = path.dirname(dir);
|
|
92
|
+
if (parent === dir) break;
|
|
93
|
+
dir = parent;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function main() {
|
|
99
|
+
if (!OHOS_PLATFORMS.has(process.platform)) return; // non-HarmonyOS: no-op
|
|
100
|
+
if (!signingToolAvailable()) {
|
|
101
|
+
console.warn('[ohos-postinstall-sign] binary-sign-tool not found; skipping native module signing');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const nmRoot = findHostNodeModules();
|
|
105
|
+
if (!nmRoot) {
|
|
106
|
+
console.warn('[ohos-postinstall-sign] node_modules not found; skipping');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const signed = signAllNativeModules(nmRoot);
|
|
110
|
+
if (signed.length > 0) {
|
|
111
|
+
console.log(`[ohos-postinstall-sign] signed ${signed.length} native module(s):\n - ${signed.join('\n - ')}`);
|
|
112
|
+
} else {
|
|
113
|
+
console.log('[ohos-postinstall-sign] no native modules needed signing');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export class TestRunnerStartError extends Error {}
|
package/src/bin.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type RollupNodeResolveOptions } from '@web/dev-server';
|
|
2
|
+
import {
|
|
3
|
+
type TestFramework,
|
|
4
|
+
type TestRunnerCoreConfig,
|
|
5
|
+
type TestRunnerGroupConfig,
|
|
6
|
+
} from '@web/test-runner-core';
|
|
7
|
+
|
|
8
|
+
export interface TestRunnerConfig extends Omit<TestRunnerCoreConfig, 'testFramework'> {
|
|
9
|
+
groups?: string | string[] | TestRunnerGroupConfig[];
|
|
10
|
+
nodeResolve?: boolean | RollupNodeResolveOptions;
|
|
11
|
+
preserveSymlinks?: boolean;
|
|
12
|
+
esbuildTarget?: string | string[];
|
|
13
|
+
testFramework?: Partial<TestFramework>;
|
|
14
|
+
}
|