@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.
Files changed (146) hide show
  1. package/README.md +65 -0
  2. package/dist/TestRunnerStartError.d.ts +3 -0
  3. package/dist/TestRunnerStartError.d.ts.map +1 -0
  4. package/dist/TestRunnerStartError.js +7 -0
  5. package/dist/TestRunnerStartError.js.map +1 -0
  6. package/dist/bin.d.ts +3 -0
  7. package/dist/bin.d.ts.map +1 -0
  8. package/dist/bin.js +6 -0
  9. package/dist/bin.js.map +1 -0
  10. package/dist/config/TestRunnerConfig.d.ts +10 -0
  11. package/dist/config/TestRunnerConfig.d.ts.map +1 -0
  12. package/dist/config/TestRunnerConfig.js +3 -0
  13. package/dist/config/TestRunnerConfig.js.map +1 -0
  14. package/dist/config/collectGroupConfigs.d.ts +3 -0
  15. package/dist/config/collectGroupConfigs.d.ts.map +1 -0
  16. package/dist/config/collectGroupConfigs.js +43 -0
  17. package/dist/config/collectGroupConfigs.js.map +1 -0
  18. package/dist/config/loadLauncher.d.ts +3 -0
  19. package/dist/config/loadLauncher.d.ts.map +1 -0
  20. package/dist/config/loadLauncher.js +43 -0
  21. package/dist/config/loadLauncher.js.map +1 -0
  22. package/dist/config/mergeConfigs.d.ts +3 -0
  23. package/dist/config/mergeConfigs.d.ts.map +1 -0
  24. package/dist/config/mergeConfigs.js +26 -0
  25. package/dist/config/mergeConfigs.js.map +1 -0
  26. package/dist/config/parseConfig.d.ts +9 -0
  27. package/dist/config/parseConfig.d.ts.map +1 -0
  28. package/dist/config/parseConfig.js +216 -0
  29. package/dist/config/parseConfig.js.map +1 -0
  30. package/dist/config/readCliArgs.d.ts +15 -0
  31. package/dist/config/readCliArgs.d.ts.map +1 -0
  32. package/dist/config/readCliArgs.js +148 -0
  33. package/dist/config/readCliArgs.js.map +1 -0
  34. package/dist/config/readFileConfig.d.ts +18 -0
  35. package/dist/config/readFileConfig.d.ts.map +1 -0
  36. package/dist/config/readFileConfig.js +22 -0
  37. package/dist/config/readFileConfig.js.map +1 -0
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +31 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/logger/TestRunnerLogger.d.ts +15 -0
  43. package/dist/logger/TestRunnerLogger.d.ts.map +1 -0
  44. package/dist/logger/TestRunnerLogger.js +48 -0
  45. package/dist/logger/TestRunnerLogger.js.map +1 -0
  46. package/dist/reporter/defaultReporter.d.ts +7 -0
  47. package/dist/reporter/defaultReporter.d.ts.map +1 -0
  48. package/dist/reporter/defaultReporter.js +51 -0
  49. package/dist/reporter/defaultReporter.js.map +1 -0
  50. package/dist/reporter/dotReporter.d.ts +4 -0
  51. package/dist/reporter/dotReporter.d.ts.map +1 -0
  52. package/dist/reporter/dotReporter.js +53 -0
  53. package/dist/reporter/dotReporter.js.map +1 -0
  54. package/dist/reporter/getCodeCoverage.d.ts +3 -0
  55. package/dist/reporter/getCodeCoverage.d.ts.map +1 -0
  56. package/dist/reporter/getCodeCoverage.js +36 -0
  57. package/dist/reporter/getCodeCoverage.js.map +1 -0
  58. package/dist/reporter/getTestProgress.d.ts +16 -0
  59. package/dist/reporter/getTestProgress.d.ts.map +1 -0
  60. package/dist/reporter/getTestProgress.js +105 -0
  61. package/dist/reporter/getTestProgress.js.map +1 -0
  62. package/dist/reporter/renderProgressBar.d.ts +2 -0
  63. package/dist/reporter/renderProgressBar.d.ts.map +1 -0
  64. package/dist/reporter/renderProgressBar.js +23 -0
  65. package/dist/reporter/renderProgressBar.js.map +1 -0
  66. package/dist/reporter/reportBrowserLogs.d.ts +3 -0
  67. package/dist/reporter/reportBrowserLogs.d.ts.map +1 -0
  68. package/dist/reporter/reportBrowserLogs.js +61 -0
  69. package/dist/reporter/reportBrowserLogs.js.map +1 -0
  70. package/dist/reporter/reportRequest404s.d.ts +3 -0
  71. package/dist/reporter/reportRequest404s.d.ts.map +1 -0
  72. package/dist/reporter/reportRequest404s.js +54 -0
  73. package/dist/reporter/reportRequest404s.js.map +1 -0
  74. package/dist/reporter/reportTestFileErrors.d.ts +3 -0
  75. package/dist/reporter/reportTestFileErrors.d.ts.map +1 -0
  76. package/dist/reporter/reportTestFileErrors.js +52 -0
  77. package/dist/reporter/reportTestFileErrors.js.map +1 -0
  78. package/dist/reporter/reportTestFileResults.d.ts +3 -0
  79. package/dist/reporter/reportTestFileResults.d.ts.map +1 -0
  80. package/dist/reporter/reportTestFileResults.js +25 -0
  81. package/dist/reporter/reportTestFileResults.js.map +1 -0
  82. package/dist/reporter/reportTestsErrors.d.ts +4 -0
  83. package/dist/reporter/reportTestsErrors.d.ts.map +1 -0
  84. package/dist/reporter/reportTestsErrors.js +129 -0
  85. package/dist/reporter/reportTestsErrors.js.map +1 -0
  86. package/dist/reporter/summaryReporter.d.ts +10 -0
  87. package/dist/reporter/summaryReporter.d.ts.map +1 -0
  88. package/dist/reporter/summaryReporter.js +73 -0
  89. package/dist/reporter/summaryReporter.js.map +1 -0
  90. package/dist/reporter/utils/getFailedOnBrowsers.d.ts +2 -0
  91. package/dist/reporter/utils/getFailedOnBrowsers.d.ts.map +1 -0
  92. package/dist/reporter/utils/getFailedOnBrowsers.js +13 -0
  93. package/dist/reporter/utils/getFailedOnBrowsers.js.map +1 -0
  94. package/dist/reporter/utils/getFlattenedTestResults.d.ts +3 -0
  95. package/dist/reporter/utils/getFlattenedTestResults.d.ts.map +1 -0
  96. package/dist/reporter/utils/getFlattenedTestResults.js +21 -0
  97. package/dist/reporter/utils/getFlattenedTestResults.js.map +1 -0
  98. package/dist/reporter/utils/getPassedFailedSkippedCount.d.ts +7 -0
  99. package/dist/reporter/utils/getPassedFailedSkippedCount.d.ts.map +1 -0
  100. package/dist/reporter/utils/getPassedFailedSkippedCount.js +30 -0
  101. package/dist/reporter/utils/getPassedFailedSkippedCount.js.map +1 -0
  102. package/dist/reporter/utils/toBrowserPath.d.ts +2 -0
  103. package/dist/reporter/utils/toBrowserPath.d.ts.map +1 -0
  104. package/dist/reporter/utils/toBrowserPath.js +11 -0
  105. package/dist/reporter/utils/toBrowserPath.js.map +1 -0
  106. package/dist/reporter/utils/toFilePath.d.ts +6 -0
  107. package/dist/reporter/utils/toFilePath.d.ts.map +1 -0
  108. package/dist/reporter/utils/toFilePath.js +15 -0
  109. package/dist/reporter/utils/toFilePath.js.map +1 -0
  110. package/dist/startTestRunner.d.ts +33 -0
  111. package/dist/startTestRunner.d.ts.map +1 -0
  112. package/dist/startTestRunner.js +61 -0
  113. package/dist/startTestRunner.js.map +1 -0
  114. package/index.d.ts +2 -0
  115. package/index.mjs +38 -0
  116. package/package.json +107 -0
  117. package/scripts/ohos-postinstall-sign.js +117 -0
  118. package/src/TestRunnerStartError.ts +1 -0
  119. package/src/bin.ts +4 -0
  120. package/src/config/TestRunnerConfig.ts +14 -0
  121. package/src/config/collectGroupConfigs.ts +50 -0
  122. package/src/config/loadLauncher.ts +48 -0
  123. package/src/config/mergeConfigs.ts +26 -0
  124. package/src/config/parseConfig.ts +286 -0
  125. package/src/config/readCliArgs.ts +187 -0
  126. package/src/config/readFileConfig.ts +35 -0
  127. package/src/index.ts +11 -0
  128. package/src/logger/TestRunnerLogger.ts +54 -0
  129. package/src/reporter/defaultReporter.ts +78 -0
  130. package/src/reporter/dotReporter.ts +65 -0
  131. package/src/reporter/getCodeCoverage.ts +54 -0
  132. package/src/reporter/getTestProgress.ts +181 -0
  133. package/src/reporter/renderProgressBar.ts +27 -0
  134. package/src/reporter/reportBrowserLogs.ts +64 -0
  135. package/src/reporter/reportRequest404s.ts +55 -0
  136. package/src/reporter/reportTestFileErrors.ts +70 -0
  137. package/src/reporter/reportTestFileResults.ts +33 -0
  138. package/src/reporter/reportTestsErrors.ts +110 -0
  139. package/src/reporter/summaryReporter.ts +123 -0
  140. package/src/reporter/utils/getFailedOnBrowsers.ts +10 -0
  141. package/src/reporter/utils/getFlattenedTestResults.ts +24 -0
  142. package/src/reporter/utils/getPassedFailedSkippedCount.ts +31 -0
  143. package/src/reporter/utils/toBrowserPath.ts +5 -0
  144. package/src/reporter/utils/toFilePath.ts +9 -0
  145. package/src/startTestRunner.ts +101 -0
  146. 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":";;AA8BA,0CA4FC;AAlHD,uEAAiE;AACjE,iEAA2D;AAE3D,uEAAiE;AACjE,iEAA2D;AAQ3D,MAAM,KAAK,GACT,CAAC,CAAC,CAAC,EAAE,CAAC,CAAmB,EAAE,EAAE,CAC7B,CAAC,CAAS,EAAE,EAAE,CACZ,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;AACvC,MAAM,KAAK,GAAG,gBAAgB,CAAC;AAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE1B,6DAA6D;AAC7D,SAAgB,eAAe,CAAC,IAAa;IAC3C,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,cAAc,GAAG,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACvF,IAAI,IAAkB,CAAC;IACvB,IAAI,eAAuB,CAAC;IAE5B,MAAM,UAAU,GAAG,IAAI,sCAAgB,EAAE,CAAC;IAE1C,SAAS,GAAG,CACV,MAAc,EACd,IAAY,EACZ,MAAe,EACf,OAAgB,EAChB,MAAM,GAAG,IAAI,EACb,OAAO,GAAG,EAAE;QAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,UAAU,CACjB,MAAc,EACd,OAAyB,EACzB,MAAe,EACf,OAAyB;QAEzB,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YAC1C,GAAG,CACD,MAAM,EACN,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EACxD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,OAAO,EACd,MAAM,EACN,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;YAC1C,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,SAAS,QAAQ,CACf,MAAc,EACd,KAAsB,EACtB,MAAe,EACf,OAAyB;QAEzB,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,IAAI,OAAO;YAAE,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;QAEtD,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,KAAK,CAAC,KAAK;YACT,IAAI,GAAG,KAAK,CAAC;YACb,eAAe;gBACb,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC7B,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACjF,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,qBAAqB,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE;YACnD,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;gBAC1C,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC7D,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,cAAc;gBAAE,IAAA,wCAAiB,EAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACrE,CAAC;QAED,iBAAiB,CAAC,EAAE,QAAQ,EAAE;YAC5B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;oBACpD,IAAA,wCAAiB,EAAC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;oBAClF,IAAA,8CAAoB,EAClB,UAAU,EACV,IAAI,CAAC,YAAY,EACjB,eAAe,EACf,cAAc,EACd,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getFailedOnBrowsers(allBrowserNames: string[], failedBrowsers: string[]): string;
2
+ //# sourceMappingURL=getFailedOnBrowsers.d.ts.map
@@ -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,3 @@
1
+ import { type TestResult, type TestSuiteResult } from '@web/test-runner-core';
2
+ export declare function getFlattenedTestResults(testResults: TestSuiteResult): TestResult[];
3
+ //# sourceMappingURL=getFlattenedTestResults.d.ts.map
@@ -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,2 @@
1
+ export declare function toBrowserPath(filePath: string): string;
2
+ //# sourceMappingURL=toBrowserPath.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Transforms a file system path to a browser URL. For example windows uses `\` on the file system,
3
+ * but it should use `/` in the browser.
4
+ */
5
+ export declare function toFilePath(browserPath: string): string;
6
+ //# sourceMappingURL=toFilePath.d.ts.map
@@ -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
@@ -0,0 +1,2 @@
1
+ // this file is autogenerated with the generate-mjs-dts-entrypoints script
2
+ export * from './dist/index.js';
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,4 @@
1
+ #!/usr/bin/env node
2
+ import { startTestRunner } from './startTestRunner.js';
3
+
4
+ startTestRunner();
@@ -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
+ }