@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 +4 -2
- package/lib/index.js +68 -8
- package/package.json +3 -3
- package/types/src/_githubOIDC.d.ts +8 -0
- package/types/src/_githubOIDC.d.ts.map +1 -0
- package/types/src/showReport.d.ts.map +1 -1
- package/types/src/staticServer.d.ts +2 -2
- package/types/src/staticServer.d.ts.map +1 -1
- package/types/src/uploadReport.d.ts.map +1 -1
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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("
|
|
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,
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
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;
|
|
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"}
|