@azure/playwright 1.1.3-alpha.20260310.1 → 1.1.3

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.
Files changed (103) hide show
  1. package/dist/browser/common/constants.d.ts +3 -0
  2. package/dist/browser/common/constants.d.ts.map +1 -1
  3. package/dist/browser/common/constants.js +3 -0
  4. package/dist/browser/common/constants.js.map +1 -1
  5. package/dist/browser/common/types.d.ts +8 -0
  6. package/dist/browser/common/types.d.ts.map +1 -1
  7. package/dist/browser/common/types.js.map +1 -1
  8. package/dist/browser/core/playwrightService.d.ts.map +1 -1
  9. package/dist/browser/core/playwrightService.js +6 -0
  10. package/dist/browser/core/playwrightService.js.map +1 -1
  11. package/dist/browser/utils/utils.d.ts.map +1 -1
  12. package/dist/browser/utils/utils.js +2 -3
  13. package/dist/browser/utils/utils.js.map +1 -1
  14. package/dist/commonjs/common/constants.d.ts +3 -0
  15. package/dist/commonjs/common/constants.d.ts.map +1 -1
  16. package/dist/commonjs/common/constants.js +97 -126
  17. package/dist/commonjs/common/constants.js.map +1 -7
  18. package/dist/commonjs/common/customerConfig.js +14 -31
  19. package/dist/commonjs/common/customerConfig.js.map +1 -7
  20. package/dist/commonjs/common/entraIdAccessToken.js +83 -106
  21. package/dist/commonjs/common/entraIdAccessToken.js.map +1 -7
  22. package/dist/commonjs/common/environmentVariables.js +24 -43
  23. package/dist/commonjs/common/environmentVariables.js.map +1 -7
  24. package/dist/commonjs/common/executor.js +67 -88
  25. package/dist/commonjs/common/executor.js.map +1 -7
  26. package/dist/commonjs/common/httpService.js +35 -54
  27. package/dist/commonjs/common/httpService.js.map +1 -7
  28. package/dist/commonjs/common/logger.js +8 -28
  29. package/dist/commonjs/common/logger.js.map +1 -7
  30. package/dist/commonjs/common/messages.js +169 -189
  31. package/dist/commonjs/common/messages.js.map +1 -7
  32. package/dist/commonjs/common/playwrightServiceConfig.js +98 -113
  33. package/dist/commonjs/common/playwrightServiceConfig.js.map +1 -7
  34. package/dist/commonjs/common/state.js +10 -30
  35. package/dist/commonjs/common/state.js.map +1 -7
  36. package/dist/commonjs/common/types.d.ts +8 -0
  37. package/dist/commonjs/common/types.d.ts.map +1 -1
  38. package/dist/commonjs/common/types.js +5 -15
  39. package/dist/commonjs/common/types.js.map +1 -7
  40. package/dist/commonjs/core/global/playwright-service-global-setup.js +26 -52
  41. package/dist/commonjs/core/global/playwright-service-global-setup.js.map +1 -7
  42. package/dist/commonjs/core/global/playwright-service-global-teardown.js +20 -49
  43. package/dist/commonjs/core/global/playwright-service-global-teardown.js.map +1 -7
  44. package/dist/commonjs/core/initializePlaywrightServiceTestRun.js +27 -39
  45. package/dist/commonjs/core/initializePlaywrightServiceTestRun.js.map +1 -7
  46. package/dist/commonjs/core/playwrightService.d.ts.map +1 -1
  47. package/dist/commonjs/core/playwrightService.js +211 -166
  48. package/dist/commonjs/core/playwrightService.js.map +1 -7
  49. package/dist/commonjs/core/playwrightServiceEntra.js +48 -67
  50. package/dist/commonjs/core/playwrightServiceEntra.js.map +1 -7
  51. package/dist/commonjs/core/playwrightServiceUtils.d.ts.map +1 -1
  52. package/dist/commonjs/core/playwrightServiceUtils.js +11 -44
  53. package/dist/commonjs/core/playwrightServiceUtils.js.map +1 -7
  54. package/dist/commonjs/index.js +18 -36
  55. package/dist/commonjs/index.js.map +1 -7
  56. package/dist/commonjs/reporter/index.js +15 -34
  57. package/dist/commonjs/reporter/index.js.map +1 -7
  58. package/dist/commonjs/reporter/playwrightReporter.js +216 -222
  59. package/dist/commonjs/reporter/playwrightReporter.js.map +1 -7
  60. package/dist/commonjs/utils/PlaywrightServiceClient.js +91 -140
  61. package/dist/commonjs/utils/PlaywrightServiceClient.js.map +1 -7
  62. package/dist/commonjs/utils/cIInfoProvider.js +74 -81
  63. package/dist/commonjs/utils/cIInfoProvider.js.map +1 -7
  64. package/dist/commonjs/utils/getPackageVersion.d.ts.map +1 -1
  65. package/dist/commonjs/utils/getPackageVersion.js +19 -50
  66. package/dist/commonjs/utils/getPackageVersion.js.map +1 -7
  67. package/dist/commonjs/utils/getPlaywrightVersion.js +21 -42
  68. package/dist/commonjs/utils/getPlaywrightVersion.js.map +1 -7
  69. package/dist/commonjs/utils/packageManager.js +40 -59
  70. package/dist/commonjs/utils/packageManager.js.map +1 -7
  71. package/dist/commonjs/utils/parseJwt.js +17 -37
  72. package/dist/commonjs/utils/parseJwt.js.map +1 -7
  73. package/dist/commonjs/utils/playwrightReporterStorageManager.js +342 -381
  74. package/dist/commonjs/utils/playwrightReporterStorageManager.js.map +1 -7
  75. package/dist/commonjs/utils/utils.d.ts.map +1 -1
  76. package/dist/commonjs/utils/utils.js +368 -417
  77. package/dist/commonjs/utils/utils.js.map +1 -7
  78. package/dist/esm/common/constants.d.ts +3 -0
  79. package/dist/esm/common/constants.d.ts.map +1 -1
  80. package/dist/esm/common/constants.js +4 -0
  81. package/dist/esm/common/constants.js.map +2 -2
  82. package/dist/esm/common/types.d.ts +8 -0
  83. package/dist/esm/common/types.d.ts.map +1 -1
  84. package/dist/esm/core/playwrightService.d.ts.map +1 -1
  85. package/dist/esm/core/playwrightService.js +6 -0
  86. package/dist/esm/core/playwrightService.js.map +2 -2
  87. package/dist/esm/utils/utils.d.ts.map +1 -1
  88. package/dist/esm/utils/utils.js +4 -3
  89. package/dist/esm/utils/utils.js.map +2 -2
  90. package/dist/react-native/common/constants.d.ts +3 -0
  91. package/dist/react-native/common/constants.d.ts.map +1 -1
  92. package/dist/react-native/common/constants.js +3 -0
  93. package/dist/react-native/common/constants.js.map +1 -1
  94. package/dist/react-native/common/types.d.ts +8 -0
  95. package/dist/react-native/common/types.d.ts.map +1 -1
  96. package/dist/react-native/common/types.js.map +1 -1
  97. package/dist/react-native/core/playwrightService.d.ts.map +1 -1
  98. package/dist/react-native/core/playwrightService.js +6 -0
  99. package/dist/react-native/core/playwrightService.js.map +1 -1
  100. package/dist/react-native/utils/utils.d.ts.map +1 -1
  101. package/dist/react-native/utils/utils.js +2 -3
  102. package/dist/react-native/utils/utils.js.map +1 -1
  103. package/package.json +6 -6
@@ -1,489 +1,440 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
- // If the importer is in node compatibility mode or this is not an ESM
21
- // file that has been converted to a CommonJS file using a Babel-
22
- // compatible transform (i.e. "__esModule" has not been set), then set
23
- // "default" to the CommonJS "module.exports" for node compatibility.
24
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
- mod
26
- ));
27
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
- var utils_exports = {};
29
- __export(utils_exports, {
30
- ValidateRunID: () => ValidateRunID,
31
- calculateOptimalConcurrency: () => calculateOptimalConcurrency,
32
- collectAllFiles: () => collectAllFiles,
33
- exitWithFailureMessage: () => exitWithFailureMessage,
34
- extractErrorMessage: () => extractErrorMessage,
35
- fetchOrValidateAccessToken: () => fetchOrValidateAccessToken,
36
- getAccessToken: () => getAccessToken,
37
- getAndSetRunId: () => getAndSetRunId,
38
- getContentType: () => getContentType,
39
- getHtmlReporterOutputFolder: () => getHtmlReporterOutputFolder,
40
- getPackageVersion: () => getPackageVersion,
41
- getPlaywrightVersion: () => import_getPlaywrightVersion2.getPlaywrightVersion,
42
- getPortalTestRunUrl: () => getPortalTestRunUrl,
43
- getRunName: () => getRunName,
44
- getServiceBaseURL: () => getServiceBaseURL,
45
- getServiceWSEndpoint: () => getServiceWSEndpoint,
46
- getStorageAccountNameFromUri: () => getStorageAccountNameFromUri,
47
- getTestRunApiUrl: () => getTestRunApiUrl,
48
- getTestRunConfig: () => getTestRunConfig,
49
- getVersionInfo: () => getVersionInfo,
50
- getWorkspaceMetaDataApiUrl: () => getWorkspaceMetaDataApiUrl,
51
- isNullOrEmpty: () => isNullOrEmpty,
52
- isValidGuid: () => isValidGuid,
53
- parseJwt: () => import_parseJwt2.parseJwt,
54
- populateValuesFromServiceUrl: () => populateValuesFromServiceUrl,
55
- resolveTenantDomain: () => resolveTenantDomain,
56
- throwErrorWithFailureMessage: () => throwErrorWithFailureMessage,
57
- validateMptPAT: () => validateMptPAT,
58
- validatePlaywrightVersion: () => validatePlaywrightVersion,
59
- validateServiceUrl: () => validateServiceUrl,
60
- warnIfAccessTokenCloseToExpiry: () => warnIfAccessTokenCloseToExpiry
61
- });
62
- module.exports = __toCommonJS(utils_exports);
63
- var import_constants = require("../common/constants.js");
64
- var import_messages = require("../common/messages.js");
65
- var import_logger = require("../common/logger.js");
66
- var import_node_process = __toESM(require("node:process"));
67
- var import_node_crypto = require("node:crypto");
68
- var import_parseJwt = require("./parseJwt.js");
69
- var import_getPlaywrightVersion = require("./getPlaywrightVersion.js");
70
- var import_entraIdAccessToken = require("../common/entraIdAccessToken.js");
71
- var import_cIInfoProvider = require("./cIInfoProvider.js");
72
- var import_child_process = require("child_process");
73
- var import_getPackageVersion = require("./getPackageVersion.js");
74
- var import_fs = require("fs");
75
- var import_path = require("path");
76
- var import_constants2 = require("../common/constants.js");
77
- var import_getPlaywrightVersion2 = require("./getPlaywrightVersion.js");
78
- var import_parseJwt2 = require("./parseJwt.js");
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.getStorageAccountNameFromUri = exports.getTestRunConfig = exports.validatePlaywrightVersion = exports.getVersionInfo = exports.fetchOrValidateAccessToken = exports.warnIfAccessTokenCloseToExpiry = exports.validateMptPAT = exports.ValidateRunID = exports.validateServiceUrl = exports.getServiceWSEndpoint = exports.getAndSetRunId = exports.isValidGuid = exports.getServiceBaseURL = exports.getAccessToken = exports.populateValuesFromServiceUrl = exports.throwErrorWithFailureMessage = exports.exitWithFailureMessage = exports.getPackageVersion = exports.parseJwt = exports.getPlaywrightVersion = void 0;
6
+ exports.getTestRunApiUrl = getTestRunApiUrl;
7
+ exports.isNullOrEmpty = isNullOrEmpty;
8
+ exports.getRunName = getRunName;
9
+ exports.extractErrorMessage = extractErrorMessage;
10
+ exports.getWorkspaceMetaDataApiUrl = getWorkspaceMetaDataApiUrl;
11
+ exports.getHtmlReporterOutputFolder = getHtmlReporterOutputFolder;
12
+ exports.getContentType = getContentType;
13
+ exports.calculateOptimalConcurrency = calculateOptimalConcurrency;
14
+ exports.collectAllFiles = collectAllFiles;
15
+ exports.resolveTenantDomain = resolveTenantDomain;
16
+ exports.getPortalTestRunUrl = getPortalTestRunUrl;
17
+ const tslib_1 = require("tslib");
18
+ const constants_js_1 = require("../common/constants.js");
19
+ const messages_js_1 = require("../common/messages.js");
20
+ const logger_js_1 = require("../common/logger.js");
21
+ const node_process_1 = tslib_1.__importDefault(require("node:process"));
22
+ const node_crypto_1 = require("node:crypto");
23
+ const parseJwt_js_1 = require("./parseJwt.js");
24
+ const getPlaywrightVersion_js_1 = require("./getPlaywrightVersion.js");
25
+ const entraIdAccessToken_js_1 = require("../common/entraIdAccessToken.js");
26
+ const cIInfoProvider_js_1 = require("./cIInfoProvider.js");
27
+ const child_process_1 = require("child_process");
28
+ const getPackageVersion_js_1 = require("./getPackageVersion.js");
29
+ const fs_1 = require("fs");
30
+ const path_1 = require("path");
31
+ // Re-exporting for backward compatibility
32
+ var getPlaywrightVersion_js_2 = require("./getPlaywrightVersion.js");
33
+ Object.defineProperty(exports, "getPlaywrightVersion", { enumerable: true, get: function () { return getPlaywrightVersion_js_2.getPlaywrightVersion; } });
34
+ var parseJwt_js_2 = require("./parseJwt.js");
35
+ Object.defineProperty(exports, "parseJwt", { enumerable: true, get: function () { return parseJwt_js_2.parseJwt; } });
79
36
  const getPackageVersion = () => {
80
- const distVersion = (0, import_getPackageVersion.getPackageVersionFromFolder)("../../../");
81
- if (distVersion) {
82
- return distVersion;
83
- }
84
- const srcVersion = (0, import_getPackageVersion.getPackageVersionFromFolder)("../../");
85
- if (srcVersion) {
86
- return srcVersion;
87
- }
88
- return "unknown-version";
37
+ // hacky way to get package version
38
+ // try from dist folder first (customer perspective)
39
+ const distVersion = (0, getPackageVersion_js_1.getPackageVersionFromFolder)("../../../");
40
+ if (distVersion) {
41
+ return distVersion;
42
+ }
43
+ // if not found, try from src folder (internal test suite)
44
+ const srcVersion = (0, getPackageVersion_js_1.getPackageVersionFromFolder)("../../");
45
+ if (srcVersion) {
46
+ return srcVersion;
47
+ }
48
+ return "unknown-version";
89
49
  };
50
+ exports.getPackageVersion = getPackageVersion;
90
51
  const exitWithFailureMessage = (error, errorDetails) => {
91
- console.log();
92
- if (error.formatWithErrorDetails && errorDetails) {
93
- console.error(error.formatWithErrorDetails(errorDetails));
94
- } else {
95
- console.error(error.message);
96
- }
97
- import_node_process.default.exit(1);
52
+ console.log();
53
+ if (error.formatWithErrorDetails && errorDetails) {
54
+ console.error(error.formatWithErrorDetails(errorDetails));
55
+ }
56
+ else {
57
+ console.error(error.message);
58
+ }
59
+ // eslint-disable-next-line n/no-process-exit
60
+ node_process_1.default.exit(1);
98
61
  };
62
+ exports.exitWithFailureMessage = exitWithFailureMessage;
99
63
  const throwErrorWithFailureMessage = (error, errorDetails) => {
100
- console.log();
101
- const finalMessage = error.formatWithErrorDetails && errorDetails ? error.formatWithErrorDetails(errorDetails) : error.message;
102
- throw new Error(finalMessage);
64
+ console.log();
65
+ const finalMessage = error.formatWithErrorDetails && errorDetails
66
+ ? error.formatWithErrorDetails(errorDetails)
67
+ : error.message;
68
+ throw new Error(finalMessage);
103
69
  };
70
+ exports.throwErrorWithFailureMessage = throwErrorWithFailureMessage;
104
71
  const populateValuesFromServiceUrl = () => {
105
- const url = import_node_process.default.env["PLAYWRIGHT_SERVICE_URL"];
106
- if (url) {
107
- const parts = url.split("/");
108
- if (parts.length > 2) {
109
- const subdomainParts = parts[2].split(".");
110
- const region = subdomainParts.length > 0 ? subdomainParts[0] : null;
111
- const domain = subdomainParts.slice(2).join(".");
112
- const accountId = parts[4];
113
- return { region, domain, accountId };
114
- }
115
- }
116
- return null;
72
+ // Service URL format: wss://<region>.api.playwright.microsoft.com/accounts/<workspace-id>/browsers
73
+ const url = node_process_1.default.env["PLAYWRIGHT_SERVICE_URL"];
74
+ if (url) {
75
+ const parts = url.split("/");
76
+ if (parts.length > 2) {
77
+ const subdomainParts = parts[2].split(".");
78
+ const region = subdomainParts.length > 0 ? subdomainParts[0] : null;
79
+ const domain = subdomainParts.slice(2).join(".");
80
+ const accountId = parts[4];
81
+ return { region: region, domain: domain, accountId: accountId };
82
+ }
83
+ }
84
+ return null;
117
85
  };
86
+ exports.populateValuesFromServiceUrl = populateValuesFromServiceUrl;
118
87
  const getAccessToken = () => {
119
- return import_node_process.default.env[import_constants.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_ACCESS_TOKEN];
88
+ return node_process_1.default.env[constants_js_1.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_ACCESS_TOKEN];
120
89
  };
90
+ exports.getAccessToken = getAccessToken;
121
91
  const getServiceBaseURL = () => {
122
- return import_node_process.default.env[import_constants.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_URL];
92
+ return node_process_1.default.env[constants_js_1.ServiceEnvironmentVariable.PLAYWRIGHT_SERVICE_URL];
123
93
  };
94
+ exports.getServiceBaseURL = getServiceBaseURL;
124
95
  const isValidGuid = (guid) => {
125
- if (!guid) {
126
- return false;
127
- }
128
- const guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
129
- return guidRegex.test(guid);
96
+ if (!guid) {
97
+ return false;
98
+ }
99
+ const guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
100
+ return guidRegex.test(guid);
130
101
  };
102
+ exports.isValidGuid = isValidGuid;
131
103
  const getAndSetRunId = () => {
132
- const runId = (0, import_node_crypto.randomUUID)();
133
- import_node_process.default.env[import_constants.InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = runId;
134
- return runId;
104
+ const runId = (0, node_crypto_1.randomUUID)();
105
+ node_process_1.default.env[constants_js_1.InternalEnvironmentVariables.MPT_SERVICE_RUN_ID] = runId;
106
+ return runId;
135
107
  };
108
+ exports.getAndSetRunId = getAndSetRunId;
136
109
  const getServiceWSEndpoint = (runId, os, apiVersion) => {
137
- return `${getServiceBaseURL()}?runId=${encodeURIComponent(runId)}&os=${os}&api-version=${apiVersion}`;
110
+ return `${(0, exports.getServiceBaseURL)()}?runId=${encodeURIComponent(runId)}&os=${os}&sourceType=${constants_js_1.BrowserSessionSourceType.PLAYWRIGHT_WORKSPACES_TEST_RUN}&api-version=${apiVersion}`;
138
111
  };
112
+ exports.getServiceWSEndpoint = getServiceWSEndpoint;
139
113
  const validateServiceUrl = () => {
140
- const serviceUrl = getServiceBaseURL();
141
- if (!serviceUrl) {
142
- exitWithFailureMessage(import_messages.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
143
- }
114
+ const serviceUrl = (0, exports.getServiceBaseURL)();
115
+ if (!serviceUrl) {
116
+ (0, exports.exitWithFailureMessage)(messages_js_1.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
117
+ }
144
118
  };
119
+ exports.validateServiceUrl = validateServiceUrl;
145
120
  const ValidateRunID = (runID) => {
146
- const isValidRunID = isValidGuid(runID);
147
- if (!isValidRunID) {
148
- const errorMessage = import_messages.ServiceErrorMessageConstants.INVALID_RUN_ID_FORMAT.message;
149
- throw new Error(errorMessage);
150
- }
121
+ const isValidRunID = (0, exports.isValidGuid)(runID);
122
+ if (!isValidRunID) {
123
+ const errorMessage = messages_js_1.ServiceErrorMessageConstants.INVALID_RUN_ID_FORMAT.message;
124
+ throw new Error(errorMessage);
125
+ }
151
126
  };
127
+ exports.ValidateRunID = ValidateRunID;
152
128
  const validateMptPAT = (validationFailureCallback) => {
153
- try {
154
- const accessToken = getAccessToken();
155
- const result = populateValuesFromServiceUrl();
156
- if (!accessToken) {
157
- validationFailureCallback(import_messages.ServiceErrorMessageConstants.NO_AUTH_ERROR_PAT_TOKEN);
158
- }
159
- const claims = (0, import_parseJwt.parseJwt)(accessToken);
160
- if (!claims.exp) {
161
- validationFailureCallback(import_messages.ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);
162
- }
163
- if (Date.now() >= claims.exp * 1e3) {
164
- validationFailureCallback(import_messages.ServiceErrorMessageConstants.EXPIRED_MPT_PAT_ERROR);
129
+ try {
130
+ const accessToken = (0, exports.getAccessToken)();
131
+ const result = (0, exports.populateValuesFromServiceUrl)();
132
+ if (!accessToken) {
133
+ validationFailureCallback(messages_js_1.ServiceErrorMessageConstants.NO_AUTH_ERROR_PAT_TOKEN);
134
+ }
135
+ const claims = (0, parseJwt_js_1.parseJwt)(accessToken);
136
+ if (!claims.exp) {
137
+ validationFailureCallback(messages_js_1.ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);
138
+ }
139
+ if (Date.now() >= claims.exp * 1000) {
140
+ validationFailureCallback(messages_js_1.ServiceErrorMessageConstants.EXPIRED_MPT_PAT_ERROR);
141
+ }
142
+ if (result.accountId !== claims.pwid) {
143
+ validationFailureCallback(messages_js_1.ServiceErrorMessageConstants.WORKSPACE_MISMATCH_ERROR);
144
+ }
165
145
  }
166
- if (result.accountId !== claims.pwid) {
167
- validationFailureCallback(import_messages.ServiceErrorMessageConstants.WORKSPACE_MISMATCH_ERROR);
146
+ catch (err) {
147
+ logger_js_1.coreLogger.error(err);
148
+ (0, exports.exitWithFailureMessage)(messages_js_1.ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);
168
149
  }
169
- } catch (err) {
170
- import_logger.coreLogger.error(err);
171
- exitWithFailureMessage(import_messages.ServiceErrorMessageConstants.INVALID_MPT_PAT_ERROR);
172
- }
173
150
  };
151
+ exports.validateMptPAT = validateMptPAT;
174
152
  const isTokenExpiringSoon = (expirationTime, currentTime) => {
175
- return expirationTime * 1e3 - currentTime <= import_constants.Constants.SevenDaysInMS;
153
+ return expirationTime * 1000 - currentTime <= constants_js_1.Constants.SevenDaysInMS;
176
154
  };
177
155
  const warnAboutTokenExpiry = (expirationTime, currentTime) => {
178
- const daysToExpiration = Math.ceil((expirationTime * 1e3 - currentTime) / import_constants.Constants.OneDayInMS);
179
- const expirationDate = new Date(expirationTime * 1e3).toLocaleDateString();
180
- const expirationWarning = `Warning: The access token used for this test run will expire in ${daysToExpiration} days on ${expirationDate}. Generate a new token from the portal to avoid failures. For a simpler, more secure solution, switch to Microsoft Entra ID and eliminate token management. https://learn.microsoft.com/entra/identity/`;
181
- console.warn(expirationWarning);
156
+ const daysToExpiration = Math.ceil((expirationTime * 1000 - currentTime) / constants_js_1.Constants.OneDayInMS);
157
+ const expirationDate = new Date(expirationTime * 1000).toLocaleDateString();
158
+ const expirationWarning = `Warning: The access token used for this test run will expire in ${daysToExpiration} days on ${expirationDate}. Generate a new token from the portal to avoid failures. For a simpler, more secure solution, switch to Microsoft Entra ID and eliminate token management. https://learn.microsoft.com/entra/identity/`;
159
+ console.warn(expirationWarning);
182
160
  };
183
161
  const warnIfAccessTokenCloseToExpiry = () => {
184
- const accessToken = getAccessToken();
185
- if (!accessToken) {
186
- throw new Error(import_messages.ServiceErrorMessageConstants.NO_AUTH_ERROR_PAT_TOKEN.message);
187
- }
188
- const claims = (0, import_parseJwt.parseJwt)(accessToken);
189
- const currentTime = Date.now();
190
- if (isTokenExpiringSoon(claims.exp, currentTime)) {
191
- warnAboutTokenExpiry(claims.exp, currentTime);
192
- }
162
+ const accessToken = (0, exports.getAccessToken)();
163
+ if (!accessToken) {
164
+ throw new Error(messages_js_1.ServiceErrorMessageConstants.NO_AUTH_ERROR_PAT_TOKEN.message);
165
+ }
166
+ const claims = (0, parseJwt_js_1.parseJwt)(accessToken);
167
+ const currentTime = Date.now();
168
+ if (isTokenExpiringSoon(claims.exp, currentTime)) {
169
+ warnAboutTokenExpiry(claims.exp, currentTime);
170
+ }
193
171
  };
172
+ exports.warnIfAccessTokenCloseToExpiry = warnIfAccessTokenCloseToExpiry;
194
173
  const fetchOrValidateAccessToken = async (credential) => {
195
- const entraIdAccessToken = (0, import_entraIdAccessToken.createEntraIdAccessToken)(credential);
196
- if (entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {
197
- await entraIdAccessToken.fetchEntraIdAccessToken();
198
- }
199
- const token = getAccessToken();
200
- if (!token) {
201
- throw new Error(import_messages.ServiceErrorMessageConstants.NO_AUTH_ERROR_ENTRA_TOKEN.message);
202
- }
203
- return token;
174
+ const entraIdAccessToken = (0, entraIdAccessToken_js_1.createEntraIdAccessToken)(credential);
175
+ // Fetch a token or refresh if needed in a single call
176
+ if (entraIdAccessToken.doesEntraIdAccessTokenNeedRotation()) {
177
+ await entraIdAccessToken.fetchEntraIdAccessToken();
178
+ }
179
+ const token = (0, exports.getAccessToken)();
180
+ if (!token) {
181
+ throw new Error(messages_js_1.ServiceErrorMessageConstants.NO_AUTH_ERROR_ENTRA_TOKEN.message);
182
+ }
183
+ return token;
204
184
  };
185
+ exports.fetchOrValidateAccessToken = fetchOrValidateAccessToken;
205
186
  const getVersionInfo = (version) => {
206
- const regex = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?/;
207
- const match = version.match(regex);
208
- const versionInfo = {
209
- major: 0,
210
- minor: 0,
211
- patch: 0
212
- };
213
- versionInfo.major = match && match[1] ? parseInt(match[1], 10) : 0;
214
- versionInfo.minor = match && match[2] ? parseInt(match[2], 10) : 0;
215
- versionInfo.patch = match && match[3] ? parseInt(match[3], 10) : 0;
216
- return versionInfo;
187
+ const regex = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?/;
188
+ const match = version.match(regex);
189
+ const versionInfo = {
190
+ major: 0,
191
+ minor: 0,
192
+ patch: 0,
193
+ };
194
+ versionInfo.major = match && match[1] ? parseInt(match[1], 10) : 0;
195
+ versionInfo.minor = match && match[2] ? parseInt(match[2], 10) : 0;
196
+ versionInfo.patch = match && match[3] ? parseInt(match[3], 10) : 0;
197
+ return versionInfo;
217
198
  };
199
+ exports.getVersionInfo = getVersionInfo;
218
200
  const validatePlaywrightVersion = () => {
219
- const minimumSupportedVersion = import_constants.Constants.MinimumSupportedPlaywrightVersion;
220
- const installedVersion = (0, import_getPlaywrightVersion.getPlaywrightVersion)();
221
- const minimumSupportedVersionInfo = getVersionInfo(minimumSupportedVersion);
222
- const installedVersionInfo = getVersionInfo(installedVersion);
223
- const isInstalledVersionGreater = installedVersionInfo.major > minimumSupportedVersionInfo.major || installedVersionInfo.major === minimumSupportedVersionInfo.major && installedVersionInfo.minor >= minimumSupportedVersionInfo.minor;
224
- if (!isInstalledVersionGreater) {
225
- exitWithFailureMessage(import_messages.ServiceErrorMessageConstants.INVALID_PLAYWRIGHT_VERSION_ERROR);
226
- }
201
+ const minimumSupportedVersion = constants_js_1.Constants.MinimumSupportedPlaywrightVersion;
202
+ const installedVersion = (0, getPlaywrightVersion_js_1.getPlaywrightVersion)();
203
+ const minimumSupportedVersionInfo = (0, exports.getVersionInfo)(minimumSupportedVersion);
204
+ const installedVersionInfo = (0, exports.getVersionInfo)(installedVersion);
205
+ const isInstalledVersionGreater = installedVersionInfo.major > minimumSupportedVersionInfo.major ||
206
+ (installedVersionInfo.major === minimumSupportedVersionInfo.major &&
207
+ installedVersionInfo.minor >= minimumSupportedVersionInfo.minor);
208
+ if (!isInstalledVersionGreater) {
209
+ (0, exports.exitWithFailureMessage)(messages_js_1.ServiceErrorMessageConstants.INVALID_PLAYWRIGHT_VERSION_ERROR);
210
+ }
227
211
  };
212
+ exports.validatePlaywrightVersion = validatePlaywrightVersion;
228
213
  const getTestRunConfig = (config) => {
229
- const maxWorkers = config.workers || config.metadata.actualWorkers;
230
- const frameWorkVersion = config.version;
231
- const testRunConfig = {
232
- framework: {
233
- name: import_constants.RunConfigConstants.TEST_FRAMEWORK_NAME,
234
- version: frameWorkVersion,
235
- runnerName: import_constants.RunConfigConstants.TEST_FRAMEWORK_RUNNERNAME
236
- },
237
- sdkLanguage: import_constants.RunConfigConstants.TEST_SDK_LANGUAGE,
238
- maxWorkers
239
- };
240
- return testRunConfig;
214
+ const maxWorkers = config.workers || config.metadata.actualWorkers;
215
+ const frameWorkVersion = config.version;
216
+ const testRunConfig = {
217
+ framework: {
218
+ name: constants_js_1.RunConfigConstants.TEST_FRAMEWORK_NAME,
219
+ version: frameWorkVersion,
220
+ runnerName: constants_js_1.RunConfigConstants.TEST_FRAMEWORK_RUNNERNAME,
221
+ },
222
+ sdkLanguage: constants_js_1.RunConfigConstants.TEST_SDK_LANGUAGE,
223
+ maxWorkers: maxWorkers,
224
+ };
225
+ return testRunConfig;
241
226
  };
227
+ exports.getTestRunConfig = getTestRunConfig;
242
228
  function getTestRunApiUrl() {
243
- const result = populateValuesFromServiceUrl();
244
- const runId = import_node_process.default.env[import_constants.InternalEnvironmentVariables.MPT_SERVICE_RUN_ID];
245
- if (!result?.region || !result?.domain || !result?.accountId) {
246
- exitWithFailureMessage(import_messages.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
247
- }
248
- const baseUrl = `https://${result?.region}.${import_constants.UrlConstants.ReportingApiSubdomain}.${result?.domain}/${import_constants.UrlConstants.PlaywrightWorkspacesPath}/${result?.accountId}/${import_constants.UrlConstants.TestRunsPath}`;
249
- const url = runId ? `${baseUrl}/${runId}` : baseUrl;
250
- return `${url}?api-version=${import_constants.Constants.LatestAPIVersion}`;
229
+ const result = (0, exports.populateValuesFromServiceUrl)();
230
+ const runId = node_process_1.default.env[constants_js_1.InternalEnvironmentVariables.MPT_SERVICE_RUN_ID];
231
+ if (!result?.region || !result?.domain || !result?.accountId) {
232
+ (0, exports.exitWithFailureMessage)(messages_js_1.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
233
+ }
234
+ const baseUrl = `https://${result?.region}.${constants_js_1.UrlConstants.ReportingApiSubdomain}.${result?.domain}/${constants_js_1.UrlConstants.PlaywrightWorkspacesPath}/${result?.accountId}/${constants_js_1.UrlConstants.TestRunsPath}`;
235
+ const url = runId ? `${baseUrl}/${runId}` : baseUrl;
236
+ return `${url}?api-version=${constants_js_1.Constants.LatestAPIVersion}`;
251
237
  }
252
238
  function isNullOrEmpty(str) {
253
- return !str || str.trim() === "";
239
+ return !str || str.trim() === "";
254
240
  }
255
241
  async function runCommand(command) {
256
- return new Promise((resolve, reject) => {
257
- (0, import_child_process.exec)(command, (error, stdout, stderr) => {
258
- if (error) {
259
- reject(error);
260
- return;
261
- }
262
- if (stderr) {
263
- reject(new Error(stderr));
264
- return;
265
- }
266
- resolve(stdout.trim());
242
+ return new Promise((resolve, reject) => {
243
+ (0, child_process_1.exec)(command, (error, stdout, stderr) => {
244
+ if (error) {
245
+ reject(error);
246
+ return;
247
+ }
248
+ if (stderr) {
249
+ reject(new Error(stderr));
250
+ return;
251
+ }
252
+ resolve(stdout.trim());
253
+ });
267
254
  });
268
- });
269
255
  }
270
256
  async function getRunName(ciInfo) {
271
- if (ciInfo.providerName === import_cIInfoProvider.CI_PROVIDERS.GITHUB && import_node_process.default.env["GITHUB_EVENT_NAME"] === "pull_request") {
272
- const prNumber = `${import_node_process.default.env["GITHUB_REF_NAME"]?.split("/")[0]}`;
273
- const prLink = `${import_node_process.default.env["GITHUB_REPOSITORY"]}/pull/${prNumber}`;
274
- return `PR# ${prNumber} on Repo: ${import_node_process.default.env["GITHUB_REPOSITORY"]} (${prLink})`;
275
- }
276
- try {
277
- const gitVersion = await runCommand(import_constants.GitHubActionsConstants.GIT_VERSION_COMMAND);
278
- if (isNullOrEmpty(gitVersion)) {
279
- throw new Error("Git is not installed on the machine");
280
- }
281
- const isInsideWorkTree = await runCommand(import_constants.GitHubActionsConstants.GIT_REV_PARSE);
282
- if (isInsideWorkTree !== "true") {
283
- throw new Error("Not inside a git repository");
284
- }
285
- const gitCommitMessage = await runCommand(import_constants.GitHubActionsConstants.GIT_COMMIT_MESSAGE_COMMAND);
286
- return gitCommitMessage;
287
- } catch (err) {
288
- import_logger.coreLogger.error(`Error in getting git commit message: ${err}.`);
289
- return "";
290
- }
257
+ if (ciInfo.providerName === cIInfoProvider_js_1.CI_PROVIDERS.GITHUB &&
258
+ node_process_1.default.env["GITHUB_EVENT_NAME"] === "pull_request") {
259
+ const prNumber = `${node_process_1.default.env["GITHUB_REF_NAME"]?.split("/")[0]}`;
260
+ const prLink = `${node_process_1.default.env["GITHUB_REPOSITORY"]}/pull/${prNumber}`;
261
+ return `PR# ${prNumber} on Repo: ${node_process_1.default.env["GITHUB_REPOSITORY"]} (${prLink})`;
262
+ }
263
+ try {
264
+ const gitVersion = await runCommand(constants_js_1.GitHubActionsConstants.GIT_VERSION_COMMAND);
265
+ if (isNullOrEmpty(gitVersion)) {
266
+ throw new Error("Git is not installed on the machine");
267
+ }
268
+ const isInsideWorkTree = await runCommand(constants_js_1.GitHubActionsConstants.GIT_REV_PARSE);
269
+ if (isInsideWorkTree !== "true") {
270
+ throw new Error("Not inside a git repository");
271
+ }
272
+ const gitCommitMessage = await runCommand(constants_js_1.GitHubActionsConstants.GIT_COMMIT_MESSAGE_COMMAND);
273
+ return gitCommitMessage;
274
+ }
275
+ catch (err) {
276
+ logger_js_1.coreLogger.error(`Error in getting git commit message: ${err}.`);
277
+ return "";
278
+ }
291
279
  }
292
280
  function extractErrorMessage(responseBody) {
293
- if (!responseBody) {
294
- return "";
295
- }
296
- try {
297
- const errorResponse = JSON.parse(responseBody);
298
- if (errorResponse.error && errorResponse.error.message) {
299
- return errorResponse.error.message;
300
- }
301
- return responseBody;
302
- } catch (e) {
303
- return responseBody;
304
- }
281
+ if (!responseBody) {
282
+ return "";
283
+ }
284
+ try {
285
+ const errorResponse = JSON.parse(responseBody);
286
+ if (errorResponse.error && errorResponse.error.message) {
287
+ return errorResponse.error.message;
288
+ }
289
+ return responseBody;
290
+ }
291
+ catch (e) {
292
+ return responseBody;
293
+ }
305
294
  }
306
295
  function getWorkspaceMetaDataApiUrl() {
307
- const result = populateValuesFromServiceUrl();
308
- if (!result?.region || !result?.domain || !result?.accountId) {
309
- exitWithFailureMessage(import_messages.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
310
- }
311
- const baseUrl = `https://${result?.region}.${import_constants.UrlConstants.ApiSubdomain}.${result?.domain}/${import_constants.UrlConstants.PlaywrightWorkspacesPath}/${result?.accountId}`;
312
- return `${baseUrl}?api-version=${import_constants.Constants.LatestAPIVersion}`;
296
+ const result = (0, exports.populateValuesFromServiceUrl)();
297
+ if (!result?.region || !result?.domain || !result?.accountId) {
298
+ (0, exports.exitWithFailureMessage)(messages_js_1.ServiceErrorMessageConstants.NO_SERVICE_URL_ERROR);
299
+ }
300
+ const baseUrl = `https://${result?.region}.${constants_js_1.UrlConstants.ApiSubdomain}.${result?.domain}/${constants_js_1.UrlConstants.PlaywrightWorkspacesPath}/${result?.accountId}`;
301
+ return `${baseUrl}?api-version=${constants_js_1.Constants.LatestAPIVersion}`;
313
302
  }
314
303
  function getHtmlReporterOutputFolder(config) {
315
- const defaultFolder = "playwright-report";
316
- if (!config?.reporter) {
304
+ const defaultFolder = "playwright-report";
305
+ if (!config?.reporter) {
306
+ return defaultFolder;
307
+ }
308
+ for (const reporter of config.reporter) {
309
+ if (Array.isArray(reporter)) {
310
+ const [reporterName, options] = reporter;
311
+ if (reporterName === "html" && options && typeof options === "object") {
312
+ return options.outputFolder || defaultFolder;
313
+ }
314
+ }
315
+ else if (typeof reporter === "string" && reporter === "html") {
316
+ return defaultFolder;
317
+ }
318
+ }
317
319
  return defaultFolder;
318
- }
319
- for (const reporter of config.reporter) {
320
- if (Array.isArray(reporter)) {
321
- const [reporterName, options] = reporter;
322
- if (reporterName === "html" && options && typeof options === "object") {
323
- return options.outputFolder || defaultFolder;
324
- }
325
- } else if (typeof reporter === "string" && reporter === "html") {
326
- return defaultFolder;
327
- }
328
- }
329
- return defaultFolder;
330
320
  }
331
321
  function getContentType(filePath) {
332
- const ext = filePath.toLowerCase().split(".").pop();
333
- const contentTypes = {
334
- html: "text/html",
335
- css: "text/css",
336
- js: "application/javascript",
337
- json: "application/json",
338
- png: "image/png",
339
- jpg: "image/jpeg",
340
- jpeg: "image/jpeg",
341
- svg: "image/svg+xml",
342
- ico: "image/x-icon",
343
- txt: "text/plain",
344
- ttf: "font/ttf",
345
- woff: "font/woff",
346
- woff2: "font/woff2",
347
- webmanifest: "application/manifest+json",
348
- map: "application/json",
349
- xml: "application/xml",
350
- pdf: "application/pdf",
351
- zip: "application/zip"
352
- };
353
- return contentTypes[ext || ""] || "application/octet-stream";
322
+ const ext = filePath.toLowerCase().split(".").pop();
323
+ const contentTypes = {
324
+ html: "text/html",
325
+ css: "text/css",
326
+ js: "application/javascript",
327
+ json: "application/json",
328
+ png: "image/png",
329
+ jpg: "image/jpeg",
330
+ jpeg: "image/jpeg",
331
+ svg: "image/svg+xml",
332
+ ico: "image/x-icon",
333
+ txt: "text/plain",
334
+ ttf: "font/ttf",
335
+ woff: "font/woff",
336
+ woff2: "font/woff2",
337
+ webmanifest: "application/manifest+json",
338
+ map: "application/json",
339
+ xml: "application/xml",
340
+ pdf: "application/pdf",
341
+ zip: "application/zip",
342
+ };
343
+ return contentTypes[ext || ""] || "application/octet-stream";
354
344
  }
355
345
  function calculateOptimalConcurrency(files) {
356
- const totalFiles = files.length;
357
- const totalSize = files.reduce((sum, f) => sum + f.size, 0);
358
- const avgFileSize = totalSize / totalFiles;
359
- let optimalConcurrency;
360
- if (totalFiles <= 10) {
361
- optimalConcurrency = Math.min(totalFiles, 10);
362
- } else if (avgFileSize < import_constants2.UploadConstants.SMALL_FILE_THRESHOLD) {
363
- optimalConcurrency = Math.min(
364
- import_constants2.UploadConstants.MAX_CONCURRENCY,
365
- Math.max(import_constants2.UploadConstants.BASE_CONCURRENCY, totalFiles / 50)
366
- );
367
- } else if (totalFiles > 1e3) {
368
- optimalConcurrency = Math.min(
369
- import_constants2.UploadConstants.MAX_CONCURRENCY,
370
- import_constants2.UploadConstants.BASE_CONCURRENCY + Math.floor(totalFiles / 200)
371
- );
372
- } else {
373
- optimalConcurrency = Math.min(
374
- import_constants2.UploadConstants.MAX_CONCURRENCY,
375
- import_constants2.UploadConstants.BASE_CONCURRENCY
376
- );
377
- }
378
- return Math.floor(optimalConcurrency);
346
+ const totalFiles = files.length;
347
+ const totalSize = files.reduce((sum, f) => sum + f.size, 0);
348
+ const avgFileSize = totalSize / totalFiles;
349
+ let optimalConcurrency;
350
+ if (totalFiles <= 10) {
351
+ optimalConcurrency = Math.min(totalFiles, 10);
352
+ }
353
+ else if (avgFileSize < constants_js_1.UploadConstants.SMALL_FILE_THRESHOLD) {
354
+ optimalConcurrency = Math.min(constants_js_1.UploadConstants.MAX_CONCURRENCY, Math.max(constants_js_1.UploadConstants.BASE_CONCURRENCY, totalFiles / 50));
355
+ }
356
+ else if (totalFiles > 1000) {
357
+ optimalConcurrency = Math.min(constants_js_1.UploadConstants.MAX_CONCURRENCY, constants_js_1.UploadConstants.BASE_CONCURRENCY + Math.floor(totalFiles / 200));
358
+ }
359
+ else {
360
+ optimalConcurrency = Math.min(constants_js_1.UploadConstants.MAX_CONCURRENCY, constants_js_1.UploadConstants.BASE_CONCURRENCY);
361
+ }
362
+ return Math.floor(optimalConcurrency);
379
363
  }
380
364
  function collectAllFiles(folderPath, basePath, runIdFolderPrefix) {
381
- const files = [];
382
- const stack = [folderPath];
383
- while (stack.length > 0) {
384
- const currentPath = stack.pop();
385
- try {
386
- const items = (0, import_fs.readdirSync)(currentPath);
387
- for (const item of items) {
388
- const itemPath = (0, import_path.join)(currentPath, item);
389
- const stats = (0, import_fs.statSync)(itemPath);
390
- if (stats.isDirectory()) {
391
- stack.push(itemPath);
392
- } else {
393
- let relativePath = (0, import_path.relative)(basePath, itemPath).split("\\").join("/");
394
- if (runIdFolderPrefix) {
395
- relativePath = `${runIdFolderPrefix}/${relativePath}`;
396
- }
397
- files.push({
398
- fullPath: itemPath,
399
- relativePath,
400
- size: stats.size,
401
- contentType: getContentType(itemPath)
402
- });
365
+ const files = [];
366
+ const stack = [folderPath];
367
+ while (stack.length > 0) {
368
+ const currentPath = stack.pop();
369
+ try {
370
+ const items = (0, fs_1.readdirSync)(currentPath);
371
+ for (const item of items) {
372
+ const itemPath = (0, path_1.join)(currentPath, item);
373
+ const stats = (0, fs_1.statSync)(itemPath);
374
+ if (stats.isDirectory()) {
375
+ stack.push(itemPath);
376
+ }
377
+ else {
378
+ let relativePath = (0, path_1.relative)(basePath, itemPath).split("\\").join("/");
379
+ if (runIdFolderPrefix) {
380
+ relativePath = `${runIdFolderPrefix}/${relativePath}`;
381
+ }
382
+ files.push({
383
+ fullPath: itemPath,
384
+ relativePath,
385
+ size: stats.size,
386
+ contentType: getContentType(itemPath),
387
+ });
388
+ }
389
+ }
390
+ }
391
+ catch (error) {
392
+ continue;
403
393
  }
404
- }
405
- } catch (error) {
406
- continue;
407
394
  }
408
- }
409
- return files;
395
+ return files;
410
396
  }
411
397
  function resolveTenantDomain(tenantId, tenants) {
412
- if (!tenantId || tenants.length === 0) {
413
- return void 0;
414
- }
415
- const matchingTenant = tenants.find((t) => t.tenantId === tenantId);
416
- import_logger.coreLogger.info(
417
- `Resolved tenant domain: ${JSON.stringify(matchingTenant?.defaultDomain)} for tenant ID: ${tenantId}`
418
- );
419
- return matchingTenant?.defaultDomain;
398
+ if (!tenantId || tenants.length === 0) {
399
+ return undefined;
400
+ }
401
+ const matchingTenant = tenants.find((t) => t.tenantId === tenantId);
402
+ logger_js_1.coreLogger.info(`Resolved tenant domain: ${JSON.stringify(matchingTenant?.defaultDomain)} for tenant ID: ${tenantId}`);
403
+ return matchingTenant?.defaultDomain;
420
404
  }
421
405
  function getPortalTestRunUrl(workspaceMetadata, tenantDomain) {
422
- const { subscriptionId, resourceId, name } = workspaceMetadata ?? {};
423
- if (!subscriptionId || !resourceId || !name) {
424
- throw new Error(
425
- "Missing required workspace metadata: subscriptionId, resourceId, and name are required"
426
- );
427
- }
428
- const resourceIdParts = resourceId.split("/");
429
- const resourceGroupIndex = resourceIdParts.findIndex(
430
- (part) => part.toLowerCase() === import_constants.UrlConstants.ResourceGroupsPath
431
- );
432
- if (resourceGroupIndex === -1 || resourceGroupIndex + 1 >= resourceIdParts.length) {
433
- throw new Error("Invalid resourceId format: could not extract resource group name");
434
- }
435
- const resourceGroupName = resourceIdParts[resourceGroupIndex + 1];
436
- const tenantFragment = tenantDomain ? `#@${tenantDomain}` : "#";
437
- return `${import_constants.UrlConstants.AzurePortalBaseUrl}/${tenantFragment}${import_constants.UrlConstants.ResourcePath}${import_constants.UrlConstants.SubscriptionsPath}/${encodeURIComponent(subscriptionId)}${import_constants.UrlConstants.ResourceGroupsUrlPath}/${encodeURIComponent(resourceGroupName)}${import_constants.UrlConstants.ProvidersPath}/${import_constants.UrlConstants.LoadTestServiceProvider}/${import_constants.UrlConstants.PlaywrightWorkspacesResourceType}/${encodeURIComponent(name)}/${import_constants.UrlConstants.TestRunsRoute}`;
406
+ const { subscriptionId, resourceId, name } = workspaceMetadata ?? {};
407
+ if (!subscriptionId || !resourceId || !name) {
408
+ throw new Error("Missing required workspace metadata: subscriptionId, resourceId, and name are required");
409
+ }
410
+ // Extract resource group from resourceId
411
+ const resourceIdParts = resourceId.split("/");
412
+ const resourceGroupIndex = resourceIdParts.findIndex((part) => part.toLowerCase() === constants_js_1.UrlConstants.ResourceGroupsPath);
413
+ if (resourceGroupIndex === -1 || resourceGroupIndex + 1 >= resourceIdParts.length) {
414
+ throw new Error("Invalid resourceId format: could not extract resource group name");
415
+ }
416
+ const resourceGroupName = resourceIdParts[resourceGroupIndex + 1];
417
+ const tenantFragment = tenantDomain ? `#@${tenantDomain}` : "#";
418
+ return `${constants_js_1.UrlConstants.AzurePortalBaseUrl}/${tenantFragment}${constants_js_1.UrlConstants.ResourcePath}${constants_js_1.UrlConstants.SubscriptionsPath}/${encodeURIComponent(subscriptionId)}${constants_js_1.UrlConstants.ResourceGroupsUrlPath}/${encodeURIComponent(resourceGroupName)}${constants_js_1.UrlConstants.ProvidersPath}/${constants_js_1.UrlConstants.LoadTestServiceProvider}/${constants_js_1.UrlConstants.PlaywrightWorkspacesResourceType}/${encodeURIComponent(name)}/${constants_js_1.UrlConstants.TestRunsRoute}`;
438
419
  }
439
420
  const getStorageAccountNameFromUri = (storageUri) => {
440
- try {
441
- if (!storageUri || typeof storageUri !== "string") {
442
- return null;
421
+ try {
422
+ if (!storageUri || typeof storageUri !== "string") {
423
+ return null;
424
+ }
425
+ const url = new URL(storageUri);
426
+ const hostname = url.hostname;
427
+ // Extract storage account name from hostname pattern: {accountname}.blob.core.windows.net
428
+ const match = hostname.match(/^([^.]+)\.blob\.core\.windows\.net$/i);
429
+ if (match && match[1]) {
430
+ return match[1];
431
+ }
432
+ return null;
443
433
  }
444
- const url = new URL(storageUri);
445
- const hostname = url.hostname;
446
- const match = hostname.match(/^([^.]+)\.blob\.core\.windows\.net$/i);
447
- if (match && match[1]) {
448
- return match[1];
434
+ catch (error) {
435
+ console.warn("Failed to extract storage account name from URI:", storageUri, error);
436
+ return null;
449
437
  }
450
- return null;
451
- } catch (error) {
452
- console.warn("Failed to extract storage account name from URI:", storageUri, error);
453
- return null;
454
- }
455
438
  };
456
- // Annotate the CommonJS export names for ESM import in node:
457
- 0 && (module.exports = {
458
- ValidateRunID,
459
- calculateOptimalConcurrency,
460
- collectAllFiles,
461
- exitWithFailureMessage,
462
- extractErrorMessage,
463
- fetchOrValidateAccessToken,
464
- getAccessToken,
465
- getAndSetRunId,
466
- getContentType,
467
- getHtmlReporterOutputFolder,
468
- getPackageVersion,
469
- getPlaywrightVersion,
470
- getPortalTestRunUrl,
471
- getRunName,
472
- getServiceBaseURL,
473
- getServiceWSEndpoint,
474
- getStorageAccountNameFromUri,
475
- getTestRunApiUrl,
476
- getTestRunConfig,
477
- getVersionInfo,
478
- getWorkspaceMetaDataApiUrl,
479
- isNullOrEmpty,
480
- isValidGuid,
481
- parseJwt,
482
- populateValuesFromServiceUrl,
483
- resolveTenantDomain,
484
- throwErrorWithFailureMessage,
485
- validateMptPAT,
486
- validatePlaywrightVersion,
487
- validateServiceUrl,
488
- warnIfAccessTokenCloseToExpiry
489
- });
439
+ exports.getStorageAccountNameFromUri = getStorageAccountNameFromUri;
440
+ //# sourceMappingURL=utils.js.map