@e2edev/github 0.1.0 → 0.2.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 CHANGED
@@ -25,7 +25,7 @@ of one job pass a `key` so their comments stay apart. When the reporter cannot
25
25
  post (another CI, a push, a fork's read-only token) it says why in one summary
26
26
  row and never changes the run's exit code.
27
27
 
28
- Full documentation lives at [e2e-docs.vercel.app/github](https://e2e-docs.vercel.app/github).
28
+ Full documentation lives at [e2e.mintlify.app/github](https://e2e.mintlify.app/github).
29
29
 
30
30
  ## License
31
31
 
package/dist/index.d.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  /**
2
- * `@e2edev/github` public surface: the `github()` reporter factory and the
3
- * comment builder it uses. The reporter posts one pull request comment per
4
- * run from GitHub Actions, through the `reporters` seam of `@e2edev/e2e`,
5
- * and writes the same text to the job summary.
2
+ * `@e2edev/github` public surface: the `github()` reporter factory. The
3
+ * reporter posts one pull request comment per run from GitHub Actions,
4
+ * through the `reporters` seam of `@e2edev/e2e`, and writes the same text to
5
+ * the job summary. The page itself is `renderMarkdownReport` from `@e2edev/e2e`.
6
6
  */
7
7
  export { github } from './reporter.ts';
8
8
  export type { GitHubOptions } from './reporter.ts';
9
- export { renderComment, MAX_MARKER_CHARS, MAX_URL_CHARS } from './comment.ts';
10
- export type { CommentOptions } from './comment.ts';
11
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,8 @@
1
1
  /**
2
- * `@e2edev/github` public surface: the `github()` reporter factory and the
3
- * comment builder it uses. The reporter posts one pull request comment per
4
- * run from GitHub Actions, through the `reporters` seam of `@e2edev/e2e`,
5
- * and writes the same text to the job summary.
2
+ * `@e2edev/github` public surface: the `github()` reporter factory. The
3
+ * reporter posts one pull request comment per run from GitHub Actions,
4
+ * through the `reporters` seam of `@e2edev/e2e`, and writes the same text to
5
+ * the job summary. The page itself is `renderMarkdownReport` from `@e2edev/e2e`.
6
6
  */
7
7
  export { github } from './reporter.js';
8
- export { renderComment, MAX_MARKER_CHARS, MAX_URL_CHARS } from './comment.js';
9
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { FinishedRun, Reporter, ReporterSummary } from '@e2edev/e2e';
1
+ import { type FinishedRun, type Reporter, type ReporterSummary } from '@e2edev/e2e';
2
2
  import { type ActionsDeps } from './actions.ts';
3
3
  export interface GitHubOptions {
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAMpF,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,QAAQ,CAW5D;AA+DD,4FAA4F;AAC5F,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,CAAC,CAyB1B"}
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,WAAW,EAA8B,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACtI,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAKpF,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,QAAQ,CAW5D;AAgED,4FAA4F;AAC5F,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,CAAC,CA0B1B"}
package/dist/reporter.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { appendFile, readFile } from 'node:fs/promises';
2
+ import { renderMarkdownReport } from '@e2edev/e2e';
2
3
  import { detectActions } from './actions.js';
3
- import { renderComment } from './comment.js';
4
4
  import { upsertComment } from './post.js';
5
5
  const SUMMARY_LABEL = 'GitHub';
6
6
  /**
@@ -29,7 +29,8 @@ export function github(options = {}) {
29
29
  }
30
30
  /**
31
31
  * Each encoded marker field is cut to this many characters, so four fields
32
- * and their names stay under `MAX_MARKER_CHARS` whatever the input. The cut
32
+ * and their names stay under a kilobyte whatever the input, well inside the
33
+ * room the page leaves under GitHub's size limit. The cut
33
34
  * never lands inside a percent escape, and it is the same on every run.
34
35
  */
35
36
  const MAX_MARKER_FIELD_CHARS = 200;
@@ -84,8 +85,9 @@ export async function reportRun(run, signal, options, deps) {
84
85
  const context = await detectActions(deps);
85
86
  if (context === undefined)
86
87
  return [{ label: SUMMARY_LABEL, text: 'not posted: not running on GitHub Actions' }];
87
- const links = { artifactsUrl: context.runUrl, sourceUrl: sourceUrl(context) };
88
- const summary = await writeSummary(context, renderComment(run.report, links), deps);
88
+ // One page for both places; the comment carries the marker a rerun finds it by.
89
+ const page = renderMarkdownReport(run.report, { artifactsUrl: context.runUrl, sourceUrl: sourceUrl(context) });
90
+ const summary = await writeSummary(context, page, deps);
89
91
  const post = posting(context);
90
92
  const marker = commentMarker(run, context, options.key);
91
93
  const lead = 'skipped' in post
@@ -97,7 +99,7 @@ export async function reportRun(run, signal, options, deps) {
97
99
  repository: context.repository,
98
100
  ...post,
99
101
  marker,
100
- body: renderComment(run.report, { ...links, marker }),
102
+ body: `${marker}\n${page}`,
101
103
  });
102
104
  return [
103
105
  { label: SUMMARY_LABEL, text: lead },
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAyC,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,aAAa,EAAuB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,aAAa,GAAG,QAAQ,CAAC;AAkB/B;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CAAC,OAAO,GAAkB,EAAE;IAChD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAC7B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;YAC9B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAC1C,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;SAC3D,CAAC;KACL,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,IAAI,sBAAsB;QAAE,OAAO,OAAO,CAAC;IAC7D,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,GAAgB,EAAE,OAAuB,EAAE,GAAuB;IACvF,MAAM,MAAM,GAAuC;QACjD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG;KACJ,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAC7D,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAC7E,CAAC;IACF,OAAO,mBAAmB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAAC,OAAuB;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACpB,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;AAC3H,CAAC;AAKD,SAAS,OAAO,CAAC,OAAuB;IACtC,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC;IACxG,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,wEAAwE,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;AACpE,CAAC;AAID,KAAK,UAAU,YAAY,CAAC,OAAuB,EAAE,IAAY,EAAE,IAAgB;IACjF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAgB,EAChB,MAAmB,EACnB,OAAsB,EACtB,IAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC,CAAC;IAEhH,MAAM,KAAK,GAAmB,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9F,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,IAAI,GACR,SAAS,IAAI,IAAI;QACf,CAAC,CAAC,eAAe,IAAI,CAAC,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7F,CAAC,CAAC,MAAM,aAAa,CAAC;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,GAAG,IAAI;YACP,MAAM;YACN,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC;SACtD,CAAC,CAAC;IAET,OAAO;QACL,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;QACpC,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,4BAA4B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACvH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e2edev/github",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "GitHub reporter for e2e: one pull request comment per run, from GitHub Actions",
5
5
  "keywords": [
6
6
  "e2e",
@@ -43,13 +43,13 @@
43
43
  "dist"
44
44
  ],
45
45
  "peerDependencies": {
46
- "@e2edev/e2e": ">=0.9.0 <1"
46
+ "@e2edev/e2e": ">=0.13.0 <1"
47
47
  },
48
48
  "devDependencies": {
49
+ "@e2edev/e2e": "0.14.0",
49
50
  "@types/node": "26.4.1",
50
51
  "typescript": "7.0.2",
51
- "vitest": "5.0.0",
52
- "@e2edev/e2e": "0.10.0"
52
+ "vitest": "5.0.0"
53
53
  },
54
54
  "engines": {
55
55
  "node": ">=22.12.0"
package/dist/comment.d.ts DELETED
@@ -1,29 +0,0 @@
1
- /**
2
- * The report-1 document as one pull request comment: a headline with the
3
- * counts, the run-level errors, a table of every test that did not simply
4
- * pass, the passed tests folded away, and where the evidence is.
5
- *
6
- * Everything a test wrote (titles, error messages) is untrusted text on its
7
- * way into markdown GitHub renders, so cells are escaped and clipped. The
8
- * builder is exported so a hosted run page can render the same comment.
9
- */
10
- import type { Report } from '@e2edev/e2e';
11
- export interface CommentOptions {
12
- /** A hidden HTML comment the reporter finds its own comment by; left out of a job summary. */
13
- readonly marker?: string | undefined;
14
- /** Where the run's artifacts can be fetched: the workflow run page, or a hosted run page. */
15
- readonly artifactsUrl?: string | undefined;
16
- /** A link to a source line, when the commit is known. */
17
- readonly sourceUrl?: ((file: string, line: number) => string) | undefined;
18
- }
19
- /**
20
- * A marker is what a rerun finds the comment by, so it can never be cut. With
21
- * it bounded, the head and footer together stay far under the budget and the
22
- * body is the only part that ever gives way.
23
- */
24
- export declare const MAX_MARKER_CHARS = 1024;
25
- /** The artifacts link sits in the footer beside the marker, so it is bounded the same way. */
26
- export declare const MAX_URL_CHARS = 2048;
27
- /** Renders the run as a pull request comment body. */
28
- export declare function renderComment(report: Report, options?: CommentOptions): string;
29
- //# sourceMappingURL=comment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../src/comment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQ1C,MAAM,WAAW,cAAc;IAC7B,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,6FAA6F;IAC7F,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAC3E;AAWD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,8FAA8F;AAC9F,eAAO,MAAM,aAAa,OAAQ,CAAC;AA2InC,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CA2ElF"}
package/dist/comment.js DELETED
@@ -1,209 +0,0 @@
1
- /**
2
- * The report-1 document as one pull request comment: a headline with the
3
- * counts, the run-level errors, a table of every test that did not simply
4
- * pass, the passed tests folded away, and where the evidence is.
5
- *
6
- * Everything a test wrote (titles, error messages) is untrusted text on its
7
- * way into markdown GitHub renders, so cells are escaped and clipped. The
8
- * builder is exported so a hosted run page can render the same comment.
9
- */
10
- import { stripVTControlCharacters } from 'node:util';
11
- /** GitHub rejects a comment body past 65536 characters; stay clear of it. */
12
- const MAX_BODY_CHARS = 60_000;
13
- /** Reader caps, not size guards: past these the comment says how many more there are. */
14
- const MAX_TABLE_ROWS = 50;
15
- const MAX_RUN_ERRORS = 20;
16
- const MAX_PASSED_LINES = 200;
17
- const MAX_FOOTER_TARGETS = 8;
18
- const MAX_CELL_CHARS = 240;
19
- const TRUNCATED_NOTE = "_Comment truncated to fit GitHub's size limit; the full report is in the run artifacts._";
20
- /**
21
- * A marker is what a rerun finds the comment by, so it can never be cut. With
22
- * it bounded, the head and footer together stay far under the budget and the
23
- * body is the only part that ever gives way.
24
- */
25
- export const MAX_MARKER_CHARS = 1_024;
26
- /** The artifacts link sits in the footer beside the marker, so it is bounded the same way. */
27
- export const MAX_URL_CHARS = 2_048;
28
- /** C0/C1 control characters except tab and newline; ANSI sequences are stripped first. */
29
- // oxlint-disable-next-line no-control-regex -- the control range is the point
30
- const CONTROL_PATTERN = /[\x00-\x08\x0b-\x1f\x7f-\x9f]/g;
31
- /** One line of plain text: no color codes, no control characters, no line breaks. */
32
- function plain(text) {
33
- return stripVTControlCharacters(text).replace(CONTROL_PATTERN, '').replace(/\s+/g, ' ').trim();
34
- }
35
- /** Clips by code point, so an emoji at the cut never becomes a lone surrogate. */
36
- function clip(text, max) {
37
- const points = [...text];
38
- return points.length <= max ? text : `${points.slice(0, max - 1).join('')}…`;
39
- }
40
- /**
41
- * Text safe inside a table cell: markdown that could open a construct is
42
- * escaped, angle brackets become entities so no HTML gets through, and the
43
- * cell separator is escaped. An underscore stays: inside a word GitHub
44
- * never reads it as emphasis, and error codes are full of them.
45
- */
46
- function cell(text, max = MAX_CELL_CHARS) {
47
- return clip(plain(text), max)
48
- .replace(/[\\`*[\]~|]/g, (char) => `\\${char}`)
49
- .replaceAll('<', '&lt;')
50
- .replaceAll('>', '&gt;');
51
- }
52
- function formatDuration(ms) {
53
- if (ms < 1_000)
54
- return `${Math.round(ms)}ms`;
55
- if (ms < 60_000)
56
- return `${(ms / 1_000).toFixed(1)}s`;
57
- // Round to whole seconds first, so 119.5 s is 2m 0s and never 1m 60s.
58
- const total = Math.round(ms / 1_000);
59
- return `${Math.floor(total / 60)}m ${total % 60}s`;
60
- }
61
- function plural(count, noun) {
62
- return `${count} ${noun}${count === 1 ? '' : 's'}`;
63
- }
64
- function outcome(result, groups) {
65
- const attempts = result.serialGroupId === undefined ? result.attempts : (groups.get(result.serialGroupId)?.attempts ?? []);
66
- const last = attempts.at(-1);
67
- const member = result.serialGroupId === undefined || last === undefined || !('members' in last)
68
- ? undefined
69
- : last.members.find((candidate) => candidate.testId === result.testId);
70
- return {
71
- durationMs: member?.durationMs ?? last?.durationMs ?? 0,
72
- error: member?.error ?? last?.error,
73
- failedAttempts: attempts.slice(0, -1).filter((attempt) => attempt.status !== 'passed').length,
74
- artifactKinds: kinds(attempts.flatMap((attempt) => attempt.artifacts)),
75
- };
76
- }
77
- /** Screenshots first, then the recording, then the trace; the compiler fails when a kind is missing here. */
78
- const KIND_RANK = { screenshot: 0, video: 1, trace: 2, download: 3, log: 4 };
79
- function kinds(artifacts) {
80
- return [...new Set(artifacts.map((artifact) => artifact.kind))].toSorted((a, b) => KIND_RANK[a] - KIND_RANK[b]);
81
- }
82
- function bucket(status) {
83
- return status === 'passed' || status === 'flaky' || status === 'skipped' ? status : 'failed';
84
- }
85
- const ICON = { failed: '🔴', flaky: '⚠️', skipped: '⏭️', passed: '🟢' };
86
- /** The order the table lists what did not pass; passed tests fold away below it. */
87
- const LISTED = ['failed', 'flaky', 'skipped'];
88
- function groupByBucket(results) {
89
- const groups = new Map();
90
- for (const result of results) {
91
- const key = bucket(result.status);
92
- groups.set(key, [...(groups.get(key) ?? []), result]);
93
- }
94
- return groups;
95
- }
96
- function headline(run, groups) {
97
- const parts = ['failed', 'flaky', 'passed', 'skipped']
98
- .filter((key) => (groups.get(key)?.length ?? 0) > 0)
99
- .map((key) => `${groups.get(key)?.length} ${key}`);
100
- const summary = parts.length > 0 ? parts.join(', ') : run.errors.length > 0 ? 'no tests ran' : 'no tests selected';
101
- return `### ${run.status === 'passed' ? ICON.passed : ICON.failed} e2e: ${summary}`;
102
- }
103
- function errorText(error) {
104
- const phase = error.phase === undefined ? '' : ` (${plain(error.phase)})`;
105
- return `**${cell(error.code, 128)}**${phase} ${cell(error.message)}`.trim();
106
- }
107
- function outcomeCell(result, final) {
108
- if (result.status === 'flaky' && final.failedAttempts > 0) {
109
- return `flaky: passed after ${plural(final.failedAttempts, 'failed attempt')}`;
110
- }
111
- if (result.status === 'skipped')
112
- return `skipped: ${cell(result.skip?.reason ?? 'skipped')}`;
113
- return final.error === undefined ? cell(result.status) : errorText(final.error);
114
- }
115
- function evidenceCell(final, options) {
116
- if (final.artifactKinds.length === 0)
117
- return '';
118
- const text = final.artifactKinds.join(', ');
119
- return options.artifactsUrl === undefined ? text : `[${text}](${options.artifactsUrl})`;
120
- }
121
- function footer(run, options) {
122
- const duration = formatDuration(Date.parse(run.finishedAt) - Date.parse(run.startedAt));
123
- const shown = run.targets.slice(0, MAX_FOOTER_TARGETS).map((target) => cell(target.id, 64));
124
- if (run.targets.length > shown.length)
125
- shown.push(`and ${run.targets.length - shown.length} more`);
126
- const targets = shown.length === 0 ? '' : ` (${shown.join(', ')})`;
127
- return [
128
- ...(options.artifactsUrl === undefined
129
- ? []
130
- : [`Screenshots, traces, and recordings: [run artifacts](${options.artifactsUrl}).`]),
131
- `<sub>e2e ${cell(run.runner.version, 64)} · ${duration} · ${plural(run.targets.length, 'target')}${targets}</sub>`,
132
- ];
133
- }
134
- /** Renders the run as a pull request comment body. */
135
- export function renderComment(report, options = {}) {
136
- if (options.marker !== undefined && options.marker.length > MAX_MARKER_CHARS) {
137
- throw new Error(`renderComment: marker must be at most ${MAX_MARKER_CHARS} characters, got ${options.marker.length}`);
138
- }
139
- if (options.artifactsUrl !== undefined && options.artifactsUrl.length > MAX_URL_CHARS) {
140
- throw new Error(`renderComment: artifactsUrl must be at most ${MAX_URL_CHARS} characters, got ${options.artifactsUrl.length}`);
141
- }
142
- const run = report.run;
143
- const serialGroups = new Map(run.serialGroups.map((group) => [group.id, group]));
144
- const groups = groupByBucket(run.results);
145
- const manyTargets = run.targets.length > 1;
146
- /** `file:line › suite › title (target)`, the location linked when the commit is known. */
147
- const name = (result, location) => {
148
- const title = result.titlePath.map((part) => cell(part, 120)).join(' › ');
149
- return `${location} › ${title}${manyTargets ? ` (${cell(result.targetId, 64)})` : ''}`;
150
- };
151
- const linked = (result) => {
152
- const location = `${result.source.file}:${result.source.line}`;
153
- return options.sourceUrl === undefined
154
- ? `\`${plain(location).replaceAll('`', '')}\``
155
- : `[${cell(location)}](${options.sourceUrl(result.source.file, result.source.line)})`;
156
- };
157
- // Body parts in priority order; each is one line, except the passed list,
158
- // which is one block since a `<details>` cannot be cut halfway.
159
- const errors = run.errors.slice(0, MAX_RUN_ERRORS).map((error) => `> ${errorText(error)}`);
160
- if (run.errors.length > errors.length)
161
- errors.push(`> and ${run.errors.length - errors.length} more`);
162
- const listed = LISTED.flatMap((key) => groups.get(key) ?? []);
163
- const rows = listed.slice(0, MAX_TABLE_ROWS).map((result) => {
164
- const final = outcome(result, serialGroups);
165
- return `| ${ICON[bucket(result.status)]} | ${name(result, linked(result))} | ${outcomeCell(result, final)} | ${evidenceCell(final, options)} |`;
166
- });
167
- const table = rows.length === 0 ? [] : ['| | Test | Outcome | Evidence |', '| --- | --- | --- | --- |', ...rows];
168
- if (listed.length > rows.length)
169
- table.push(`| | and ${listed.length - rows.length} more | | |`);
170
- const passed = groups.get('passed') ?? [];
171
- const passedBlock = passed.length === 0
172
- ? []
173
- : [
174
- [
175
- '<details>',
176
- `<summary>${plural(passed.length, 'passed test')}</summary>`,
177
- '',
178
- ...passed
179
- .slice(0, MAX_PASSED_LINES)
180
- .map((result) => `- ${name(result, cell(result.file, 200))} (${formatDuration(outcome(result, serialGroups).durationMs)})`),
181
- ...(passed.length > MAX_PASSED_LINES ? [`- and ${passed.length - MAX_PASSED_LINES} more`] : []),
182
- '</details>',
183
- ].join('\n'),
184
- ];
185
- const sections = [errors, table, passedBlock].filter((section) => section.length > 0);
186
- const head = [...(options.marker === undefined ? [] : [options.marker]), headline(run, groups), ''];
187
- const tail = footer(run, options);
188
- const render = (body) => `${[...head, ...body, ...tail].join('\n')}\n`;
189
- // Greedy fit: keep whole parts in order while they fit, then say what was cut.
190
- let size = render([TRUNCATED_NOTE]).length;
191
- const body = [];
192
- let cut = false;
193
- for (const section of sections) {
194
- for (const part of section) {
195
- if (size + part.length + 1 > MAX_BODY_CHARS) {
196
- cut = true;
197
- break;
198
- }
199
- body.push(part);
200
- size += part.length + 1;
201
- }
202
- if (cut)
203
- break;
204
- body.push('');
205
- size += 1;
206
- }
207
- return render(cut ? [...body, TRUNCATED_NOTE] : body);
208
- }
209
- //# sourceMappingURL=comment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"comment.js","sourceRoot":"","sources":["../src/comment.ts"],"names":[],"mappings":"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"}