@azure/microsoft-playwright-testing 1.0.0-alpha.20250716.1 → 1.0.0-alpha.20250721.1
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/browser/common/constants.js +100 -100
- package/dist/browser/common/constants.js.map +1 -1
- package/dist/browser/common/customerConfig.js +3 -0
- package/dist/browser/common/customerConfig.js.map +1 -1
- package/dist/browser/common/entraIdAccessToken.js +46 -43
- package/dist/browser/common/entraIdAccessToken.js.map +1 -1
- package/dist/browser/common/environmentVariables.js +8 -0
- package/dist/browser/common/environmentVariables.js.map +1 -1
- package/dist/browser/common/executor.js +1 -2
- package/dist/browser/common/executor.js.map +1 -1
- package/dist/browser/common/multimap.js +1 -0
- package/dist/browser/common/multimap.js.map +1 -1
- package/dist/browser/common/playwrightServiceConfig.js +34 -28
- package/dist/browser/common/playwrightServiceConfig.js.map +1 -1
- package/dist/browser/core/playwrightService.js +13 -8
- package/dist/browser/core/playwrightService.js.map +1 -1
- package/dist/browser/core/playwrightServiceEntra.js +36 -33
- package/dist/browser/core/playwrightServiceEntra.js.map +1 -1
- package/dist/browser/model/entraTokenDetails.js +4 -0
- package/dist/browser/model/entraTokenDetails.js.map +1 -1
- package/dist/browser/model/mptTokenDetails.js +8 -0
- package/dist/browser/model/mptTokenDetails.js.map +1 -1
- package/dist/browser/model/shard.js +10 -0
- package/dist/browser/model/shard.js.map +1 -1
- package/dist/browser/model/storageUri.js +4 -0
- package/dist/browser/model/storageUri.js.map +1 -1
- package/dist/browser/model/testResult.js +18 -0
- package/dist/browser/model/testResult.js.map +1 -1
- package/dist/browser/model/testRun.js +8 -3
- package/dist/browser/model/testRun.js.map +1 -1
- package/dist/browser/reporter/mptReporter.js +53 -47
- package/dist/browser/reporter/mptReporter.js.map +1 -1
- package/dist/browser/utils/cIInfoProvider.js +8 -9
- package/dist/browser/utils/cIInfoProvider.js.map +1 -1
- package/dist/browser/utils/packageManager.js +21 -27
- package/dist/browser/utils/packageManager.js.map +1 -1
- package/dist/browser/utils/reporterUtils.js +34 -31
- package/dist/browser/utils/reporterUtils.js.map +1 -1
- package/dist/browser/utils/serviceClient.js +7 -2
- package/dist/browser/utils/serviceClient.js.map +1 -1
- package/dist/browser/utils/utils.js +1 -1
- package/dist/browser/utils/utils.js.map +1 -1
- package/dist/commonjs/common/constants.js +101 -101
- package/dist/commonjs/common/constants.js.map +1 -1
- package/dist/commonjs/common/customerConfig.js +3 -0
- package/dist/commonjs/common/customerConfig.js.map +1 -1
- package/dist/commonjs/common/entraIdAccessToken.js +46 -43
- package/dist/commonjs/common/entraIdAccessToken.js.map +1 -1
- package/dist/commonjs/common/environmentVariables.js +8 -0
- package/dist/commonjs/common/environmentVariables.js.map +1 -1
- package/dist/commonjs/common/executor.js +1 -2
- package/dist/commonjs/common/executor.js.map +1 -1
- package/dist/commonjs/common/multimap.js +1 -0
- package/dist/commonjs/common/multimap.js.map +1 -1
- package/dist/commonjs/common/playwrightServiceConfig.js +34 -28
- package/dist/commonjs/common/playwrightServiceConfig.js.map +1 -1
- package/dist/commonjs/core/playwrightService.js +13 -8
- package/dist/commonjs/core/playwrightService.js.map +1 -1
- package/dist/commonjs/core/playwrightServiceEntra.js +36 -33
- package/dist/commonjs/core/playwrightServiceEntra.js.map +1 -1
- package/dist/commonjs/model/entraTokenDetails.js +4 -0
- package/dist/commonjs/model/entraTokenDetails.js.map +1 -1
- package/dist/commonjs/model/mptTokenDetails.js +8 -0
- package/dist/commonjs/model/mptTokenDetails.js.map +1 -1
- package/dist/commonjs/model/shard.js +10 -0
- package/dist/commonjs/model/shard.js.map +1 -1
- package/dist/commonjs/model/storageUri.js +4 -0
- package/dist/commonjs/model/storageUri.js.map +1 -1
- package/dist/commonjs/model/testResult.js +18 -0
- package/dist/commonjs/model/testResult.js.map +1 -1
- package/dist/commonjs/model/testRun.js +8 -3
- package/dist/commonjs/model/testRun.js.map +1 -1
- package/dist/commonjs/reporter/mptReporter.js +53 -47
- package/dist/commonjs/reporter/mptReporter.js.map +1 -1
- package/dist/commonjs/tsdoc-metadata.json +11 -11
- package/dist/commonjs/utils/cIInfoProvider.js +8 -9
- package/dist/commonjs/utils/cIInfoProvider.js.map +1 -1
- package/dist/commonjs/utils/packageManager.js +21 -27
- package/dist/commonjs/utils/packageManager.js.map +1 -1
- package/dist/commonjs/utils/reporterUtils.js +34 -31
- package/dist/commonjs/utils/reporterUtils.js.map +1 -1
- package/dist/commonjs/utils/serviceClient.js +7 -2
- package/dist/commonjs/utils/serviceClient.js.map +1 -1
- package/dist/commonjs/utils/utils.js +1 -1
- package/dist/commonjs/utils/utils.js.map +1 -1
- package/dist/esm/common/constants.js +100 -100
- package/dist/esm/common/constants.js.map +1 -1
- package/dist/esm/common/customerConfig.js +3 -0
- package/dist/esm/common/customerConfig.js.map +1 -1
- package/dist/esm/common/entraIdAccessToken.js +46 -43
- package/dist/esm/common/entraIdAccessToken.js.map +1 -1
- package/dist/esm/common/environmentVariables.js +8 -0
- package/dist/esm/common/environmentVariables.js.map +1 -1
- package/dist/esm/common/executor.js +1 -2
- package/dist/esm/common/executor.js.map +1 -1
- package/dist/esm/common/multimap.js +1 -0
- package/dist/esm/common/multimap.js.map +1 -1
- package/dist/esm/common/playwrightServiceConfig.js +34 -28
- package/dist/esm/common/playwrightServiceConfig.js.map +1 -1
- package/dist/esm/core/playwrightService.js +13 -8
- package/dist/esm/core/playwrightService.js.map +1 -1
- package/dist/esm/core/playwrightServiceEntra.js +36 -33
- package/dist/esm/core/playwrightServiceEntra.js.map +1 -1
- package/dist/esm/model/entraTokenDetails.js +4 -0
- package/dist/esm/model/entraTokenDetails.js.map +1 -1
- package/dist/esm/model/mptTokenDetails.js +8 -0
- package/dist/esm/model/mptTokenDetails.js.map +1 -1
- package/dist/esm/model/shard.js +10 -0
- package/dist/esm/model/shard.js.map +1 -1
- package/dist/esm/model/storageUri.js +4 -0
- package/dist/esm/model/storageUri.js.map +1 -1
- package/dist/esm/model/testResult.js +18 -0
- package/dist/esm/model/testResult.js.map +1 -1
- package/dist/esm/model/testRun.js +8 -3
- package/dist/esm/model/testRun.js.map +1 -1
- package/dist/esm/reporter/mptReporter.js +53 -47
- package/dist/esm/reporter/mptReporter.js.map +1 -1
- package/dist/esm/utils/cIInfoProvider.js +8 -9
- package/dist/esm/utils/cIInfoProvider.js.map +1 -1
- package/dist/esm/utils/packageManager.js +21 -27
- package/dist/esm/utils/packageManager.js.map +1 -1
- package/dist/esm/utils/reporterUtils.js +34 -31
- package/dist/esm/utils/reporterUtils.js.map +1 -1
- package/dist/esm/utils/serviceClient.js +7 -2
- package/dist/esm/utils/serviceClient.js.map +1 -1
- package/dist/esm/utils/utils.js +1 -1
- package/dist/esm/utils/utils.js.map +1 -1
- package/dist/react-native/common/constants.js +100 -100
- package/dist/react-native/common/constants.js.map +1 -1
- package/dist/react-native/common/customerConfig.js +3 -0
- package/dist/react-native/common/customerConfig.js.map +1 -1
- package/dist/react-native/common/entraIdAccessToken.js +46 -43
- package/dist/react-native/common/entraIdAccessToken.js.map +1 -1
- package/dist/react-native/common/environmentVariables.js +8 -0
- package/dist/react-native/common/environmentVariables.js.map +1 -1
- package/dist/react-native/common/executor.js +1 -2
- package/dist/react-native/common/executor.js.map +1 -1
- package/dist/react-native/common/multimap.js +1 -0
- package/dist/react-native/common/multimap.js.map +1 -1
- package/dist/react-native/common/playwrightServiceConfig.js +34 -28
- package/dist/react-native/common/playwrightServiceConfig.js.map +1 -1
- package/dist/react-native/core/playwrightService.js +13 -8
- package/dist/react-native/core/playwrightService.js.map +1 -1
- package/dist/react-native/core/playwrightServiceEntra.js +36 -33
- package/dist/react-native/core/playwrightServiceEntra.js.map +1 -1
- package/dist/react-native/model/entraTokenDetails.js +4 -0
- package/dist/react-native/model/entraTokenDetails.js.map +1 -1
- package/dist/react-native/model/mptTokenDetails.js +8 -0
- package/dist/react-native/model/mptTokenDetails.js.map +1 -1
- package/dist/react-native/model/shard.js +10 -0
- package/dist/react-native/model/shard.js.map +1 -1
- package/dist/react-native/model/storageUri.js +4 -0
- package/dist/react-native/model/storageUri.js.map +1 -1
- package/dist/react-native/model/testResult.js +18 -0
- package/dist/react-native/model/testResult.js.map +1 -1
- package/dist/react-native/model/testRun.js +8 -3
- package/dist/react-native/model/testRun.js.map +1 -1
- package/dist/react-native/reporter/mptReporter.js +53 -47
- package/dist/react-native/reporter/mptReporter.js.map +1 -1
- package/dist/react-native/utils/cIInfoProvider.js +8 -9
- package/dist/react-native/utils/cIInfoProvider.js.map +1 -1
- package/dist/react-native/utils/packageManager.js +21 -27
- package/dist/react-native/utils/packageManager.js.map +1 -1
- package/dist/react-native/utils/reporterUtils.js +34 -31
- package/dist/react-native/utils/reporterUtils.js.map +1 -1
- package/dist/react-native/utils/serviceClient.js +7 -2
- package/dist/react-native/utils/serviceClient.js.map +1 -1
- package/dist/react-native/utils/utils.js +1 -1
- package/dist/react-native/utils/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -32,53 +32,37 @@ const utils_js_1 = require("../utils/utils.js");
|
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
34
|
class MPTReporter {
|
|
35
|
+
isTokenValid = true;
|
|
36
|
+
enableGitHubSummary = true;
|
|
37
|
+
isRegionValid = true;
|
|
38
|
+
shard;
|
|
39
|
+
isTestRunStartSuccess = false;
|
|
40
|
+
ciInfo = cIInfoProvider_js_1.CIInfoProvider.getCIInfo();
|
|
41
|
+
serviceClient;
|
|
42
|
+
storageClient;
|
|
43
|
+
reporterUtils;
|
|
44
|
+
envVariables;
|
|
45
|
+
testRawResults = new multimap_js_1.MultiMap();
|
|
46
|
+
promiseOnBegin;
|
|
47
|
+
_testEndPromises = [];
|
|
48
|
+
testResultBatch = new Set();
|
|
49
|
+
errorMessages = [];
|
|
50
|
+
informationalMessages = [];
|
|
51
|
+
processedErrorMessageKeys = [];
|
|
52
|
+
sasUri;
|
|
53
|
+
uploadMetadata = {
|
|
54
|
+
numTestResults: 0,
|
|
55
|
+
numTotalAttachments: 0,
|
|
56
|
+
sizeTotalAttachments: 0,
|
|
57
|
+
};
|
|
58
|
+
numWorkers = -1;
|
|
59
|
+
testRunUrl = "";
|
|
60
|
+
enableResultPublish = true;
|
|
35
61
|
constructor(config) {
|
|
36
|
-
|
|
37
|
-
this.enableGitHubSummary = true;
|
|
38
|
-
this.isRegionValid = true;
|
|
39
|
-
this.isTestRunStartSuccess = false;
|
|
40
|
-
this.ciInfo = cIInfoProvider_js_1.CIInfoProvider.getCIInfo();
|
|
41
|
-
this.testRawResults = new multimap_js_1.MultiMap();
|
|
42
|
-
this._testEndPromises = [];
|
|
43
|
-
this.testResultBatch = new Set();
|
|
44
|
-
this.errorMessages = [];
|
|
45
|
-
this.informationalMessages = [];
|
|
46
|
-
this.processedErrorMessageKeys = [];
|
|
47
|
-
this.uploadMetadata = {
|
|
48
|
-
numTestResults: 0,
|
|
49
|
-
numTotalAttachments: 0,
|
|
50
|
-
sizeTotalAttachments: 0,
|
|
51
|
-
};
|
|
52
|
-
this.numWorkers = -1;
|
|
53
|
-
this.testRunUrl = "";
|
|
54
|
-
this.enableResultPublish = true;
|
|
55
|
-
this._addInformationalMessage = (message) => {
|
|
56
|
-
this.informationalMessages.push(message);
|
|
57
|
-
};
|
|
58
|
-
this._addKeyToInformationMessage = (key) => {
|
|
59
|
-
this.processedErrorMessageKeys.push(key);
|
|
60
|
-
};
|
|
61
|
-
this._isInformationMessagePresent = (key) => {
|
|
62
|
-
return this.processedErrorMessageKeys.includes(key);
|
|
63
|
-
};
|
|
64
|
-
this._reporterFailureHandler = (error) => {
|
|
65
|
-
if (!this._isInformationMessagePresent(error.key)) {
|
|
66
|
-
this._addKeyToInformationMessage(error.key);
|
|
67
|
-
this._addInformationalMessage(error.message);
|
|
68
|
-
}
|
|
69
|
-
this.isTokenValid = false;
|
|
70
|
-
};
|
|
71
|
-
this.renewSasUriIfNeeded = async () => {
|
|
72
|
-
if (this.sasUri === undefined ||
|
|
73
|
-
!reporterUtils_js_1.default.isTimeGreaterThanCurrentPlus10Minutes(this.sasUri)) {
|
|
74
|
-
this.sasUri = await this.serviceClient.createStorageUri();
|
|
75
|
-
logger_js_1.reporterLogger.info(`\nFetched SAS URI with validity: ${this.sasUri.expiresAt} and access: ${this.sasUri.accessLevel}.`);
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
if ((config === null || config === void 0 ? void 0 : config.enableGitHubSummary) !== undefined) {
|
|
62
|
+
if (config?.enableGitHubSummary !== undefined) {
|
|
79
63
|
this.enableGitHubSummary = config.enableGitHubSummary;
|
|
80
64
|
}
|
|
81
|
-
if (
|
|
65
|
+
if (config?.enableResultPublish !== undefined) {
|
|
82
66
|
this.enableResultPublish = config.enableResultPublish;
|
|
83
67
|
}
|
|
84
68
|
}
|
|
@@ -87,6 +71,22 @@ class MPTReporter {
|
|
|
87
71
|
this.errorMessages.push(this.reporterUtils.redactAccessToken(errorMessage));
|
|
88
72
|
}
|
|
89
73
|
}
|
|
74
|
+
_addInformationalMessage = (message) => {
|
|
75
|
+
this.informationalMessages.push(message);
|
|
76
|
+
};
|
|
77
|
+
_addKeyToInformationMessage = (key) => {
|
|
78
|
+
this.processedErrorMessageKeys.push(key);
|
|
79
|
+
};
|
|
80
|
+
_isInformationMessagePresent = (key) => {
|
|
81
|
+
return this.processedErrorMessageKeys.includes(key);
|
|
82
|
+
};
|
|
83
|
+
_reporterFailureHandler = (error) => {
|
|
84
|
+
if (!this._isInformationMessagePresent(error.key)) {
|
|
85
|
+
this._addKeyToInformationMessage(error.key);
|
|
86
|
+
this._addInformationalMessage(error.message);
|
|
87
|
+
}
|
|
88
|
+
this.isTokenValid = false;
|
|
89
|
+
};
|
|
90
90
|
/**
|
|
91
91
|
* @public
|
|
92
92
|
*
|
|
@@ -192,7 +192,7 @@ class MPTReporter {
|
|
|
192
192
|
process.stdout.write(`\n`);
|
|
193
193
|
try {
|
|
194
194
|
const testRunResponse = await this.serviceClient.patchTestRun(this.ciInfo);
|
|
195
|
-
logger_js_1.reporterLogger.info(`\nTest run report successfully initialized: ${testRunResponse
|
|
195
|
+
logger_js_1.reporterLogger.info(`\nTest run report successfully initialized: ${testRunResponse?.displayName}.`);
|
|
196
196
|
process.stdout.write(`Initializing reporting for this test run. You can view the results at: https://playwright.microsoft.com/workspaces/${encodeURIComponent(this.envVariables.accountId)}/runs/${encodeURIComponent(this.envVariables.runId)}\n`);
|
|
197
197
|
const shardResponse = await this.serviceClient.postTestRunShardStart();
|
|
198
198
|
this.shard = shardResponse;
|
|
@@ -264,8 +264,14 @@ class MPTReporter {
|
|
|
264
264
|
logger_js_1.reporterLogger.error(`\nError in uploading test run information: ${err.message}`);
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
|
+
renewSasUriIfNeeded = async () => {
|
|
268
|
+
if (this.sasUri === undefined ||
|
|
269
|
+
!reporterUtils_js_1.default.isTimeGreaterThanCurrentPlus10Minutes(this.sasUri)) {
|
|
270
|
+
this.sasUri = await this.serviceClient.createStorageUri();
|
|
271
|
+
logger_js_1.reporterLogger.info(`\nFetched SAS URI with validity: ${this.sasUri.expiresAt} and access: ${this.sasUri.accessLevel}.`);
|
|
272
|
+
}
|
|
273
|
+
};
|
|
267
274
|
async _uploadTestResultAttachments(testExecutionId, testAttachments, otherAttachments) {
|
|
268
|
-
var _a;
|
|
269
275
|
try {
|
|
270
276
|
this.isTestRunStartSuccess = await this.promiseOnBegin;
|
|
271
277
|
if (!this.isTestRunStartSuccess) {
|
|
@@ -279,7 +285,7 @@ class MPTReporter {
|
|
|
279
285
|
}
|
|
280
286
|
for (const otherAttachment of otherAttachments) {
|
|
281
287
|
await this.renewSasUriIfNeeded();
|
|
282
|
-
const match =
|
|
288
|
+
const match = otherAttachment?.contentType?.match(/charset=(.*)/);
|
|
283
289
|
const charset = match && match.length > 1 ? match[1] : "utf-8";
|
|
284
290
|
await this.storageClient.uploadBuffer(this.sasUri.uri, otherAttachment.body.toString(charset || "utf-8"), `${testExecutionId}/${otherAttachment.name}`);
|
|
285
291
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mptReporter.js","sourceRoot":"","sources":["../../../src/reporter/mptReporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n FullResult,\n TestCase,\n TestResult,\n FullConfig,\n Reporter,\n Suite,\n} from \"@playwright/test/reporter\";\nimport { reporterLogger } from \"../common/logger.js\";\nimport {\n Constants,\n InternalEnvironmentVariables,\n TestResultErrorConstants,\n} from \"../common/constants.js\";\nimport { EnvironmentVariables } from \"../common/environmentVariables.js\";\nimport { MultiMap } from \"../common/multimap.js\";\nimport type { EntraTokenDetails } from \"../model/entraTokenDetails.js\";\nimport type { MPTTokenDetails } from \"../model/mptTokenDetails.js\";\nimport { TokenType } from \"../model/mptTokenDetails.js\";\nimport type { Shard, UploadMetadata } from \"../model/shard.js\";\nimport type { StorageUri } from \"../model/storageUri.js\";\nimport type { TestResult as MPTTestResult, RawTestResult } from \"../model/testResult.js\";\nimport type { TestRun } from \"../model/testRun.js\";\nimport type { CIInfo } from \"../utils/cIInfoProvider.js\";\nimport { CIInfoProvider } from \"../utils/cIInfoProvider.js\";\nimport ReporterUtils from \"../utils/reporterUtils.js\";\nimport { ServiceClient } from \"../utils/serviceClient.js\";\nimport { StorageClient } from \"../utils/storageClient.js\";\nimport type { ReporterConfiguration } from \"../common/types.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { validateMptPAT, populateValuesFromServiceUrl } from \"../utils/utils.js\";\n\n/**\n * @public\n *\n * Extends Playwright's Reporter class to enable Microsoft Playwright Testing's Reporting\n * feature to publish test results and related artifacts and\n * view them in the service portal for faster and easier troubleshooting.\n *\n * @example\n *\n * ```\n * import { defineConfig } from \"@playwright/test\";\n *\n * export default defineConfig({\n * reporter: [[\"@azure/microsoft-playwright-testing/reporter\"]]\n * });\n * ```\n */\nclass MPTReporter implements Reporter {\n private isTokenValid: boolean = true;\n private enableGitHubSummary = true;\n private isRegionValid: boolean = true;\n private shard!: Shard;\n private isTestRunStartSuccess: boolean = false;\n private ciInfo: CIInfo = CIInfoProvider.getCIInfo();\n private serviceClient!: ServiceClient;\n private storageClient!: StorageClient;\n private reporterUtils!: ReporterUtils;\n private envVariables!: EnvironmentVariables;\n private testRawResults = new MultiMap<string, string>();\n private promiseOnBegin!: Promise<boolean>;\n private _testEndPromises: Promise<void>[] = [];\n private testResultBatch: Set<MPTTestResult> = new Set<MPTTestResult>();\n private errorMessages: string[] = [];\n private informationalMessages: string[] = [];\n private processedErrorMessageKeys: string[] = [];\n private sasUri!: StorageUri;\n private uploadMetadata: UploadMetadata = {\n numTestResults: 0,\n numTotalAttachments: 0,\n sizeTotalAttachments: 0,\n };\n private numWorkers: number = -1;\n private testRunUrl: string = \"\";\n private enableResultPublish: boolean = true;\n\n constructor(config: Partial<ReporterConfiguration>) {\n if (config?.enableGitHubSummary !== undefined) {\n this.enableGitHubSummary = config.enableGitHubSummary;\n }\n if (config?.enableResultPublish !== undefined) {\n this.enableResultPublish = config.enableResultPublish;\n }\n }\n private _addError(errorMessage: string): void {\n if (this.errorMessages.length < Constants.ERROR_MESSAGES_MAX_LENGTH) {\n this.errorMessages.push(this.reporterUtils.redactAccessToken(errorMessage));\n }\n }\n\n private _addInformationalMessage = (message: string): void => {\n this.informationalMessages.push(message);\n };\n\n private _addKeyToInformationMessage = (key: string): void => {\n this.processedErrorMessageKeys.push(key);\n };\n\n private _isInformationMessagePresent = (key: string): boolean => {\n return this.processedErrorMessageKeys.includes(key);\n };\n private _reporterFailureHandler = (error: { key: string; message: string }): void => {\n if (!this._isInformationMessagePresent(error.key)) {\n this._addKeyToInformationMessage(error.key);\n this._addInformationalMessage(error.message);\n }\n this.isTokenValid = false;\n };\n /**\n * @public\n *\n * Called once before running tests.\n *\n * @param config - Resolved configuration.\n * @param suite - The root suite that contains all projects, files and test cases.\n */\n onBegin(config: FullConfig, suite: Suite): void {\n if (!this.enableResultPublish) return;\n this.initializeMPTReporter();\n this.reporterUtils = new ReporterUtils(this.envVariables, config, suite);\n if (this.isTokenValid && this.isRegionValid) {\n this.serviceClient = new ServiceClient(\n this.envVariables,\n this.reporterUtils,\n this._addInformationalMessage,\n this._isInformationMessagePresent,\n this._addKeyToInformationMessage,\n );\n this.promiseOnBegin = this._onBegin();\n }\n }\n\n /**\n * @public\n *\n * Called after a test has been finished in the worker process.\n *\n * @param test - Test that has been finished.\n * @param result - Result of the test run.\n */\n onTestEnd(test: TestCase, result: TestResult): void {\n this.numWorkers = Math.max(this.numWorkers, result.parallelIndex + 1);\n this.processTestResult(result);\n if (!this.enableResultPublish) return;\n // Process test result\n this._onTestEnd(test, result);\n // Upload the test results batch\n try {\n if (this.testResultBatch.size >= Constants.TEST_BATCH_SIZE) {\n const currResultBatch: MPTTestResult[] = [...this.testResultBatch];\n if (this.isTestRunStartSuccess) {\n this._testEndPromises.push(this.serviceClient.postTestResults(currResultBatch));\n reporterLogger.info(`\\nAdded test results batch for upload.`);\n this.testResultBatch.clear();\n }\n }\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in uploading test results: ${err.message}.`);\n }\n }\n\n /**\n * @public\n *\n * Called after all tests have been run, or testing has been interrupted. Note that this method may return a [Promise]\n * and Playwright Test will await it. Reporter is allowed to override the status and hence affect the exit code of the\n * test runner.\n *\n * @param result - Result of the full test run, `status` can be one of:\n * - `'passed'` - Everything went as expected.\n * - `'failed'` - Any test has failed.\n * - `'timedout'` - The\n * {@link https://playwright.dev/docs/api/class-testconfig#test-config-global-timeout | testConfig.globalTimeout} has\n * been reached.\n * - `'interrupted'` - Interrupted by the user.\n */\n async onEnd(result: FullResult): Promise<void> {\n if (this.enableResultPublish) {\n await this._onEnd(result);\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n } else {\n let count: number = 0;\n process.stdout.write(\"\\nUploading test results.\");\n await Promise.allSettled(this._testEndPromises).then((values) => {\n values.forEach((value) => {\n if (value.status === \"fulfilled\") {\n count++;\n this.reporterUtils.progressBar(count, this._testEndPromises.length);\n }\n return value.status;\n });\n reporterLogger.info(`\\nTest result processing completed.`);\n return values;\n });\n try {\n await this.serviceClient.postTestRunShardEnd(\n result,\n this.shard,\n this.errorMessages,\n this.uploadMetadata,\n this.numWorkers,\n );\n reporterLogger.info(`\\nTest run successfully uploaded.`);\n\n if (this.enableGitHubSummary) {\n this.reporterUtils.generateMarkdownSummary(this.testRunUrl);\n }\n\n process.stdout.write(`\\nTest report: ${this.testRunUrl}\\n`);\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in completing test run: ${err.message}`);\n process.stdout.write(`\\nUnable to complete test results upload.`);\n }\n }\n }\n this.displayAdditionalInformation();\n }\n\n private async _onBegin(): Promise<boolean> {\n process.stdout.write(`\\n`);\n try {\n const testRunResponse: TestRun | undefined = await this.serviceClient.patchTestRun(\n this.ciInfo,\n );\n reporterLogger.info(\n `\\nTest run report successfully initialized: ${testRunResponse?.displayName}.`,\n );\n process.stdout.write(\n `Initializing reporting for this test run. You can view the results at: https://playwright.microsoft.com/workspaces/${encodeURIComponent(this.envVariables.accountId!)}/runs/${encodeURIComponent(this.envVariables.runId!)}\\n`,\n );\n const shardResponse = await this.serviceClient.postTestRunShardStart();\n this.shard = shardResponse;\n // Set test report link as environment variable. If/else to check if environment variable defined or not.\n if (\n Constants.DEFAULT_SERVICE_ENDPOINT &&\n this.envVariables.accountId &&\n this.envVariables.runId\n ) {\n this.testRunUrl = `${Constants.DEFAULT_DASHBOARD_ENDPOINT}/workspaces/${encodeURIComponent(\n this.envVariables.accountId,\n )}/runs/${encodeURIComponent(this.envVariables.runId)}`;\n }\n return true;\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in initializing test run report: ${err.message}.`);\n return false;\n }\n }\n\n private async _onTestEnd(test: TestCase, result: TestResult): Promise<undefined> {\n try {\n this.isTestRunStartSuccess = await this.promiseOnBegin;\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n return;\n }\n this.uploadMetadata.numTestResults++;\n const testResultObject: MPTTestResult = this.reporterUtils.getTestResultObject(\n test,\n result,\n this.ciInfo.jobName!,\n );\n this.testResultBatch.add(testResultObject);\n // Store test attachments in array\n const testAttachments: string[] = [];\n const otherAttachments: any[] = [];\n for (const attachment of result.attachments) {\n if (attachment.path !== undefined && attachment.path !== \"\") {\n testAttachments.push(attachment.path);\n this.uploadMetadata.numTotalAttachments++;\n this.uploadMetadata.sizeTotalAttachments += ReporterUtils.getFileSize(attachment.path);\n } else if (attachment.body instanceof Buffer) {\n otherAttachments.push(attachment);\n this.uploadMetadata.numTotalAttachments++;\n this.uploadMetadata.sizeTotalAttachments += ReporterUtils.getBufferSize(attachment.body);\n }\n }\n\n // Get raw result object and store it in map\n const rawTestResult: RawTestResult = this.reporterUtils.getRawTestResultObject(result);\n this.testRawResults.set(testResultObject.testExecutionId, JSON.stringify(rawTestResult));\n this._testEndPromises.push(\n this._uploadTestResultAttachments(\n testResultObject.testExecutionId,\n testAttachments,\n otherAttachments,\n ),\n );\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in processing test result: ${err.message}.`);\n }\n }\n\n private async _onEnd(_: FullResult): Promise<void> {\n this.isTestRunStartSuccess = await this.promiseOnBegin;\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n return;\n }\n try {\n // Upload the remaining test results\n if (this.testResultBatch.size > 0) {\n await this.serviceClient.postTestResults([...this.testResultBatch]);\n reporterLogger.info(`\\nUploaded test results batch successfully.`);\n this.testResultBatch.clear();\n }\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in uploading test run information: ${err.message}`);\n }\n }\n private renewSasUriIfNeeded = async (): Promise<void> => {\n if (\n this.sasUri === undefined ||\n !ReporterUtils.isTimeGreaterThanCurrentPlus10Minutes(this.sasUri)\n ) {\n this.sasUri = await this.serviceClient.createStorageUri();\n reporterLogger.info(\n `\\nFetched SAS URI with validity: ${this.sasUri.expiresAt} and access: ${this.sasUri.accessLevel}.`,\n );\n }\n };\n private async _uploadTestResultAttachments(\n testExecutionId: string,\n testAttachments: string[],\n otherAttachments: any[],\n ): Promise<void> {\n try {\n this.isTestRunStartSuccess = await this.promiseOnBegin;\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n return;\n }\n\n for (const attachmentPath of testAttachments) {\n const fileRelativePath = `${testExecutionId}/${ReporterUtils.getFileRelativePath(attachmentPath)}`;\n await this.renewSasUriIfNeeded();\n await this.storageClient.uploadFile(this.sasUri.uri, attachmentPath, fileRelativePath);\n }\n\n for (const otherAttachment of otherAttachments) {\n await this.renewSasUriIfNeeded();\n const match = otherAttachment?.contentType?.match(/charset=(.*)/);\n const charset = match && match.length > 1 ? match[1] : \"utf-8\";\n await this.storageClient.uploadBuffer(\n this.sasUri.uri,\n otherAttachment.body.toString((charset as any) || \"utf-8\"),\n `${testExecutionId}/${otherAttachment.name}`,\n );\n }\n\n const rawTestResult = this.testRawResults.get(testExecutionId);\n await this.renewSasUriIfNeeded();\n await this.storageClient.uploadBuffer(\n this.sasUri.uri,\n rawTestResult[0]!,\n `${testExecutionId}/rawTestResult.json`,\n );\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in uploading test result attachments: ${err.message}`);\n }\n }\n\n private initializeMPTReporter(): void {\n this.envVariables = new EnvironmentVariables();\n if (process.env[InternalEnvironmentVariables.MPT_SETUP_FATAL_ERROR] === \"true\") {\n this.isTokenValid = false;\n return;\n }\n if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL]) {\n process.stdout.write(\"\\nReporting service url not found.\");\n this.isTokenValid = false;\n return;\n }\n reporterLogger.info(\n `Reporting url - ${process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL]}`,\n );\n if (this.envVariables.accessToken === undefined || this.envVariables.accessToken === \"\") {\n process.stdout.write(`\\n${ServiceErrorMessageConstants.NO_AUTH_ERROR.message}`);\n this.isTokenValid = false;\n } else if (ReporterUtils.hasAudienceClaim(this.envVariables.accessToken)) {\n const result = populateValuesFromServiceUrl();\n this.envVariables.region = result!.region;\n this.envVariables.accountId = result!.accountId;\n const entraTokenDetails: EntraTokenDetails = ReporterUtils.getTokenDetails<EntraTokenDetails>(\n this.envVariables.accessToken,\n TokenType.ENTRA,\n );\n this.envVariables.userId = entraTokenDetails.oid;\n this.envVariables.userName = entraTokenDetails.name;\n } else {\n const mptTokenDetails: MPTTokenDetails = ReporterUtils.getTokenDetails<MPTTokenDetails>(\n this.envVariables.accessToken,\n TokenType.MPT,\n );\n validateMptPAT(this._reporterFailureHandler);\n this.envVariables.accountId = mptTokenDetails.aid;\n this.envVariables.userId = mptTokenDetails.oid;\n this.envVariables.userName = mptTokenDetails.userName;\n this.envVariables.region = ReporterUtils.getRegionFromAccountID(this.envVariables.accountId!);\n }\n this.storageClient = new StorageClient();\n if (\n this.envVariables.region &&\n !Constants.SupportedRegions.includes(this.envVariables.region!) &&\n this.isTokenValid\n ) {\n process.stdout.write(\n `\\nUnsupported region's workspace used to generate the input Access Token; the supported regions are ${Constants.SupportedRegions.join(\n \", \",\n )}`,\n );\n this.isRegionValid = false;\n }\n if (this.envVariables.runId === undefined || this.envVariables.runId === \"\") {\n this.envVariables.runId = ReporterUtils.getRunId(this.ciInfo);\n }\n }\n\n private displayAdditionalInformation(): void {\n if (this.informationalMessages.length > 0) console.info(); // Add a new line before displaying the messages\n this.informationalMessages.forEach((message, index) => {\n console.info(`${index + 1}. ${message}`);\n });\n }\n\n private processTestResult(result: TestResult): void {\n if (\n process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED] &&\n result.status !== \"passed\"\n ) {\n result.errors.forEach((error) => {\n TestResultErrorConstants.forEach((testResultErrorParseObj) => {\n if (this.processedErrorMessageKeys.includes(testResultErrorParseObj.key)) {\n return;\n }\n const errorMessage = error.message;\n if (!errorMessage) return;\n const match = errorMessage.match(testResultErrorParseObj.pattern);\n if (match) {\n this.processedErrorMessageKeys.push(testResultErrorParseObj.key);\n this._addInformationalMessage(testResultErrorParseObj.message);\n }\n });\n });\n }\n }\n\n /**\n * @public\n *\n * Whether this reporter uses stdio for reporting. When it does not, Playwright Test could add some output to enhance\n * user experience. If your reporter does not print to the terminal, it is strongly recommended to return `false`.\n */\n printsToStdio(): boolean {\n return true;\n }\n}\nexport default MPTReporter;\n"]}
|
|
1
|
+
{"version":3,"file":"mptReporter.js","sourceRoot":"","sources":["../../../src/reporter/mptReporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n FullResult,\n TestCase,\n TestResult,\n FullConfig,\n Reporter,\n Suite,\n} from \"@playwright/test/reporter\";\nimport { reporterLogger } from \"../common/logger.js\";\nimport {\n Constants,\n InternalEnvironmentVariables,\n TestResultErrorConstants,\n} from \"../common/constants.js\";\nimport { EnvironmentVariables } from \"../common/environmentVariables.js\";\nimport { MultiMap } from \"../common/multimap.js\";\nimport type { EntraTokenDetails } from \"../model/entraTokenDetails.js\";\nimport type { MPTTokenDetails } from \"../model/mptTokenDetails.js\";\nimport { TokenType } from \"../model/mptTokenDetails.js\";\nimport type { Shard, UploadMetadata } from \"../model/shard.js\";\nimport type { StorageUri } from \"../model/storageUri.js\";\nimport type { TestResult as MPTTestResult, RawTestResult } from \"../model/testResult.js\";\nimport type { TestRun } from \"../model/testRun.js\";\nimport type { CIInfo } from \"../utils/cIInfoProvider.js\";\nimport { CIInfoProvider } from \"../utils/cIInfoProvider.js\";\nimport ReporterUtils from \"../utils/reporterUtils.js\";\nimport { ServiceClient } from \"../utils/serviceClient.js\";\nimport { StorageClient } from \"../utils/storageClient.js\";\nimport type { ReporterConfiguration } from \"../common/types.js\";\nimport { ServiceErrorMessageConstants } from \"../common/messages.js\";\nimport { validateMptPAT, populateValuesFromServiceUrl } from \"../utils/utils.js\";\n\n/**\n * @public\n *\n * Extends Playwright's Reporter class to enable Microsoft Playwright Testing's Reporting\n * feature to publish test results and related artifacts and\n * view them in the service portal for faster and easier troubleshooting.\n *\n * @example\n *\n * ```\n * import { defineConfig } from \"@playwright/test\";\n *\n * export default defineConfig({\n * reporter: [[\"@azure/microsoft-playwright-testing/reporter\"]]\n * });\n * ```\n */\nclass MPTReporter implements Reporter {\n private isTokenValid: boolean = true;\n private enableGitHubSummary = true;\n private isRegionValid: boolean = true;\n private shard!: Shard;\n private isTestRunStartSuccess: boolean = false;\n private ciInfo: CIInfo = CIInfoProvider.getCIInfo();\n private serviceClient!: ServiceClient;\n private storageClient!: StorageClient;\n private reporterUtils!: ReporterUtils;\n private envVariables!: EnvironmentVariables;\n private testRawResults = new MultiMap<string, string>();\n private promiseOnBegin!: Promise<boolean>;\n private _testEndPromises: Promise<void>[] = [];\n private testResultBatch: Set<MPTTestResult> = new Set<MPTTestResult>();\n private errorMessages: string[] = [];\n private informationalMessages: string[] = [];\n private processedErrorMessageKeys: string[] = [];\n private sasUri!: StorageUri;\n private uploadMetadata: UploadMetadata = {\n numTestResults: 0,\n numTotalAttachments: 0,\n sizeTotalAttachments: 0,\n };\n private numWorkers: number = -1;\n private testRunUrl: string = \"\";\n private enableResultPublish: boolean = true;\n\n constructor(config: Partial<ReporterConfiguration>) {\n if (config?.enableGitHubSummary !== undefined) {\n this.enableGitHubSummary = config.enableGitHubSummary;\n }\n if (config?.enableResultPublish !== undefined) {\n this.enableResultPublish = config.enableResultPublish;\n }\n }\n private _addError(errorMessage: string): void {\n if (this.errorMessages.length < Constants.ERROR_MESSAGES_MAX_LENGTH) {\n this.errorMessages.push(this.reporterUtils.redactAccessToken(errorMessage));\n }\n }\n\n private _addInformationalMessage = (message: string): void => {\n this.informationalMessages.push(message);\n };\n\n private _addKeyToInformationMessage = (key: string): void => {\n this.processedErrorMessageKeys.push(key);\n };\n\n private _isInformationMessagePresent = (key: string): boolean => {\n return this.processedErrorMessageKeys.includes(key);\n };\n private _reporterFailureHandler = (error: { key: string; message: string }): void => {\n if (!this._isInformationMessagePresent(error.key)) {\n this._addKeyToInformationMessage(error.key);\n this._addInformationalMessage(error.message);\n }\n this.isTokenValid = false;\n };\n /**\n * @public\n *\n * Called once before running tests.\n *\n * @param config - Resolved configuration.\n * @param suite - The root suite that contains all projects, files and test cases.\n */\n onBegin(config: FullConfig, suite: Suite): void {\n if (!this.enableResultPublish) return;\n this.initializeMPTReporter();\n this.reporterUtils = new ReporterUtils(this.envVariables, config, suite);\n if (this.isTokenValid && this.isRegionValid) {\n this.serviceClient = new ServiceClient(\n this.envVariables,\n this.reporterUtils,\n this._addInformationalMessage,\n this._isInformationMessagePresent,\n this._addKeyToInformationMessage,\n );\n this.promiseOnBegin = this._onBegin();\n }\n }\n\n /**\n * @public\n *\n * Called after a test has been finished in the worker process.\n *\n * @param test - Test that has been finished.\n * @param result - Result of the test run.\n */\n onTestEnd(test: TestCase, result: TestResult): void {\n this.numWorkers = Math.max(this.numWorkers, result.parallelIndex + 1);\n this.processTestResult(result);\n if (!this.enableResultPublish) return;\n // Process test result\n this._onTestEnd(test, result);\n // Upload the test results batch\n try {\n if (this.testResultBatch.size >= Constants.TEST_BATCH_SIZE) {\n const currResultBatch: MPTTestResult[] = [...this.testResultBatch];\n if (this.isTestRunStartSuccess) {\n this._testEndPromises.push(this.serviceClient.postTestResults(currResultBatch));\n reporterLogger.info(`\\nAdded test results batch for upload.`);\n this.testResultBatch.clear();\n }\n }\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in uploading test results: ${err.message}.`);\n }\n }\n\n /**\n * @public\n *\n * Called after all tests have been run, or testing has been interrupted. Note that this method may return a [Promise]\n * and Playwright Test will await it. Reporter is allowed to override the status and hence affect the exit code of the\n * test runner.\n *\n * @param result - Result of the full test run, `status` can be one of:\n * - `'passed'` - Everything went as expected.\n * - `'failed'` - Any test has failed.\n * - `'timedout'` - The\n * {@link https://playwright.dev/docs/api/class-testconfig#test-config-global-timeout | testConfig.globalTimeout} has\n * been reached.\n * - `'interrupted'` - Interrupted by the user.\n */\n async onEnd(result: FullResult): Promise<void> {\n if (this.enableResultPublish) {\n await this._onEnd(result);\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n } else {\n let count: number = 0;\n process.stdout.write(\"\\nUploading test results.\");\n await Promise.allSettled(this._testEndPromises).then((values) => {\n values.forEach((value) => {\n if (value.status === \"fulfilled\") {\n count++;\n this.reporterUtils.progressBar(count, this._testEndPromises.length);\n }\n return value.status;\n });\n reporterLogger.info(`\\nTest result processing completed.`);\n return values;\n });\n try {\n await this.serviceClient.postTestRunShardEnd(\n result,\n this.shard,\n this.errorMessages,\n this.uploadMetadata,\n this.numWorkers,\n );\n reporterLogger.info(`\\nTest run successfully uploaded.`);\n\n if (this.enableGitHubSummary) {\n this.reporterUtils.generateMarkdownSummary(this.testRunUrl);\n }\n\n process.stdout.write(`\\nTest report: ${this.testRunUrl}\\n`);\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in completing test run: ${err.message}`);\n process.stdout.write(`\\nUnable to complete test results upload.`);\n }\n }\n }\n this.displayAdditionalInformation();\n }\n\n private async _onBegin(): Promise<boolean> {\n process.stdout.write(`\\n`);\n try {\n const testRunResponse: TestRun | undefined = await this.serviceClient.patchTestRun(\n this.ciInfo,\n );\n reporterLogger.info(\n `\\nTest run report successfully initialized: ${testRunResponse?.displayName}.`,\n );\n process.stdout.write(\n `Initializing reporting for this test run. You can view the results at: https://playwright.microsoft.com/workspaces/${encodeURIComponent(this.envVariables.accountId!)}/runs/${encodeURIComponent(this.envVariables.runId!)}\\n`,\n );\n const shardResponse = await this.serviceClient.postTestRunShardStart();\n this.shard = shardResponse;\n // Set test report link as environment variable. If/else to check if environment variable defined or not.\n if (\n Constants.DEFAULT_SERVICE_ENDPOINT &&\n this.envVariables.accountId &&\n this.envVariables.runId\n ) {\n this.testRunUrl = `${Constants.DEFAULT_DASHBOARD_ENDPOINT}/workspaces/${encodeURIComponent(\n this.envVariables.accountId,\n )}/runs/${encodeURIComponent(this.envVariables.runId)}`;\n }\n return true;\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in initializing test run report: ${err.message}.`);\n return false;\n }\n }\n\n private async _onTestEnd(test: TestCase, result: TestResult): Promise<undefined> {\n try {\n this.isTestRunStartSuccess = await this.promiseOnBegin;\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n return;\n }\n this.uploadMetadata.numTestResults++;\n const testResultObject: MPTTestResult = this.reporterUtils.getTestResultObject(\n test,\n result,\n this.ciInfo.jobName!,\n );\n this.testResultBatch.add(testResultObject);\n // Store test attachments in array\n const testAttachments: string[] = [];\n const otherAttachments: any[] = [];\n for (const attachment of result.attachments) {\n if (attachment.path !== undefined && attachment.path !== \"\") {\n testAttachments.push(attachment.path);\n this.uploadMetadata.numTotalAttachments++;\n this.uploadMetadata.sizeTotalAttachments += ReporterUtils.getFileSize(attachment.path);\n } else if (attachment.body instanceof Buffer) {\n otherAttachments.push(attachment);\n this.uploadMetadata.numTotalAttachments++;\n this.uploadMetadata.sizeTotalAttachments += ReporterUtils.getBufferSize(attachment.body);\n }\n }\n\n // Get raw result object and store it in map\n const rawTestResult: RawTestResult = this.reporterUtils.getRawTestResultObject(result);\n this.testRawResults.set(testResultObject.testExecutionId, JSON.stringify(rawTestResult));\n this._testEndPromises.push(\n this._uploadTestResultAttachments(\n testResultObject.testExecutionId,\n testAttachments,\n otherAttachments,\n ),\n );\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in processing test result: ${err.message}.`);\n }\n }\n\n private async _onEnd(_: FullResult): Promise<void> {\n this.isTestRunStartSuccess = await this.promiseOnBegin;\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n return;\n }\n try {\n // Upload the remaining test results\n if (this.testResultBatch.size > 0) {\n await this.serviceClient.postTestResults([...this.testResultBatch]);\n reporterLogger.info(`\\nUploaded test results batch successfully.`);\n this.testResultBatch.clear();\n }\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in uploading test run information: ${err.message}`);\n }\n }\n private renewSasUriIfNeeded = async (): Promise<void> => {\n if (\n this.sasUri === undefined ||\n !ReporterUtils.isTimeGreaterThanCurrentPlus10Minutes(this.sasUri)\n ) {\n this.sasUri = await this.serviceClient.createStorageUri();\n reporterLogger.info(\n `\\nFetched SAS URI with validity: ${this.sasUri.expiresAt} and access: ${this.sasUri.accessLevel}.`,\n );\n }\n };\n private async _uploadTestResultAttachments(\n testExecutionId: string,\n testAttachments: string[],\n otherAttachments: any[],\n ): Promise<void> {\n try {\n this.isTestRunStartSuccess = await this.promiseOnBegin;\n if (!this.isTestRunStartSuccess) {\n this._addError(`\\nUnable to initialize test run report.`);\n return;\n }\n\n for (const attachmentPath of testAttachments) {\n const fileRelativePath = `${testExecutionId}/${ReporterUtils.getFileRelativePath(attachmentPath)}`;\n await this.renewSasUriIfNeeded();\n await this.storageClient.uploadFile(this.sasUri.uri, attachmentPath, fileRelativePath);\n }\n\n for (const otherAttachment of otherAttachments) {\n await this.renewSasUriIfNeeded();\n const match = otherAttachment?.contentType?.match(/charset=(.*)/);\n const charset = match && match.length > 1 ? match[1] : \"utf-8\";\n await this.storageClient.uploadBuffer(\n this.sasUri.uri,\n otherAttachment.body.toString((charset as any) || \"utf-8\"),\n `${testExecutionId}/${otherAttachment.name}`,\n );\n }\n\n const rawTestResult = this.testRawResults.get(testExecutionId);\n await this.renewSasUriIfNeeded();\n await this.storageClient.uploadBuffer(\n this.sasUri.uri,\n rawTestResult[0]!,\n `${testExecutionId}/rawTestResult.json`,\n );\n } catch (err: any) {\n this._addError(`Name: ${err.name}, Message: ${err.message}, Stack: ${err.stack}`);\n reporterLogger.error(`\\nError in uploading test result attachments: ${err.message}`);\n }\n }\n\n private initializeMPTReporter(): void {\n this.envVariables = new EnvironmentVariables();\n if (process.env[InternalEnvironmentVariables.MPT_SETUP_FATAL_ERROR] === \"true\") {\n this.isTokenValid = false;\n return;\n }\n if (!process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL]) {\n process.stdout.write(\"\\nReporting service url not found.\");\n this.isTokenValid = false;\n return;\n }\n reporterLogger.info(\n `Reporting url - ${process.env[InternalEnvironmentVariables.MPT_SERVICE_REPORTING_URL]}`,\n );\n if (this.envVariables.accessToken === undefined || this.envVariables.accessToken === \"\") {\n process.stdout.write(`\\n${ServiceErrorMessageConstants.NO_AUTH_ERROR.message}`);\n this.isTokenValid = false;\n } else if (ReporterUtils.hasAudienceClaim(this.envVariables.accessToken)) {\n const result = populateValuesFromServiceUrl();\n this.envVariables.region = result!.region;\n this.envVariables.accountId = result!.accountId;\n const entraTokenDetails: EntraTokenDetails = ReporterUtils.getTokenDetails<EntraTokenDetails>(\n this.envVariables.accessToken,\n TokenType.ENTRA,\n );\n this.envVariables.userId = entraTokenDetails.oid;\n this.envVariables.userName = entraTokenDetails.name;\n } else {\n const mptTokenDetails: MPTTokenDetails = ReporterUtils.getTokenDetails<MPTTokenDetails>(\n this.envVariables.accessToken,\n TokenType.MPT,\n );\n validateMptPAT(this._reporterFailureHandler);\n this.envVariables.accountId = mptTokenDetails.aid;\n this.envVariables.userId = mptTokenDetails.oid;\n this.envVariables.userName = mptTokenDetails.userName;\n this.envVariables.region = ReporterUtils.getRegionFromAccountID(this.envVariables.accountId!);\n }\n this.storageClient = new StorageClient();\n if (\n this.envVariables.region &&\n !Constants.SupportedRegions.includes(this.envVariables.region!) &&\n this.isTokenValid\n ) {\n process.stdout.write(\n `\\nUnsupported region's workspace used to generate the input Access Token; the supported regions are ${Constants.SupportedRegions.join(\n \", \",\n )}`,\n );\n this.isRegionValid = false;\n }\n if (this.envVariables.runId === undefined || this.envVariables.runId === \"\") {\n this.envVariables.runId = ReporterUtils.getRunId(this.ciInfo);\n }\n }\n\n private displayAdditionalInformation(): void {\n if (this.informationalMessages.length > 0) console.info(); // Add a new line before displaying the messages\n this.informationalMessages.forEach((message, index) => {\n console.info(`${index + 1}. ${message}`);\n });\n }\n\n private processTestResult(result: TestResult): void {\n if (\n process.env[InternalEnvironmentVariables.MPT_CLOUD_HOSTED_BROWSER_USED] &&\n result.status !== \"passed\"\n ) {\n result.errors.forEach((error) => {\n TestResultErrorConstants.forEach((testResultErrorParseObj) => {\n if (this.processedErrorMessageKeys.includes(testResultErrorParseObj.key)) {\n return;\n }\n const errorMessage = error.message;\n if (!errorMessage) return;\n const match = errorMessage.match(testResultErrorParseObj.pattern);\n if (match) {\n this.processedErrorMessageKeys.push(testResultErrorParseObj.key);\n this._addInformationalMessage(testResultErrorParseObj.message);\n }\n });\n });\n }\n }\n\n /**\n * @public\n *\n * Whether this reporter uses stdio for reporting. When it does not, Playwright Test could add some output to enhance\n * user experience. If your reporter does not print to the terminal, it is strongly recommended to return `false`.\n */\n printsToStdio(): boolean {\n return true;\n }\n}\nexport default MPTReporter;\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
-
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
-
{
|
|
4
|
-
"tsdocVersion": "0.12",
|
|
5
|
-
"toolPackages": [
|
|
6
|
-
{
|
|
7
|
-
"packageName": "@microsoft/api-extractor",
|
|
8
|
-
"packageVersion": "7.52.8"
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
}
|
|
1
|
+
// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
|
|
2
|
+
// It should be published with your NPM package. It should not be tracked by Git.
|
|
3
|
+
{
|
|
4
|
+
"tsdocVersion": "0.12",
|
|
5
|
+
"toolPackages": [
|
|
6
|
+
{
|
|
7
|
+
"packageName": "@microsoft/api-extractor",
|
|
8
|
+
"packageVersion": "7.52.8"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
}
|
|
@@ -26,7 +26,6 @@ class CIInfoProvider {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
static getCIInfo() {
|
|
29
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
30
29
|
const ciProvider = CIInfoProvider.getCIProvider();
|
|
31
30
|
if (ciProvider === CI_PROVIDERS.GITHUB) {
|
|
32
31
|
// Logic to get GitHub Actions CIInfo
|
|
@@ -60,7 +59,7 @@ class CIInfoProvider {
|
|
|
60
59
|
runId: this.getADORunId() || null,
|
|
61
60
|
runAttempt: process.env["RELEASE_ATTEMPTNUMBER"]
|
|
62
61
|
? parseInt(process.env["RELEASE_ATTEMPTNUMBER"], 10)
|
|
63
|
-
: parseInt(
|
|
62
|
+
: parseInt(process.env["SYSTEM_JOBATTEMPT"] ?? "", 10),
|
|
64
63
|
jobName: process.env["SYSTEM_JOBDISPLAYNAME"] || process.env["RELEASE_DEPLOYMENTID"] || null,
|
|
65
64
|
};
|
|
66
65
|
}
|
|
@@ -68,14 +67,14 @@ class CIInfoProvider {
|
|
|
68
67
|
// Handle unsupported CI provider
|
|
69
68
|
return {
|
|
70
69
|
provider: CI_PROVIDERS.DEFAULT,
|
|
71
|
-
repo:
|
|
72
|
-
branch:
|
|
73
|
-
author:
|
|
74
|
-
commitId:
|
|
75
|
-
revisionUrl:
|
|
76
|
-
runId:
|
|
70
|
+
repo: process.env["REPO"] ?? null,
|
|
71
|
+
branch: process.env["BRANCH"] ?? null,
|
|
72
|
+
author: process.env["AUTHOR"] ?? null,
|
|
73
|
+
commitId: process.env["COMMIT_ID"] ?? null,
|
|
74
|
+
revisionUrl: process.env["REVISION_URL"] ?? null,
|
|
75
|
+
runId: process.env["RUN_ID"] ?? null,
|
|
77
76
|
runAttempt: process.env["RUN_ATTEMPT"] ? parseInt(process.env["RUN_ATTEMPT"], 10) : null,
|
|
78
|
-
jobName:
|
|
77
|
+
jobName: process.env["JOB_ID"] ?? null,
|
|
79
78
|
};
|
|
80
79
|
}
|
|
81
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cIInfoProvider.js","sourceRoot":"","sources":["../../../src/utils/cIInfoProvider.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAElC,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,2BAAW,CAAA;IACX,mCAAmB,CAAA;IACnB,kCAAkC;AACpC,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AAcD,MAAa,cAAc;IACjB,MAAM,CAAC,eAAe;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,IAAI,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC;YACrC,OAAO,YAAY,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,IAAI,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1C,OAAO,YAAY,CAAC,GAAG,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,YAAY,CAAC,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAS
|
|
1
|
+
{"version":3,"file":"cIInfoProvider.js","sourceRoot":"","sources":["../../../src/utils/cIInfoProvider.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAElC,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,2BAAW,CAAA;IACX,mCAAmB,CAAA;IACnB,kCAAkC;AACpC,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AAcD,MAAa,cAAc;IACjB,MAAM,CAAC,eAAe;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,IAAI,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC;YACrC,OAAO,YAAY,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,IAAI,cAAc,CAAC,aAAa,EAAE,EAAE,CAAC;YAC1C,OAAO,YAAY,CAAC,GAAG,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,YAAY,CAAC,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAS;QACd,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;QAClD,IAAI,UAAU,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;YACvC,qCAAqC;YACrC,OAAO;gBACL,QAAQ,EAAE,YAAY,CAAC,MAAM;gBAC7B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI;gBACjD,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI;gBACtC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI;gBAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI;gBAC3C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;oBAC3C,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;oBAC/G,CAAC,CAAC,IAAI;gBACR,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI;gBAC3C,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;oBAC3C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC;oBACjD,CAAC,CAAC,IAAI;gBACR,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI;aAC3C,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC;YAC3C,mCAAmC;YACnC,OAAO;gBACL,QAAQ,EAAE,YAAY,CAAC,GAAG;gBAC1B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;gBAChD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI;gBACjD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI;gBACjD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI;gBACpD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC;oBAC5D,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE;oBACtL,CAAC,CAAC,IAAI;gBACR,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI;gBACjC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;oBAC9C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC;oBACpD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;gBACxD,OAAO,EACL,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI;aACtF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,OAAO;gBACL,QAAQ,EAAE,YAAY,CAAC,OAAO;gBAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;gBACjC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;gBACrC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;gBACrC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI;gBAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI;gBAChD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;gBACpC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;gBACxF,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,aAAa;QAC1B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,CAC5F,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,WAAW;QACxB,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC/E,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACzF,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7E,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QAChF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,eAAe;QAC5B,IACE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,cAAc;YACnD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,qBAAqB,EAC1D,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC;QACzC,CAAC;IACH,CAAC;CACF;AA7FD,wCA6FC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport enum CI_PROVIDERS {\n GITHUB = \"GITHUB\",\n ADO = \"ADO\",\n DEFAULT = \"DEFAULT\",\n // Add more CI providers as needed\n}\n\nexport type CIInfo = {\n provider: CI_PROVIDERS | null;\n repo: string | null;\n branch: string | null;\n author: string | null;\n commitId: string | null;\n revisionUrl: string | null;\n runId: string | null;\n runAttempt: number | null;\n jobName: string | null;\n};\n\nexport class CIInfoProvider {\n private static isGitHubActions(): boolean {\n return process.env[\"GITHUB_ACTIONS\"] === \"true\";\n }\n\n static getCIProvider(): string | null {\n if (CIInfoProvider.isGitHubActions()) {\n return CI_PROVIDERS.GITHUB;\n } else if (CIInfoProvider.isAzureDevOps()) {\n return CI_PROVIDERS.ADO;\n } else {\n return CI_PROVIDERS.DEFAULT;\n }\n }\n\n static getCIInfo(): CIInfo {\n const ciProvider = CIInfoProvider.getCIProvider();\n if (ciProvider === CI_PROVIDERS.GITHUB) {\n // Logic to get GitHub Actions CIInfo\n return {\n provider: CI_PROVIDERS.GITHUB,\n repo: process.env[\"GITHUB_REPOSITORY_ID\"] || null,\n branch: this.getGHBranchName() || null,\n author: process.env[\"GITHUB_ACTOR\"] || null,\n commitId: process.env[\"GITHUB_SHA\"] || null,\n revisionUrl: process.env[\"GITHUB_SERVER_URL\"]\n ? `${process.env[\"GITHUB_SERVER_URL\"]}/${process.env[\"GITHUB_REPOSITORY\"]}/commit/${process.env[\"GITHUB_SHA\"]}`\n : null,\n runId: process.env[\"GITHUB_RUN_ID\"] || null,\n runAttempt: process.env[\"GITHUB_RUN_ATTEMPT\"]\n ? parseInt(process.env[\"GITHUB_RUN_ATTEMPT\"], 10)\n : null,\n jobName: process.env[\"GITHUB_JOB\"] || null,\n };\n } else if (ciProvider === CI_PROVIDERS.ADO) {\n // Logic to get Azure DevOps CIInfo\n return {\n provider: CI_PROVIDERS.ADO,\n repo: process.env[\"BUILD_REPOSITORY_ID\"] || null,\n branch: process.env[\"BUILD_SOURCEBRANCH\"] || null,\n author: process.env[\"BUILD_REQUESTEDFOR\"] || null,\n commitId: process.env[\"BUILD_SOURCEVERSION\"] || null,\n revisionUrl: process.env[\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\"]\n ? `${process.env[\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\"]}${process.env[\"SYSTEM_TEAMPROJECT\"]}/_git/${process.env[\"BUILD_REPOSITORY_NAME\"]}/commit/${process.env[\"BUILD_SOURCEVERSION\"]}`\n : null,\n runId: this.getADORunId() || null,\n runAttempt: process.env[\"RELEASE_ATTEMPTNUMBER\"]\n ? parseInt(process.env[\"RELEASE_ATTEMPTNUMBER\"], 10)\n : parseInt(process.env[\"SYSTEM_JOBATTEMPT\"] ?? \"\", 10),\n jobName:\n process.env[\"SYSTEM_JOBDISPLAYNAME\"] || process.env[\"RELEASE_DEPLOYMENTID\"] || null,\n };\n } else {\n // Handle unsupported CI provider\n return {\n provider: CI_PROVIDERS.DEFAULT,\n repo: process.env[\"REPO\"] ?? null,\n branch: process.env[\"BRANCH\"] ?? null,\n author: process.env[\"AUTHOR\"] ?? null,\n commitId: process.env[\"COMMIT_ID\"] ?? null,\n revisionUrl: process.env[\"REVISION_URL\"] ?? null,\n runId: process.env[\"RUN_ID\"] ?? null,\n runAttempt: process.env[\"RUN_ATTEMPT\"] ? parseInt(process.env[\"RUN_ATTEMPT\"], 10) : null,\n jobName: process.env[\"JOB_ID\"] ?? null,\n };\n }\n }\n\n private static isAzureDevOps(): boolean {\n return (\n process.env[\"AZURE_HTTP_USER_AGENT\"] !== undefined && process.env[\"TF_BUILD\"] !== undefined\n );\n }\n\n private static getADORunId(): string | null {\n if (process.env[\"RELEASE_DEFINITIONID\"] && process.env[\"RELEASE_DEPLOYMENTID\"]) {\n return `${process.env[\"RELEASE_DEFINITIONID\"]}-${process.env[\"RELEASE_DEPLOYMENTID\"]}`;\n } else if (process.env[\"SYSTEM_DEFINITIONID\"] && process.env[\"SYSTEM_JOBID\"]) {\n return `${process.env[\"SYSTEM_DEFINITIONID\"]}-${process.env[\"SYSTEM_JOBID\"]}`;\n }\n return null;\n }\n\n private static getGHBranchName(): string {\n if (\n process.env[\"GITHUB_EVENT_NAME\"] === \"pull_request\" ||\n process.env[\"GITHUB_EVENT_NAME\"] === \"pull_request_target\"\n ) {\n return process.env[\"GITHUB_HEAD_REF\"]!;\n } else {\n return process.env[\"GITHUB_REF_NAME\"]!;\n }\n }\n}\n"]}
|
|
@@ -4,39 +4,33 @@
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.getPackageManager = exports.Yarn = exports.PNPM = exports.NPM = void 0;
|
|
6
6
|
class NPM {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
}
|
|
7
|
+
runCommand = (command, args) => {
|
|
8
|
+
return `npx ${command} ${args}`;
|
|
9
|
+
};
|
|
10
|
+
getVersionFromStdout = (stdout) => {
|
|
11
|
+
const match = stdout.match(/Version\s(\d+\.\d+\.\d+(-\w+-\d{4}-\d{2}-\d{2})?)/);
|
|
12
|
+
return match ? match[1] : "Unknown version";
|
|
13
|
+
};
|
|
16
14
|
}
|
|
17
15
|
exports.NPM = NPM;
|
|
18
16
|
class PNPM {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
};
|
|
27
|
-
}
|
|
17
|
+
runCommand = (command, args) => {
|
|
18
|
+
return `pnpm ${command} ${args}`;
|
|
19
|
+
};
|
|
20
|
+
getVersionFromStdout = (stdout) => {
|
|
21
|
+
const match = stdout.match(/Version\s(\d+\.\d+\.\d+(-\w+-\d{4}-\d{2}-\d{2})?)/);
|
|
22
|
+
return match ? match[1] : "Unknown version";
|
|
23
|
+
};
|
|
28
24
|
}
|
|
29
25
|
exports.PNPM = PNPM;
|
|
30
26
|
class Yarn {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
};
|
|
39
|
-
}
|
|
27
|
+
runCommand = (command, args) => {
|
|
28
|
+
return `yarn ${command} ${args}`;
|
|
29
|
+
};
|
|
30
|
+
getVersionFromStdout = (stdout) => {
|
|
31
|
+
const match = stdout.match(/Version\s(\d+\.\d+\.\d+(-\w+-\d{4}-\d{2}-\d{2})?)/);
|
|
32
|
+
return match ? match[1] : "Unknown version";
|
|
33
|
+
};
|
|
40
34
|
}
|
|
41
35
|
exports.Yarn = Yarn;
|
|
42
36
|
// https://stackoverflow.com/questions/68133683/is-there-a-cross-platform-way-to-get-the-name-of-the-parent-process-in-node-js
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../../src/utils/packageManager.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAIlC,MAAa,GAAG;
|
|
1
|
+
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../../src/utils/packageManager.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAIlC,MAAa,GAAG;IACd,UAAU,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE;QACrD,OAAO,OAAO,OAAO,IAAI,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;IACF,oBAAoB,GAAG,CAAC,MAAc,EAAU,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC9C,CAAC,CAAC;CACH;AARD,kBAQC;AAED,MAAa,IAAI;IACf,UAAU,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE;QACrD,OAAO,QAAQ,OAAO,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC,CAAC;IACF,oBAAoB,GAAG,CAAC,MAAc,EAAU,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC9C,CAAC,CAAC;CACH;AARD,oBAQC;AAED,MAAa,IAAI;IACf,UAAU,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE;QACrD,OAAO,QAAQ,OAAO,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC,CAAC;IACF,oBAAoB,GAAG,CAAC,MAAc,EAAU,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC9C,CAAC,CAAC;CACH;AARD,oBAQC;AAED,8HAA8H;AACvH,MAAM,iBAAiB,GAAG,GAAmB,EAAE;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,IAAI,EAAE,CAAC;QAClD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,GAAG,EAAE,CAAC;AACnB,CAAC,CAAC;AAPW,QAAA,iBAAiB,qBAO5B","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { PackageManager } from \"../common/types.js\";\n\nexport class NPM implements PackageManager {\n runCommand = (command: string, args: string): string => {\n return `npx ${command} ${args}`;\n };\n getVersionFromStdout = (stdout: string): string => {\n const match = stdout.match(/Version\\s(\\d+\\.\\d+\\.\\d+(-\\w+-\\d{4}-\\d{2}-\\d{2})?)/);\n return match ? match[1] : \"Unknown version\";\n };\n}\n\nexport class PNPM implements PackageManager {\n runCommand = (command: string, args: string): string => {\n return `pnpm ${command} ${args}`;\n };\n getVersionFromStdout = (stdout: string): string => {\n const match = stdout.match(/Version\\s(\\d+\\.\\d+\\.\\d+(-\\w+-\\d{4}-\\d{2}-\\d{2})?)/);\n return match ? match[1] : \"Unknown version\";\n };\n}\n\nexport class Yarn implements PackageManager {\n runCommand = (command: string, args: string): string => {\n return `yarn ${command} ${args}`;\n };\n getVersionFromStdout = (stdout: string): string => {\n const match = stdout.match(/Version\\s(\\d+\\.\\d+\\.\\d+(-\\w+-\\d{4}-\\d{2}-\\d{2})?)/);\n return match ? match[1] : \"Unknown version\";\n };\n}\n\n// https://stackoverflow.com/questions/68133683/is-there-a-cross-platform-way-to-get-the-name-of-the-parent-process-in-node-js\nexport const getPackageManager = (): PackageManager => {\n if (process.env[\"npm_config_user_agent\"]) {\n const userAgent = process.env[\"npm_config_user_agent\"];\n if (userAgent.includes(\"yarn\")) return new Yarn();\n if (userAgent.includes(\"pnpm\")) return new PNPM();\n }\n return new NPM();\n};\n"]}
|