@flakiness/sdk 1.0.1 → 1.1.0-alpha.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/lib/browser.js CHANGED
@@ -171,7 +171,7 @@ function computeTestId(test, suiteId) {
171
171
  });
172
172
  }
173
173
 
174
- // node_modules/.pnpm/@flakiness+flakiness-report@0.22.0/node_modules/@flakiness/flakiness-report/lib/flakinessReport.js
174
+ // node_modules/.pnpm/@flakiness+flakiness-report@0.25.0_zod@4.3.5/node_modules/@flakiness/flakiness-report/lib/flakinessReport.js
175
175
  var FlakinessReport;
176
176
  ((FlakinessReport22) => {
177
177
  FlakinessReport22.CATEGORY_PLAYWRIGHT = "playwright";
@@ -179,7 +179,7 @@ var FlakinessReport;
179
179
  FlakinessReport22.CATEGORY_JUNIT = "junit";
180
180
  })(FlakinessReport || (FlakinessReport = {}));
181
181
 
182
- // node_modules/.pnpm/@flakiness+flakiness-report@0.22.0/node_modules/@flakiness/flakiness-report/lib/schema.js
182
+ // node_modules/.pnpm/@flakiness+flakiness-report@0.25.0_zod@4.3.5/node_modules/@flakiness/flakiness-report/lib/schema.js
183
183
  import z from "zod/v4";
184
184
  var Schema;
185
185
  ((Schema2) => {
@@ -284,7 +284,9 @@ var Schema;
284
284
  samples: z.array(Schema2.SystemUtilizationSample)
285
285
  });
286
286
  Schema2.UtilizationTelemetry = z.tuple([Schema2.DurationMS, z.number().min(0).max(100)]);
287
+ Schema2.FlakinessProject = z.string();
287
288
  Schema2.Report = z.object({
289
+ flakinessProject: Schema2.FlakinessProject.optional(),
288
290
  category: z.string().min(1).max(100),
289
291
  commitId: Schema2.CommitId,
290
292
  relatedCommitIds: z.array(Schema2.CommitId).optional(),
package/lib/index.js CHANGED
@@ -775,7 +775,7 @@ function computeTestId(test, suiteId) {
775
775
  });
776
776
  }
777
777
 
778
- // node_modules/.pnpm/@flakiness+flakiness-report@0.22.0/node_modules/@flakiness/flakiness-report/lib/flakinessReport.js
778
+ // node_modules/.pnpm/@flakiness+flakiness-report@0.25.0_zod@4.3.5/node_modules/@flakiness/flakiness-report/lib/flakinessReport.js
779
779
  var FlakinessReport;
780
780
  ((FlakinessReport22) => {
781
781
  FlakinessReport22.CATEGORY_PLAYWRIGHT = "playwright";
@@ -783,7 +783,7 @@ var FlakinessReport;
783
783
  FlakinessReport22.CATEGORY_JUNIT = "junit";
784
784
  })(FlakinessReport || (FlakinessReport = {}));
785
785
 
786
- // node_modules/.pnpm/@flakiness+flakiness-report@0.22.0/node_modules/@flakiness/flakiness-report/lib/schema.js
786
+ // node_modules/.pnpm/@flakiness+flakiness-report@0.25.0_zod@4.3.5/node_modules/@flakiness/flakiness-report/lib/schema.js
787
787
  import z from "zod/v4";
788
788
  var Schema;
789
789
  ((Schema2) => {
@@ -888,7 +888,9 @@ var Schema;
888
888
  samples: z.array(Schema2.SystemUtilizationSample)
889
889
  });
890
890
  Schema2.UtilizationTelemetry = z.tuple([Schema2.DurationMS, z.number().min(0).max(100)]);
891
+ Schema2.FlakinessProject = z.string();
891
892
  Schema2.Report = z.object({
893
+ flakinessProject: Schema2.FlakinessProject.optional(),
892
894
  category: z.string().min(1).max(100),
893
895
  commitId: Schema2.CommitId,
894
896
  relatedCommitIds: z.array(Schema2.CommitId).optional(),
@@ -936,6 +938,39 @@ function stripAnsi(str) {
936
938
  import assert2 from "assert";
937
939
  import fs4 from "fs";
938
940
  import { URL as URL2 } from "url";
941
+
942
+ // src/_githubOIDC.ts
943
+ var GithubOIDC = class _GithubOIDC {
944
+ constructor(_requestUrl, _requestToken) {
945
+ this._requestUrl = _requestUrl;
946
+ this._requestToken = _requestToken;
947
+ }
948
+ static initializeFromEnv() {
949
+ const requestUrl = process.env.ACTIONS_ID_TOKEN_REQUEST_URL;
950
+ const requestToken = process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
951
+ return requestUrl && requestToken ? new _GithubOIDC(requestUrl, requestToken) : void 0;
952
+ }
953
+ async fetchToken(audience) {
954
+ const url = new URL(this._requestUrl);
955
+ url.searchParams.set("audience", audience);
956
+ const response = await fetch(url, {
957
+ headers: {
958
+ "Authorization": `bearer ${this._requestToken}`,
959
+ "Accept": "application/json; api-version=2.0"
960
+ }
961
+ });
962
+ if (!response.ok) {
963
+ const body = await response.text().catch(() => "");
964
+ throw new Error(`Failed to request GitHub OIDC token: ${response.status} ${body}`);
965
+ }
966
+ const json = await response.json();
967
+ if (!json.value)
968
+ throw new Error("GitHub OIDC token response did not contain a token value.");
969
+ return json.value;
970
+ }
971
+ };
972
+
973
+ // src/uploadReport.ts
939
974
  async function createFileAttachment(contentType, filePath) {
940
975
  return {
941
976
  type: "file",
@@ -953,9 +988,28 @@ async function createDataAttachment(contentType, data) {
953
988
  };
954
989
  }
955
990
  async function uploadReport(report, attachments, options) {
956
- const flakinessAccessToken = options?.flakinessAccessToken ?? process.env["FLAKINESS_ACCESS_TOKEN"];
957
- const flakinessEndpoint = options?.flakinessEndpoint ?? process.env["FLAKINESS_ENDPOINT"] ?? "https://flakiness.io";
991
+ let flakinessAccessToken = options?.flakinessAccessToken ?? process.env["FLAKINESS_ACCESS_TOKEN"];
958
992
  const logger = options?.logger ?? console;
993
+ const githubOIDC = GithubOIDC.initializeFromEnv();
994
+ if (!flakinessAccessToken && githubOIDC) {
995
+ if (!report.flakinessProject) {
996
+ const reason = "`flakinessProject` is not configured to upload using Github OIDC.";
997
+ if (process.env.CI)
998
+ logger.warn(`[flakiness.io] \u26A0 Skipping upload: ${reason}`);
999
+ return { status: "skipped", reason };
1000
+ }
1001
+ try {
1002
+ flakinessAccessToken = await githubOIDC.fetchToken(report.flakinessProject);
1003
+ if (!flakinessAccessToken)
1004
+ throw new Error("token is empty");
1005
+ } catch (e) {
1006
+ const errorMessage = e.message || String(e);
1007
+ logger.error(`[flakiness.io] \u2715 Unexpected error while fetching Github OIDC token: ${errorMessage}`);
1008
+ if (options?.throwOnFailure)
1009
+ throw e;
1010
+ return { status: "failed", error: errorMessage };
1011
+ }
1012
+ }
959
1013
  if (!flakinessAccessToken) {
960
1014
  const reason = "No FLAKINESS_ACCESS_TOKEN found";
961
1015
  if (process.env.CI)
@@ -963,6 +1017,7 @@ async function uploadReport(report, attachments, options) {
963
1017
  return { status: "skipped", reason };
964
1018
  }
965
1019
  try {
1020
+ const flakinessEndpoint = options?.flakinessEndpoint ?? process.env["FLAKINESS_ENDPOINT"] ?? "https://flakiness.io";
966
1021
  const upload = new ReportUpload(report, attachments, { flakinessAccessToken, flakinessEndpoint });
967
1022
  const uploadResult = await upload.upload();
968
1023
  if (!uploadResult.success) {
@@ -1339,7 +1394,7 @@ var StaticServer = class {
1339
1394
  ".ico": "image/x-icon",
1340
1395
  ".txt": "text/plain"
1341
1396
  };
1342
- constructor(pathPrefix, folderPath, cors) {
1397
+ constructor(pathPrefix, folderPath, cors = []) {
1343
1398
  this._pathPrefix = "/" + pathPrefix.replace(/^\//, "").replace(/\/$/, "");
1344
1399
  this._absoluteFolderPath = path3.resolve(folderPath);
1345
1400
  this._cors = cors;
@@ -1414,9 +1469,10 @@ var StaticServer = class {
1414
1469
  }
1415
1470
  _handleRequest(req, res) {
1416
1471
  const { url, method } = req;
1417
- if (this._cors) {
1472
+ if (this._cors.length && req.headers.origin && this._cors.includes(req.headers.origin)) {
1418
1473
  res.setHeader("Access-Control-Allow-Headers", "*");
1419
- res.setHeader("Access-Control-Allow-Origin", this._cors);
1474
+ res.setHeader("Vary", "Origin");
1475
+ res.setHeader("Access-Control-Allow-Origin", req.headers.origin);
1420
1476
  res.setHeader("Access-Control-Allow-Methods", "*");
1421
1477
  if (req.method === "OPTIONS") {
1422
1478
  res.writeHead(204);
@@ -1468,7 +1524,11 @@ async function showReport(reportFolder) {
1468
1524
  const projectPublicId = config.projectPublicId();
1469
1525
  const reportViewerEndpoint = config.reportViewerUrl();
1470
1526
  const token = randomUUIDBase62();
1471
- const server = new StaticServer(token, reportFolder, reportViewerEndpoint);
1527
+ const server = new StaticServer(token, reportFolder, [
1528
+ reportViewerEndpoint,
1529
+ // trace.playwright.dev is used to load & display Playwright Test traces.
1530
+ "https://trace.playwright.dev"
1531
+ ]);
1472
1532
  await server.start(9373, "127.0.0.1");
1473
1533
  const url = new URL(reportViewerEndpoint);
1474
1534
  url.searchParams.set("port", String(server.port()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flakiness/sdk",
3
- "version": "1.0.1",
3
+ "version": "1.1.0-alpha.0",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,7 +25,7 @@
25
25
  "author": "Degu Labs, Inc",
26
26
  "license": "MIT",
27
27
  "devDependencies": {
28
- "@flakiness/flakiness-report": "^0.22.0",
28
+ "@flakiness/flakiness-report": "^0.25.0",
29
29
  "@types/debug": "^4.1.12",
30
30
  "@types/node": "^25.0.3",
31
31
  "esbuild": "^0.27.0",
@@ -34,7 +34,7 @@
34
34
  "typescript": "^5.6.2"
35
35
  },
36
36
  "peerDependencies": {
37
- "@flakiness/flakiness-report": "^0.22.0"
37
+ "@flakiness/flakiness-report": "^0.25.0"
38
38
  },
39
39
  "dependencies": {
40
40
  "chalk": "^5.6.2",
@@ -0,0 +1,8 @@
1
+ export declare class GithubOIDC {
2
+ private _requestUrl;
3
+ private _requestToken;
4
+ static initializeFromEnv(): GithubOIDC | undefined;
5
+ constructor(_requestUrl: string, _requestToken: string);
6
+ fetchToken(audience: string): Promise<string>;
7
+ }
8
+ //# sourceMappingURL=_githubOIDC.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_githubOIDC.d.ts","sourceRoot":"","sources":["../../src/_githubOIDC.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IAQnB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,aAAa;IARvB,MAAM,CAAC,iBAAiB,IAAI,UAAU,GAAC,SAAS;gBAOtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM;IAKzB,UAAU,CAAC,QAAQ,EAAE,MAAM;CAsBlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"showReport.d.ts","sourceRoot":"","sources":["../../src/showReport.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,iBAqBpD"}
1
+ {"version":3,"file":"showReport.d.ts","sourceRoot":"","sources":["../../src/showReport.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,iBAyBpD"}
@@ -2,9 +2,9 @@ export declare class StaticServer {
2
2
  private _server;
3
3
  private _absoluteFolderPath;
4
4
  private _pathPrefix;
5
- private _cors?;
5
+ private _cors;
6
6
  private _mimeTypes;
7
- constructor(pathPrefix: string, folderPath: string, cors?: string);
7
+ constructor(pathPrefix: string, folderPath: string, cors?: string[]);
8
8
  port(): number | undefined;
9
9
  address(): string | undefined;
10
10
  private _startServer;
@@ -1 +1 @@
1
- {"version":3,"file":"staticServer.d.ts","sourceRoot":"","sources":["../../src/staticServer.ts"],"names":[],"mappings":"AAQA,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAS;IAEvB,OAAO,CAAC,UAAU,CAWhB;gBAEU,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAQjE,IAAI;IAOJ,OAAO,IAAI,MAAM,GAAC,SAAS;YASb,YAAY;IAkBpB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB;IAyB7C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;CAiEvB"}
1
+ {"version":3,"file":"staticServer.d.ts","sourceRoot":"","sources":["../../src/staticServer.ts"],"names":[],"mappings":"AAQA,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAW;IAExB,OAAO,CAAC,UAAU,CAWhB;gBAEU,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO;IAQvE,IAAI;IAOJ,OAAO,IAAI,MAAM,GAAC,SAAS;YASb,YAAY;IAkBpB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB;IAyB7C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;CAkEvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"uploadReport.d.ts","sourceRoot":"","sources":["../../src/uploadReport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAW9D;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,iEAAiE;IACjE,IAAI,EAAE,QAAQ,CAAC;IACf,4EAA4E;IAC5E,EAAE,EAAE,eAAe,CAAC,YAAY,CAAC;IACjC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,EAAE,EAAE,eAAe,CAAC,YAAY,CAAC;IACjC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,cAAc,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAOzG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAOrG;AAED,KAAK,YAAY,GACb;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,UAAU,MAAM;IACd,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,CAAC,MAAM,EAC9B,WAAW,EAAE,UAAU,EAAE,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
1
+ {"version":3,"file":"uploadReport.d.ts","sourceRoot":"","sources":["../../src/uploadReport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAY9D;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,iEAAiE;IACjE,IAAI,EAAE,QAAQ,CAAC;IACf,4EAA4E;IAC5E,EAAE,EAAE,eAAe,CAAC,YAAY,CAAC;IACjC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,EAAE,EAAE,eAAe,CAAC,YAAY,CAAC;IACjC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,cAAc,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAOzG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAOrG;AAED,KAAK,YAAY,GACb;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,UAAU,MAAM;IACd,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,CAAC,MAAM,EAC9B,WAAW,EAAE,UAAU,EAAE,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CAqDvB"}