@kinora/reporter 0.9.0 → 0.11.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/dist/index.d.mts CHANGED
@@ -29,6 +29,12 @@ export interface KinoraReporterOptions {
29
29
  * Playwright already embeds them in the trace.zip).
30
30
  */
31
31
  uploadAttachments?: AttachmentKind[];
32
+ /**
33
+ * Sharded runs (`--shard`): the uploads of every shard of one CI run are assembled into a single
34
+ * kinora run. Shards are grouped by this key, defaulting to env KINORA_GROUP_KEY, then the CI run
35
+ * (GITHUB_RUN_ID / CI_PIPELINE_ID). `false` uploads each shard as its own run.
36
+ */
37
+ groupKey?: string | false;
32
38
  }
33
39
  export default class KinoraReporter implements Reporter {
34
40
  private readonly options;
@@ -37,6 +43,7 @@ export default class KinoraReporter implements Reporter {
37
43
  constructor(options: KinoraReporterOptions);
38
44
  onBegin(config: FullConfig, suite: Suite): void;
39
45
  onEnd(result: FullResult): Promise<void>;
46
+ private prCommentLabel;
40
47
  private maybePostPrComment;
41
48
  }
42
49
  //#endregion
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { readFileSync, statSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import process from "node:process";
4
- import { DEFAULT_KINORA_URL, DEFAULT_UPLOAD_ATTACHMENTS, IngestError, a11yFromScans, createIngestClient, detectCiEnv, effectiveAttachments, flakyTestsOf, isUploadableAttachment, makeTestKey, parseAxeScan, postPrComment, resolvePrContext } from "@kinora/core";
4
+ import { DEFAULT_KINORA_URL, DEFAULT_UPLOAD_ATTACHMENTS, IngestError, a11yFromScans, createIngestClient, detectCiEnv, effectiveAttachments, flakyTestsOf, isUploadableAttachment, makeTestKey, parseAxeScan, postPrComment, resolvePrContext, resolveShardGroup } from "@kinora/core";
5
5
  //#region src/index.ts
6
6
  function identity(test) {
7
7
  let file = "";
@@ -104,6 +104,11 @@ var KinoraReporter = class {
104
104
  }
105
105
  const tests = (this.suite?.allTests() ?? []).map(toNormTest);
106
106
  const detected = detectCiEnv(process.env);
107
+ const shard = this.config?.shard;
108
+ const group = shard && this.options.groupKey !== false ? resolveShardGroup(process.env, {
109
+ groupKey: this.options.groupKey,
110
+ leg: this.prCommentLabel()
111
+ }) : void 0;
107
112
  const payload = {
108
113
  project: {
109
114
  slug: this.options.project.slug,
@@ -115,7 +120,14 @@ var KinoraReporter = class {
115
120
  counts: countsOf(tests),
116
121
  playwrightVersion: this.config?.version,
117
122
  git: this.options.git ?? detected.git,
118
- ci: this.options.ci ?? detected.ci
123
+ ci: this.options.ci ?? detected.ci,
124
+ ...shard && group && {
125
+ ...group,
126
+ shard: {
127
+ current: shard.current,
128
+ total: shard.total
129
+ }
130
+ }
119
131
  },
120
132
  tests
121
133
  };
@@ -143,20 +155,26 @@ var KinoraReporter = class {
143
155
  console.warn(`[kinora] ${a.name} upload failed for ${t.testKey}:`, err instanceof Error ? err.message : err);
144
156
  }
145
157
  }
146
- console.log(`[kinora] uploaded ${res.tests} tests + ${artifacts} artifacts (run ${res.runId})`);
158
+ console.log(`[kinora] uploaded ${res.tests} tests + ${artifacts} artifacts (run ${res.runId}${res.shardProgress ? `, ${res.shardProgress.landed} of ${res.shardProgress.total} shards` : ""})`);
147
159
  await this.maybePostPrComment(payload, res);
148
160
  } catch (err) {
149
161
  if (err instanceof IngestError && err.status === 402) console.warn(`[kinora] ${err.message}`);
150
162
  else console.error(`[kinora] upload failed:`, err instanceof Error ? err.message : err);
151
163
  }
152
164
  }
165
+ prCommentLabel() {
166
+ const opt = this.options.prComment;
167
+ return typeof opt === "object" ? opt.label : void 0;
168
+ }
153
169
  async maybePostPrComment(payload, res) {
154
170
  if (!this.options.prComment) return;
155
171
  const opt = this.options.prComment;
156
- const label = typeof opt === "object" ? opt.label : void 0;
172
+ const label = this.prCommentLabel();
157
173
  const policy = typeof opt === "object" ? opt.policy : void 0;
174
+ const grouped = !!payload.run.groupKey;
175
+ if (grouped && !res.shardProgress) return;
158
176
  try {
159
- const env = this.config?.shard ? {
177
+ const env = this.config?.shard && !grouped ? {
160
178
  ...process.env,
161
179
  __KINORA_IS_SHARD: "1"
162
180
  } : process.env;
@@ -174,9 +192,13 @@ var KinoraReporter = class {
174
192
  label,
175
193
  runUrl: res.runUrl,
176
194
  ciRunUrl: payload.run.ci?.runUrl,
177
- counts: payload.run.counts,
195
+ counts: res.counts ?? payload.run.counts,
178
196
  regression: res.regression,
179
- flaky: flakyTestsOf(payload.tests)
197
+ flaky: res.flaky ?? flakyTestsOf(payload.tests),
198
+ ...res.shardProgress && { shards: {
199
+ runId: res.runId,
200
+ ...res.shardProgress
201
+ } }
180
202
  }, policy ?? "always");
181
203
  if (outcome !== "skipped") console.warn(`[kinora] PR comment ${outcome}`);
182
204
  } catch (err) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kinora/reporter",
3
3
  "type": "module",
4
- "version": "0.9.0",
4
+ "version": "0.11.0",
5
5
  "description": "Playwright reporter that uploads test results to a kinora server",
6
6
  "author": "Joris Gallot",
7
7
  "license": "MIT",
@@ -35,7 +35,7 @@
35
35
  "access": "public"
36
36
  },
37
37
  "peerDependencies": {
38
- "@axe-core/playwright": ">=4.7.0",
38
+ "@axe-core/playwright": ">=4.14.0",
39
39
  "@playwright/test": ">=1.40.0"
40
40
  },
41
41
  "peerDependenciesMeta": {
@@ -44,16 +44,16 @@
44
44
  }
45
45
  },
46
46
  "dependencies": {
47
- "@kinora/core": "0.11.0"
47
+ "@kinora/core": "0.13.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@axe-core/playwright": "^4.13.0",
51
- "@playwright/test": "^1.64.0",
50
+ "@axe-core/playwright": "^4.14.0",
51
+ "@playwright/test": "^1.64.1",
52
52
  "@types/node": "^26.6.5",
53
- "@vitest/coverage-v8": "^5.0.4",
53
+ "@vitest/coverage-v8": "^5.0.5",
54
54
  "tsdown": "^0.23.1",
55
55
  "typescript": "~6.0.3",
56
- "vitest": "^5.0.4"
56
+ "vitest": "^5.0.5"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "tsdown",