dceky 1.2.1-beta-setup-node-events.1 → 1.2.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.
Files changed (30) hide show
  1. package/README.md +23 -17
  2. package/lib/start/constants/DEFAULT_THREADS_PER_COMBO.d.ts +1 -1
  3. package/lib/start/constants/DEFAULT_THREADS_PER_COMBO.js +1 -1
  4. package/lib/start/helpers/embedScreenshotsInReportData.d.ts +14 -0
  5. package/lib/start/helpers/embedScreenshotsInReportData.js +139 -0
  6. package/lib/start/helpers/embedScreenshotsInReportData.js.map +1 -0
  7. package/lib/start/helpers/executeCypress.js +1 -1
  8. package/lib/start/helpers/executeCypress.js.map +1 -1
  9. package/lib/start/helpers/generateHtmlReport.js +7 -0
  10. package/lib/start/helpers/generateHtmlReport.js.map +1 -1
  11. package/lib/start/helpers/getCypressDetectedBrowsersForChooser.d.ts +2 -1
  12. package/lib/start/helpers/getCypressDetectedBrowsersForChooser.js +34 -22
  13. package/lib/start/helpers/getCypressDetectedBrowsersForChooser.js.map +1 -1
  14. package/lib/start/helpers/mergeAllReportsAndGenerateHtml.js +52 -0
  15. package/lib/start/helpers/mergeAllReportsAndGenerateHtml.js.map +1 -1
  16. package/lib/start/helpers/reportHomepage.ejs +18 -7
  17. package/lib/start/index.d.ts +2 -2
  18. package/lib/start/index.js +214 -175
  19. package/lib/start/index.js.map +1 -1
  20. package/package.json +2 -1
  21. package/src/genConfiguration/index.ts +0 -13
  22. package/start/constants/DEFAULT_THREADS_PER_COMBO.ts +1 -1
  23. package/start/helpers/embedScreenshotsInReportData.ts +171 -0
  24. package/start/helpers/executeCypress.ts +1 -1
  25. package/start/helpers/generateHtmlReport.ts +12 -0
  26. package/start/helpers/getCypressDetectedBrowsersForChooser.ts +41 -23
  27. package/start/helpers/mergeAllReportsAndGenerateHtml.ts +60 -0
  28. package/start/helpers/reportHomepage.ejs +18 -7
  29. package/start/index.ts +218 -181
  30. package/start/helpers/extractArgValue.ts +0 -42
package/README.md CHANGED
@@ -36,23 +36,39 @@ You'll have a bunch of changes to commit and push. Do that now.
36
36
 
37
37
  ### Start Ky Tests: `npm run ky:start`
38
38
 
39
- To start running ky tests, use `npm run ky:start` and follow instructions.
39
+ To start running ky tests, use one of these two options:
40
40
 
41
- You'll be automatically guided through a launch process where you'll choose whether tests will run visibly or headless, which profile(s) you'll use, which browser(s) you'll use, and which e2e test folder to run. You can also set these through environment variables or arguments. See the examples below:
41
+ 1. Run `npm run ky:start` and follow the chooser prompts.
42
+ 2. Set environment variables before running `npm run ky:start`, either in your shell or in a `.env` file at the project root.
42
43
 
43
- ```ts
44
- // Arguments:
45
- npm run ky:start --headless --browser=chrome,webkit --profile=Stage --e2eFolder=Activities
44
+ The chooser guides you through whether tests run visibly or headless, which profile(s) to use, which browser(s) to use, which e2e test folder to run, and the "Num Test Files in Parallel Per Combo" for headless runs.
45
+
46
+ To set environment variables directly in your shell, run:
47
+
48
+ ```sh
49
+ HEADLESS=true BROWSER=chrome,webkit PROFILE=Stage E2E_TEST_FOLDER=Activities THREADS_PER_COMBO=2 npm run ky:start
46
50
  ```
47
51
 
48
- ```ts
49
- // Example environment:
52
+ Or create a `.env` file:
53
+
54
+ ```sh
50
55
  HEADLESS=true
51
56
  BROWSER=chrome,webkit
52
57
  PROFILE=Stage
53
58
  E2E_TEST_FOLDER=Activities
59
+ THREADS_PER_COMBO=2
54
60
  ```
55
61
 
62
+ Environment variables:
63
+
64
+ | Variable | Description |
65
+ | --- | --- |
66
+ | `HEADLESS` | Set to `true` to run without opening the Cypress UI. Set to `false` to run visibly. If omitted, ky asks in the chooser. |
67
+ | `BROWSER` | Browser(s) to use for headless runs, as a comma-separated list such as `chrome,webkit`. Available browsers are `chrome`, `webkit`, `edge`, and `firefox`. If omitted during a headless run, ky asks in the chooser. |
68
+ | `PROFILE` | Profile(s) to run, as a comma-separated list such as `Stage` or `Stage,Prod`. Visible runs use one profile; headless runs can use multiple. If omitted, ky asks in the chooser. |
69
+ | `E2E_TEST_FOLDER` | E2E test folder to run for headless runs. Use a folder path under `cypress/e2e`, such as `Activities` or `Activities/Respond`. Use `all`, `*`, or `.` to run all e2e tests. If omitted, ky asks in the chooser. |
70
+ | `THREADS_PER_COMBO` | Number of test files to run in parallel for each profile and browser combination during headless runs. Use a positive whole number. If omitted, ky asks for a number and uses `1` when left blank. |
71
+
56
72
  ### Setup Ky: `npm run ky:setup`
57
73
 
58
74
  Whenever you update the version of ky or make changes to supporting project-specific commands or other non-test files, you should run `ky:setup`.
@@ -137,13 +153,3 @@ const myReturnValue = { hello: 'world' };
137
153
 
138
154
  return ky.wrap(myReturnValue);
139
155
  ```
140
-
141
- ### Adding a Custom Setup Node Events Script
142
-
143
- If you want to add a custom `setupNodeEvents` script, create a `/cypress/support/setupNodeEvents.ts` module that exports a single default function of the following type:
144
-
145
- ```ts
146
- ((on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions) => Cypress.PluginConfigOptions | void)
147
- ```
148
-
149
- Ky will automatically look for this file and add it to the configuration if it exists, so there's no need to import it or add it to the config manually. This is useful for adding custom functionality that happens _outside the browser_.
@@ -2,5 +2,5 @@
2
2
  * Default number of threads per combo
3
3
  * @author Yuen Ler Chow
4
4
  */
5
- declare const DEFAULT_THREADS_PER_COMBO = 2;
5
+ declare const DEFAULT_THREADS_PER_COMBO = 1;
6
6
  export default DEFAULT_THREADS_PER_COMBO;
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  * Default number of threads per combo
5
5
  * @author Yuen Ler Chow
6
6
  */
7
- const DEFAULT_THREADS_PER_COMBO = 2;
7
+ const DEFAULT_THREADS_PER_COMBO = 1;
8
8
  exports.default = DEFAULT_THREADS_PER_COMBO;
9
9
  //# sourceMappingURL=DEFAULT_THREADS_PER_COMBO.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Add screenshot context to failed tests in a merged Mochawesome JSON report.
3
+ * @author Yuen Ler Chow
4
+ * @param opts object of arguments
5
+ * @param opts.reportDataPath path to report-data.json
6
+ * @param opts.screenshotsDir path to Cypress screenshots for this report
7
+ * @param opts.reportDir path where marge will generate the HTML report
8
+ */
9
+ declare const embedScreenshotsInReportData: (opts: {
10
+ reportDataPath: string;
11
+ screenshotsDir: string;
12
+ reportDir: string;
13
+ }) => void;
14
+ export default embedScreenshotsInReportData;
@@ -0,0 +1,139 @@
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
+ /* eslint-disable no-console */
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ /**
10
+ * Normalize Cypress screenshot names and Mochawesome test titles for matching.
11
+ * @author Yuen Ler Chow
12
+ * @param value raw screenshot filename or test title
13
+ * @returns normalized value used for screenshot/test matching
14
+ */
15
+ const normalize = (value) => {
16
+ return (value
17
+ .replace(/\s+\(failed\)(?:\s+\(attempt\s+\d+\))?$/i, '')
18
+ .replace(/\s+\(attempt\s+\d+\)$/i, '')
19
+ .replace(/[^a-z0-9]+/gi, '')
20
+ .toLowerCase());
21
+ };
22
+ /**
23
+ * Recursively collect screenshots and store paths relative to the HTML report.
24
+ * @author Yuen Ler Chow
25
+ * @param dir screenshot directory to scan
26
+ * @param reportDir directory where marge will generate the HTML report
27
+ * @returns screenshot metadata used for report embedding
28
+ */
29
+ const collectScreenshots = (dir, reportDir) => {
30
+ if (!fs_1.default.existsSync(dir)) {
31
+ return [];
32
+ }
33
+ return fs_1.default.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
34
+ const entryPath = path_1.default.join(dir, entry.name);
35
+ if (entry.isDirectory()) {
36
+ return collectScreenshots(entryPath, reportDir);
37
+ }
38
+ if (!entry.isFile() || !entry.name.endsWith('.png')) {
39
+ return [];
40
+ }
41
+ return [{
42
+ href: path_1.default.relative(reportDir, entryPath).replace(/\\/g, '/'),
43
+ matchKey: normalize(entry.name.replace(/\.png$/i, '')),
44
+ }];
45
+ });
46
+ };
47
+ /**
48
+ * Convert Mochawesome's context field into an array while preserving existing entries.
49
+ * @author Yuen Ler Chow
50
+ * @param context raw Mochawesome context value
51
+ * @returns context entries as an array
52
+ */
53
+ const getContextItems = (context) => {
54
+ if (!context) {
55
+ return [];
56
+ }
57
+ if (Array.isArray(context)) {
58
+ return context;
59
+ }
60
+ if (typeof context !== 'string') {
61
+ return [context];
62
+ }
63
+ try {
64
+ const parsed = JSON.parse(context);
65
+ return Array.isArray(parsed) ? parsed : [parsed];
66
+ }
67
+ catch (_a) {
68
+ return [context];
69
+ }
70
+ };
71
+ /**
72
+ * Walk a Mochawesome report node and attach matching screenshots to failed tests.
73
+ * @author Yuen Ler Chow
74
+ * @param node Mochawesome report node, suite, test, or array of nodes
75
+ * @param screenshots screenshots available for matching
76
+ * @returns number of failed tests that received screenshot context
77
+ */
78
+ const embedScreenshotsInNode = (node, screenshots) => {
79
+ if (!node || typeof node !== 'object') {
80
+ return 0;
81
+ }
82
+ if (Array.isArray(node)) {
83
+ return node.reduce((sum, child) => {
84
+ return sum + embedScreenshotsInNode(child, screenshots);
85
+ }, 0);
86
+ }
87
+ let numEmbedded = 0;
88
+ if (node.fail) {
89
+ const testKey = normalize(node.fullTitle || node.title || '');
90
+ const matches = screenshots.filter((screenshot) => {
91
+ return screenshot.matchKey.endsWith(testKey);
92
+ });
93
+ if (matches.length > 0) {
94
+ const contextItems = getContextItems(node.context);
95
+ const existingHrefs = new Set(contextItems.map((item) => {
96
+ return typeof item === 'string' ? item : item.value;
97
+ }));
98
+ matches.forEach((screenshot, index) => {
99
+ if (!existingHrefs.has(screenshot.href)) {
100
+ contextItems.push({
101
+ title: matches.length === 1 ? 'Screenshot' : `Screenshot ${index + 1}`,
102
+ value: screenshot.href,
103
+ });
104
+ }
105
+ });
106
+ // eslint-disable-next-line no-param-reassign
107
+ node.context = JSON.stringify(contextItems.length === 1 ? contextItems[0] : contextItems, null, 2);
108
+ numEmbedded += 1;
109
+ }
110
+ }
111
+ return (numEmbedded
112
+ + embedScreenshotsInNode(node.suites, screenshots)
113
+ + embedScreenshotsInNode(node.tests, screenshots));
114
+ };
115
+ /**
116
+ * Add screenshot context to failed tests in a merged Mochawesome JSON report.
117
+ * @author Yuen Ler Chow
118
+ * @param opts object of arguments
119
+ * @param opts.reportDataPath path to report-data.json
120
+ * @param opts.screenshotsDir path to Cypress screenshots for this report
121
+ * @param opts.reportDir path where marge will generate the HTML report
122
+ */
123
+ const embedScreenshotsInReportData = (opts) => {
124
+ const { reportDataPath, screenshotsDir, reportDir } = opts;
125
+ const screenshots = collectScreenshots(screenshotsDir, reportDir);
126
+ if (!fs_1.default.existsSync(reportDataPath) || screenshots.length === 0) {
127
+ return;
128
+ }
129
+ const report = JSON.parse(fs_1.default.readFileSync(reportDataPath, 'utf8'));
130
+ const numEmbedded = embedScreenshotsInNode(report.results, screenshots);
131
+ if (numEmbedded === 0) {
132
+ console.warn('⚠️ Screenshots were found, but none matched failed tests in the Mochawesome report.');
133
+ return;
134
+ }
135
+ fs_1.default.writeFileSync(reportDataPath, JSON.stringify(report, null, 2));
136
+ console.log(` ✅ Embedded screenshots into ${numEmbedded} failed test(s)`);
137
+ };
138
+ exports.default = embedScreenshotsInReportData;
139
+ //# sourceMappingURL=embedScreenshotsInReportData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedScreenshotsInReportData.js","sourceRoot":"","sources":["../../../start/helpers/embedScreenshotsInReportData.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ const executeCypress = (opts) => __awaiter(void 0, void 0, void 0, function* ()
36
36
  console.log(`Headless: ${isHeadless}`);
37
37
  if (isHeadless) {
38
38
  console.log(`E2E test folder: ${e2eTestFolder}`);
39
- console.log(`Threads per combo: ${threadsPerCombo}`);
39
+ console.log(`Num Test Files in Parallel Per Combo: ${threadsPerCombo}`);
40
40
  }
41
41
  console.log('═══════════════════════════════════════════════════════════\n');
42
42
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"executeCypress.js","sourceRoot":"","sources":["../../../start/helpers/executeCypress.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;;;;;;;;;;AAK/B,iBAAiB;AACjB,4EAAoD;AACpD,sGAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,CACrB,IAOC,EACc,EAAE;IACjB,MAAM,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,GACf,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,sBAAsB,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,wCAAwC;YACxC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAA,2BAAiB,EAAC,WAAW,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,IAAA,wCAA8B,EAAC;gBACnC,gBAAgB;gBAChB,gBAAgB;gBAChB,eAAe;gBACf,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,kBAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"executeCypress.js","sourceRoot":"","sources":["../../../start/helpers/executeCypress.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;;;;;;;;;;;;AAK/B,iBAAiB;AACjB,4EAAoD;AACpD,sGAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,CACrB,IAOC,EACc,EAAE;IACjB,MAAM,EACJ,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,GACf,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,oBAAoB,aAAa,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,eAAe,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,wCAAwC;YACxC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,IAAA,2BAAiB,EAAC,WAAW,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,IAAA,wCAA8B,EAAC;gBACnC,gBAAgB;gBAChB,gBAAgB;gBAChB,eAAe;gBACf,cAAc;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,kBAAe,cAAc,CAAC"}
@@ -8,6 +8,7 @@ const child_process_1 = require("child_process");
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const fs_1 = require("fs");
10
10
  const getRootPath_1 = __importDefault(require("./getRootPath"));
11
+ const embedScreenshotsInReportData_1 = __importDefault(require("./embedScreenshotsInReportData"));
11
12
  /**
12
13
  * Generate HTML report from merged JSON report using mochawesome-report-generator (marge)
13
14
  * @author Yuen Ler Chow
@@ -20,6 +21,7 @@ const generateHtmlReport = (opts) => {
20
21
  const { resultsDir, profileName, browserName } = opts;
21
22
  const reportDataPath = path_1.default.join(resultsDir, `${profileName}-${browserName}`, 'report-data.json');
22
23
  const reportDir = path_1.default.join(resultsDir, `${profileName}-${browserName}`, 'report');
24
+ const screenshotsDir = path_1.default.join(resultsDir, `${profileName}-${browserName}`, 'screenshots');
23
25
  const expectedHtmlPath = path_1.default.join(reportDir, 'report-data.html');
24
26
  console.log(`\n📄 Generate HTML Report Debug for ${profileName} + ${browserName}:`);
25
27
  console.log(` Report data path: ${reportDataPath}`);
@@ -30,6 +32,11 @@ const generateHtmlReport = (opts) => {
30
32
  throw new Error(errorMsg);
31
33
  }
32
34
  try {
35
+ (0, embedScreenshotsInReportData_1.default)({
36
+ reportDataPath,
37
+ screenshotsDir,
38
+ reportDir,
39
+ });
33
40
  const command = `npx marge "${reportDataPath}" --reportDir "${reportDir}"`;
34
41
  console.log(` Running: ${command}`);
35
42
  console.log(`Generating HTML report for ${profileName} + ${browserName}...`);
@@ -1 +1 @@
1
- {"version":3,"file":"generateHtmlReport.js","sourceRoot":"","sources":["../../../start/helpers/generateHtmlReport.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAAyC;AACzC,gDAAwB;AACxB,2BAAgC;AAChC,gEAAwC;AAExC;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,CACzB,IAIC,EACK,EAAE;IACR,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAEtD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,kBAAkB,CACnB,CAAC;IACF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CACzB,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,QAAQ,CACT,CAAC;IACF,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,MAAM,WAAW,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAElD,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,6CAA6C,cAAc,EAAE,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,cAAc,kBAAkB,SAAS,GAAG,CAAC;QAE3E,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,MAAM,WAAW,KAAK,CAAC,CAAC;QAE7E,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAChB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,IAAA,qBAAW,GAAE;SACnB,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,CAAC,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,4CAA4C,gBAAgB,EAAE,CAAC;YAChF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,gBAAgB,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,WAAW,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"generateHtmlReport.js","sourceRoot":"","sources":["../../../start/helpers/generateHtmlReport.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAAyC;AACzC,gDAAwB;AACxB,2BAAgC;AAChC,gEAAwC;AACxC,kGAA0E;AAE1E;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,CACzB,IAIC,EACK,EAAE;IACR,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAEtD,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,kBAAkB,CACnB,CAAC;IACF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CACzB,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,QAAQ,CACT,CAAC;IACF,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAC9B,UAAU,EACV,GAAG,WAAW,IAAI,WAAW,EAAE,EAC/B,aAAa,CACd,CAAC;IACF,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,MAAM,WAAW,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IAElD,IAAI,CAAC,IAAA,eAAU,EAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,6CAA6C,cAAc,EAAE,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC;QACH,IAAA,sCAA4B,EAAC;YAC3B,cAAc;YACd,cAAc;YACd,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,cAAc,cAAc,kBAAkB,SAAS,GAAG,CAAC;QAE3E,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,MAAM,WAAW,KAAK,CAAC,CAAC;QAE7E,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAChB,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,IAAA,qBAAW,GAAE;SACnB,CAAC,CAAC;QAEH,qCAAqC;QACrC,IAAI,CAAC,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,4CAA4C,gBAAgB,EAAE,CAAC;YAChF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,gBAAgB,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,WAAW,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC,CAAC;AAEF,kBAAe,kBAAkB,CAAC"}
@@ -4,6 +4,7 @@ import AVAILABLE_BROWSERS from '../constants/AVAILABLE_BROWSERS';
4
4
  * `npx cypress info` reports (`- Name:` lines), plus Webkit (always shown
5
5
  * because `cypress info` omits WebKit; https://github.com/cypress-io/cypress/issues/27304).
6
6
  * @author Yuen Ler Chow
7
+ * @returns promise containing browsers to show in the chooser
7
8
  */
8
- declare const getCypressDetectedBrowsersForChooser: () => typeof AVAILABLE_BROWSERS;
9
+ declare const getCypressDetectedBrowsersForChooser: () => Promise<typeof AVAILABLE_BROWSERS>;
9
10
  export default getCypressDetectedBrowsersForChooser;
@@ -14,33 +14,45 @@ const AVAILABLE_BROWSERS_1 = __importDefault(require("../constants/AVAILABLE_BRO
14
14
  * `npx cypress info` reports (`- Name:` lines), plus Webkit (always shown
15
15
  * because `cypress info` omits WebKit; https://github.com/cypress-io/cypress/issues/27304).
16
16
  * @author Yuen Ler Chow
17
+ * @returns promise containing browsers to show in the chooser
17
18
  */
18
19
  const getCypressDetectedBrowsersForChooser = () => {
19
- var _a, _b;
20
20
  const root = (0, getRootPath_1.default)();
21
- const result = (0, child_process_1.spawnSync)('npx', ['cypress', 'info'], {
22
- cwd: root,
23
- encoding: 'utf8',
24
- shell: true,
25
- maxBuffer: 10 * 1024 * 1024,
26
- });
27
- const detected = new Set();
28
- if (!result.error && result.status === 0) {
29
- const text = `${(_a = result.stdout) !== null && _a !== void 0 ? _a : ''}\n${(_b = result.stderr) !== null && _b !== void 0 ? _b : ''}`;
30
- text.split('\n').forEach((line) => {
31
- const m = line.match(/^\s*-\s*Name:\s*(\S+)/);
32
- if (m) {
33
- const [, name] = m;
34
- detected.add(name.toLowerCase());
21
+ return new Promise((resolve) => {
22
+ const detected = new Set();
23
+ let output = '';
24
+ const cypressInfo = (0, child_process_1.spawn)('npx', ['cypress', 'info'], {
25
+ cwd: root,
26
+ shell: true,
27
+ });
28
+ cypressInfo.stdout.on('data', (chunk) => {
29
+ output += chunk.toString();
30
+ });
31
+ cypressInfo.stderr.on('data', (chunk) => {
32
+ output += chunk.toString();
33
+ });
34
+ cypressInfo.on('error', () => {
35
+ console.warn('Could not detect installed browsers (cypress info failed).');
36
+ resolve([]);
37
+ });
38
+ cypressInfo.on('close', (code) => {
39
+ if (code !== 0) {
40
+ console.warn('Could not detect installed browsers (cypress info failed).');
41
+ }
42
+ else {
43
+ output.split('\n').forEach((line) => {
44
+ const match = line.match(/^\s*-\s*Name:\s*(\S+)/);
45
+ if (match) {
46
+ const [, name] = match;
47
+ detected.add(name.toLowerCase());
48
+ }
49
+ });
35
50
  }
51
+ resolve(AVAILABLE_BROWSERS_1.default.filter((b) => {
52
+ // Always include Webkit in the chooser because "npx cypress info" omits WebKit
53
+ return b.name === 'webkit' || detected.has(b.name);
54
+ }));
36
55
  });
37
- }
38
- else {
39
- console.warn('Could not detect installed browsers (cypress info failed).');
40
- }
41
- return AVAILABLE_BROWSERS_1.default.filter((b) => {
42
- // Always include Webkit in the chooser because "npx cypress info" omits WebKit
43
- return b.name === 'webkit' || detected.has(b.name);
44
56
  });
45
57
  };
46
58
  exports.default = getCypressDetectedBrowsersForChooser;
@@ -1 +1 @@
1
- {"version":3,"file":"getCypressDetectedBrowsersForChooser.js","sourceRoot":"","sources":["../../../start/helpers/getCypressDetectedBrowsersForChooser.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAA0C;AAE1C,iBAAiB;AACjB,gEAAwC;AAExC,mBAAmB;AACnB,yFAAiE;AAEjE;;;;;GAKG;AACH,MAAM,oCAAoC,GAAG,GAA8B,EAAE;;IAC3E,MAAM,IAAI,GAAG,IAAA,qBAAW,GAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;QACnD,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,MAAA,MAAM,CAAC,MAAM,mCAAI,EAAE,KAAK,MAAA,MAAM,CAAC,MAAM,mCAAI,EAAE,EAAE,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,4BAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,+EAA+E;QAC/E,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,kBAAe,oCAAoC,CAAC"}
1
+ {"version":3,"file":"getCypressDetectedBrowsersForChooser.js","sourceRoot":"","sources":["../../../start/helpers/getCypressDetectedBrowsersForChooser.ts"],"names":[],"mappings":";;;;;AAAA,+BAA+B;AAC/B,iDAAsC;AAEtC,iBAAiB;AACjB,gEAAwC;AAExC,mBAAmB;AACnB,yFAAiE;AAEjE;;;;;;GAMG;AACH,MAAM,oCAAoC,GAAG,GAAuC,EAAE;IACpF,MAAM,IAAI,GAAG,IAAA,qBAAW,GAAE,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;YACpD,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC3E,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAClD,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;wBACvB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CACL,4BAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,+EAA+E;gBAC/E,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,kBAAe,oCAAoC,CAAC"}
@@ -47,6 +47,56 @@ const annotateMochawesomeSuites = (node, label) => {
47
47
  });
48
48
  }
49
49
  };
50
+ /**
51
+ * Rewrite screenshot paths so they resolve from the combined all-runs.html report.
52
+ * @author Yuen Ler Chow
53
+ * @param node Mochawesome report node, suite, test, or array of nodes
54
+ * @param comboFolderName folder name for the profile+browser run
55
+ */
56
+ const rewriteScreenshotContextPaths = (node, comboFolderName) => {
57
+ if (!node || typeof node !== 'object') {
58
+ return;
59
+ }
60
+ if (Array.isArray(node)) {
61
+ node.forEach((child) => {
62
+ rewriteScreenshotContextPaths(child, comboFolderName);
63
+ });
64
+ return;
65
+ }
66
+ if (typeof node.context === 'string') {
67
+ try {
68
+ const parsed = JSON.parse(node.context);
69
+ const contextItems = Array.isArray(parsed) ? parsed : [parsed];
70
+ let didRewrite = false;
71
+ contextItems.forEach((context) => {
72
+ if (typeof context !== 'string'
73
+ && typeof context.value === 'string'
74
+ && context.value.startsWith('../screenshots/')) {
75
+ // eslint-disable-next-line no-param-reassign
76
+ context.value = `${comboFolderName}/${context.value.replace(/^\.\.\//, '')}`;
77
+ didRewrite = true;
78
+ }
79
+ });
80
+ if (didRewrite) {
81
+ // eslint-disable-next-line no-param-reassign
82
+ node.context = JSON.stringify(Array.isArray(parsed) ? contextItems : contextItems[0], null, 2);
83
+ }
84
+ }
85
+ catch (_a) {
86
+ // Ignore non-JSON contexts generated outside of ky.
87
+ }
88
+ }
89
+ if (Array.isArray(node.suites)) {
90
+ node.suites.forEach((suite) => {
91
+ rewriteScreenshotContextPaths(suite, comboFolderName);
92
+ });
93
+ }
94
+ if (Array.isArray(node.tests)) {
95
+ node.tests.forEach((test) => {
96
+ rewriteScreenshotContextPaths(test, comboFolderName);
97
+ });
98
+ }
99
+ };
50
100
  /**
51
101
  * Merge all per-combination mochawesome JSON reports into a single JSON
52
102
  * and generate one combined HTML report for all runs.
@@ -68,11 +118,13 @@ const mergeAllReportsAndGenerateHtml = (outputDir, results) => {
68
118
  const raw = fs_1.default.readFileSync(jsonPath, 'utf-8');
69
119
  const data = JSON.parse(raw);
70
120
  const label = `[${result.profileName}][${result.browser}] `;
121
+ const comboFolderName = `${result.profileName}-${result.browser}`;
71
122
  if (Array.isArray(data.results)) {
72
123
  data.results.forEach((res) => {
73
124
  if (res && res.suites) {
74
125
  annotateMochawesomeSuites(res.suites, label);
75
126
  }
127
+ rewriteScreenshotContextPaths(res, comboFolderName);
76
128
  });
77
129
  }
78
130
  // Annotate tests with their profile+browser
@@ -1 +1 @@
1
- {"version":3,"file":"mergeAllReportsAndGenerateHtml.js","sourceRoot":"","sources":["../../../start/helpers/mergeAllReportsAndGenerateHtml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mergeAllReportsAndGenerateHtml.js","sourceRoot":"","sources":["../../../start/helpers/mergeAllReportsAndGenerateHtml.ts"],"names":[],"mappings":"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"}
@@ -179,11 +179,20 @@
179
179
  background: #115293;
180
180
  border-color: #115293;
181
181
  }
182
- .screenshots-header {
182
+ .screenshots-details {
183
183
  margin-top: 0.875rem;
184
+ border-top: 0.0625rem solid #e5e5e5;
185
+ padding-top: 0.75rem;
186
+ }
187
+ .screenshots-details summary {
188
+ cursor: pointer;
184
189
  font-weight: 600;
190
+ color: #333;
191
+ list-style-position: inside;
185
192
  }
186
193
  .screenshot-list {
194
+ margin-top: 0.625rem;
195
+ margin-bottom: 0;
187
196
  padding-left: 1.25rem;
188
197
  padding-right: 0.5rem;
189
198
  }
@@ -265,12 +274,14 @@
265
274
  <p class="no-report">Report not available</p>
266
275
  <% } %>
267
276
  <% if (report.screenshots && report.screenshots.length > 0) { %>
268
- <div class="screenshots-header">📸 Screenshots from failed tests</div>
269
- <ul class="screenshot-list">
270
- <% report.screenshots.forEach((screenshot) => { %>
271
- <li><a href="<%= screenshot.href %>" target="_blank"><%= screenshot.name %></a></li>
272
- <% }) %>
273
- </ul>
277
+ <details class="screenshots-details">
278
+ <summary>Screenshots from failed tests (<%= report.screenshots.length %>)</summary>
279
+ <ul class="screenshot-list">
280
+ <% report.screenshots.forEach((screenshot) => { %>
281
+ <li><a href="<%= screenshot.href %>" target="_blank"><%= screenshot.name %></a></li>
282
+ <% }) %>
283
+ </ul>
284
+ </details>
274
285
  <% } %>
275
286
  </div>
276
287
  <% }) %>
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Checks arguments and environment variables (for PROFILE, BROWSER, and HEADLESS),
3
- * asks user for missing selections, and launches Cypress
2
+ * Checks environment variables (for PROFILE, BROWSER, and HEADLESS),
3
+ * asks the user for missing selections, and launches Cypress
4
4
  * @author Gardenia Liu
5
5
  * @author Yuen Ler Chow
6
6
  */