@lambdatest/smartui-cli 4.1.45 → 4.1.47

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 (2) hide show
  1. package/dist/index.cjs +158 -13
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -2681,7 +2681,9 @@ var env_default = () => {
2681
2681
  HTTPS_PROXY,
2682
2682
  SMARTUI_HTTP_PROXY,
2683
2683
  SMARTUI_HTTPS_PROXY,
2684
- GITHUB_ACTIONS,
2684
+ GIT_URL,
2685
+ BASIC_AUTH_USERNAME,
2686
+ BASIC_AUTH_PASSWORD,
2685
2687
  FIGMA_TOKEN,
2686
2688
  LT_USERNAME,
2687
2689
  LT_ACCESS_KEY,
@@ -2708,7 +2710,9 @@ var env_default = () => {
2708
2710
  HTTPS_PROXY,
2709
2711
  SMARTUI_HTTP_PROXY,
2710
2712
  SMARTUI_HTTPS_PROXY,
2711
- GITHUB_ACTIONS,
2713
+ GIT_URL,
2714
+ BASIC_AUTH_USERNAME,
2715
+ BASIC_AUTH_PASSWORD,
2712
2716
  FIGMA_TOKEN,
2713
2717
  LT_USERNAME,
2714
2718
  LT_ACCESS_KEY,
@@ -2725,7 +2729,8 @@ var env_default = () => {
2725
2729
  SMARTUI_SSE_URL,
2726
2730
  LT_SDK_SKIP_EXECUTION_LOGS: LT_SDK_SKIP_EXECUTION_LOGS === "true",
2727
2731
  MAX_CONCURRENT_PROCESSING: MAX_CONCURRENT_PROCESSING ? parseInt(MAX_CONCURRENT_PROCESSING, 10) : 0,
2728
- DO_NOT_USE_USER_AGENT: DO_NOT_USE_USER_AGENT === "true"
2732
+ DO_NOT_USE_USER_AGENT: DO_NOT_USE_USER_AGENT === "true",
2733
+ CAPTURE_RENDERING_ERRORS: process.env.CAPTURE_RENDERING_ERRORS === "true"
2729
2734
  };
2730
2735
  };
2731
2736
  var logContext = {};
@@ -2820,7 +2825,7 @@ var authExec_default = (ctx) => {
2820
2825
  };
2821
2826
 
2822
2827
  // package.json
2823
- var version = "4.1.45";
2828
+ var version = "4.1.47";
2824
2829
  var package_default = {
2825
2830
  name: "@lambdatest/smartui-cli",
2826
2831
  version,
@@ -3291,7 +3296,7 @@ var httpClient = class {
3291
3296
  data: requestData
3292
3297
  }, ctx.log);
3293
3298
  }
3294
- uploadScreenshot({ id: buildId, name: buildName, baseline }, ssPath, ssName, browserName, viewport, url = "", log2) {
3299
+ uploadScreenshot({ id: buildId, name: buildName, baseline }, ssPath, ssName, browserName, viewport, url = "", log2, discoveryErrors, ctx) {
3295
3300
  browserName = browserName === constants_default.SAFARI ? constants_default.WEBKIT : browserName;
3296
3301
  const file = fs6__default.default.readFileSync(ssPath);
3297
3302
  const form = new FormData__default.default();
@@ -3303,6 +3308,9 @@ var httpClient = class {
3303
3308
  form.append("screenshotName", ssName);
3304
3309
  form.append("baseline", baseline.toString());
3305
3310
  form.append("pageUrl", url);
3311
+ if ((ctx == null ? void 0 : ctx.env.CAPTURE_RENDERING_ERRORS) && discoveryErrors) {
3312
+ form.append("discoveryErrors", JSON.stringify(discoveryErrors));
3313
+ }
3306
3314
  return this.axiosInstance.request({
3307
3315
  url: `/screenshot`,
3308
3316
  method: "POST",
@@ -3361,6 +3369,19 @@ var httpClient = class {
3361
3369
  }
3362
3370
  }, ctx.log);
3363
3371
  }
3372
+ getS3PreSignedURLForCaps(ctx, capsBuildId, capsProjectToken) {
3373
+ return this.request({
3374
+ url: `/loguploadurl`,
3375
+ method: "POST",
3376
+ headers: {
3377
+ "Content-Type": "application/json",
3378
+ projectToken: capsProjectToken !== "" ? capsProjectToken : this.projectToken
3379
+ },
3380
+ data: {
3381
+ buildId: capsBuildId
3382
+ }
3383
+ }, ctx.log);
3384
+ }
3364
3385
  getS3PresignedURLForSnapshotUpload(ctx, snapshotName, snapshotUuid) {
3365
3386
  return this.request({
3366
3387
  url: `/snapshotuploadurl`,
@@ -3419,7 +3440,7 @@ var httpClient = class {
3419
3440
  }, ctx.log);
3420
3441
  }
3421
3442
  uploadLogs(ctx, uploadURL) {
3422
- const fileStream = fs6__default.default.createReadStream(constants_default.LOG_FILE_PATH);
3443
+ const logContent = fs6__default.default.readFileSync(constants_default.LOG_FILE_PATH);
3423
3444
  const { size } = fs6__default.default.statSync(constants_default.LOG_FILE_PATH);
3424
3445
  return this.request({
3425
3446
  url: uploadURL,
@@ -3428,7 +3449,7 @@ var httpClient = class {
3428
3449
  "Content-Type": "text/plain",
3429
3450
  "Content-Length": size
3430
3451
  },
3431
- data: fileStream,
3452
+ data: logContent,
3432
3453
  maxBodyLength: Infinity,
3433
3454
  // prevent axios from limiting the body size
3434
3455
  maxContentLength: Infinity
@@ -3447,6 +3468,22 @@ var httpClient = class {
3447
3468
  }
3448
3469
  }, ctx.log);
3449
3470
  }
3471
+ sendCliLogsToLSRSForCaps(ctx, capsBuildId, capsProjectToken) {
3472
+ const logContent = fs6__default.default.readFileSync(constants_default.LOG_FILE_PATH, "utf-8");
3473
+ return this.request({
3474
+ url: `/upload/logs`,
3475
+ method: "POST",
3476
+ headers: {
3477
+ "Content-Type": "application/json",
3478
+ projectToken: capsProjectToken !== "" ? capsProjectToken : this.projectToken
3479
+ },
3480
+ data: {
3481
+ buildId: capsBuildId,
3482
+ logContent,
3483
+ skipLogging: true
3484
+ }
3485
+ }, ctx.log);
3486
+ }
3450
3487
  uploadSnapshotToS3(ctx, uploadURL, snapshot) {
3451
3488
  return this.request({
3452
3489
  url: uploadURL,
@@ -3692,6 +3729,12 @@ var ctx_default = (options) => {
3692
3729
  orientation: config.mobile.orientation || constants_default.MOBILE_ORIENTATION_PORTRAIT
3693
3730
  };
3694
3731
  }
3732
+ if (env.BASIC_AUTH_USERNAME && env.BASIC_AUTH_PASSWORD) {
3733
+ basicAuthObj = {
3734
+ "username": env.BASIC_AUTH_USERNAME,
3735
+ "password": env.BASIC_AUTH_PASSWORD
3736
+ };
3737
+ }
3695
3738
  if (config.basicAuthorization) {
3696
3739
  basicAuthObj = config.basicAuthorization;
3697
3740
  }
@@ -3788,7 +3831,7 @@ var ctx_default = (options) => {
3788
3831
  fetchResultsFileName: fetchResultsFileObj,
3789
3832
  baselineBranch: options.baselineBranch || "",
3790
3833
  baselineBuild: options.baselineBuild || "",
3791
- githubURL: options.githubURL || "",
3834
+ githubURL: options.gitURL || options.githubURL || "",
3792
3835
  showRenderErrors: options.showRenderErrors ? true : false,
3793
3836
  userName: options.userName || "",
3794
3837
  accessKey: options.accessKey || ""
@@ -3860,6 +3903,9 @@ var git_default = (ctx) => {
3860
3903
  if (ctx.options.githubURL && ctx.options.githubURL.startsWith("https://")) {
3861
3904
  githubURL = ctx.options.githubURL;
3862
3905
  }
3906
+ if (ctx.options.gitURL && ctx.options.gitURL.startsWith("https://")) {
3907
+ githubURL = ctx.options.gitURL;
3908
+ }
3863
3909
  if (ctx.env.SMARTUI_GIT_INFO_FILEPATH) {
3864
3910
  let gitInfo = JSON.parse(fs6__default.default.readFileSync(ctx.env.SMARTUI_GIT_INFO_FILEPATH, "utf-8"));
3865
3911
  if (ctx.options.markBaseline) {
@@ -3871,7 +3917,7 @@ var git_default = (ctx) => {
3871
3917
  commitId: gitInfo.commit_id.slice(0, 6) || "",
3872
3918
  commitMessage: gitInfo.commit_body || "",
3873
3919
  commitAuthor: gitInfo.commit_author || "",
3874
- githubURL: githubURL ? githubURL : ctx.env.GITHUB_ACTIONS ? `${constants_default.GITHUB_API_HOST}/repos/${process.env.GITHUB_REPOSITORY}/statuses/${gitInfo.commit_id}` : "",
3920
+ githubURL: githubURL ? githubURL : ctx.env.GIT_URL ? ctx.env.GIT_URL : `${constants_default.GITHUB_API_HOST}/repos/${process.env.GITHUB_REPOSITORY}/statuses/${gitInfo.commit_id}`,
3875
3921
  baselineBranch: ctx.options.baselineBranch || ctx.env.BASELINE_BRANCH || ""
3876
3922
  };
3877
3923
  } else {
@@ -3891,7 +3937,7 @@ var git_default = (ctx) => {
3891
3937
  commitId: res[0] || "",
3892
3938
  commitMessage: res[2] || "",
3893
3939
  commitAuthor: res[7] || "",
3894
- githubURL: githubURL ? githubURL : ctx.env.GITHUB_ACTIONS ? `${constants_default.GITHUB_API_HOST}/repos/${process.env.GITHUB_REPOSITORY}/statuses/${res[1]}` : "",
3940
+ githubURL: githubURL ? githubURL : ctx.env.GIT_URL ? ctx.env.GIT_URL : `${constants_default.GITHUB_API_HOST}/repos/${process.env.GITHUB_REPOSITORY}/statuses/${res[1]}`,
3895
3941
  baselineBranch: ctx.options.baselineBranch || ctx.env.BASELINE_BRANCH || ""
3896
3942
  };
3897
3943
  }
@@ -3906,6 +3952,9 @@ function setNonGitInfo(ctx) {
3906
3952
  if (ctx.options.githubURL && ctx.options.githubURL.startsWith("https://")) {
3907
3953
  githubURL = ctx.options.githubURL;
3908
3954
  }
3955
+ if (ctx.options.gitURL && ctx.options.gitURL.startsWith("https://")) {
3956
+ githubURL = ctx.options.gitURL;
3957
+ }
3909
3958
  ctx.git = {
3910
3959
  branch,
3911
3960
  commitId: "-",
@@ -4166,6 +4215,7 @@ var finalizeBuild_default = (ctx) => {
4166
4215
  clearInterval(pingIntervalId);
4167
4216
  ctx2.log.debug("Ping polling stopped immediately from Finalize Build");
4168
4217
  }
4218
+ let uploadedCliLogsBuildIds = /* @__PURE__ */ new Set();
4169
4219
  for (const [sessionId, capabilities] of ctx2.sessionCapabilitiesMap.entries()) {
4170
4220
  try {
4171
4221
  const buildId = (capabilities == null ? void 0 : capabilities.buildId) || "";
@@ -4188,6 +4238,18 @@ var finalizeBuild_default = (ctx) => {
4188
4238
  }
4189
4239
  ctx2.log.debug(`Capabilities for sessionId ${sessionId}: ${JSON.stringify(capabilities)}`);
4190
4240
  if (buildId && projectToken) {
4241
+ if (ctx2.isSnapshotCaptured && !uploadedCliLogsBuildIds.has(buildId)) {
4242
+ let uploadCLILogsToS3 = ctx2.config.useLambdaInternal || uploadDomToS3ViaEnv2;
4243
+ if (!uploadCLILogsToS3) {
4244
+ ctx2.log.debug(`Log file to be uploaded`);
4245
+ let resp = yield ctx2.client.getS3PreSignedURLForCaps(ctx2, buildId, projectToken);
4246
+ yield ctx2.client.uploadLogs(ctx2, resp.data.url);
4247
+ } else {
4248
+ ctx2.log.debug(`Log file to be uploaded via LSRS`);
4249
+ ctx2.client.sendCliLogsToLSRSForCaps(ctx2, buildId, projectToken);
4250
+ }
4251
+ uploadedCliLogsBuildIds.add(buildId);
4252
+ }
4191
4253
  yield ctx2.client.finalizeBuildForCapsWithToken(buildId, totalSnapshots, projectToken, ctx2.log);
4192
4254
  if (ctx2.autoTunnelStarted) {
4193
4255
  yield startPollingForTunnel(ctx2, buildId, false, projectToken, capabilities == null ? void 0 : capabilities.buildName);
@@ -5869,6 +5931,15 @@ function captureScreenshotsForConfig(ctx, browsers, urlConfig, browserName, rend
5869
5931
  let afterNavigationScript = execute == null ? void 0 : execute.afterNavigation;
5870
5932
  let beforeSnapshotScript = execute == null ? void 0 : execute.beforeSnapshot;
5871
5933
  let waitUntilEvent = pageEvent || process.env.SMARTUI_PAGE_WAIT_UNTIL_EVENT || "load";
5934
+ let discoveryErrors = {
5935
+ name: "",
5936
+ url: "",
5937
+ timestamp: "",
5938
+ snapshotUUID: "",
5939
+ browsers: {}
5940
+ };
5941
+ let globalViewport = "";
5942
+ let globalBrowser = constants_default.CHROME;
5872
5943
  let pageOptions = { waitUntil: waitUntilEvent, timeout: ctx.config.waitForPageRender || constants_default.DEFAULT_PAGE_LOAD_TIMEOUT };
5873
5944
  ctx.log.debug(`url: ${url} pageOptions: ${JSON.stringify(pageOptions)}`);
5874
5945
  let ssId = name.toLowerCase().replace(/\s/g, "_");
@@ -5993,17 +6064,85 @@ function captureScreenshotsForConfig(ctx, browsers, urlConfig, browserName, rend
5993
6064
  if (Object.keys(headersObject).length > 0) {
5994
6065
  yield page.setExtraHTTPHeaders(headersObject);
5995
6066
  }
6067
+ if (ctx.env.CAPTURE_RENDERING_ERRORS) {
6068
+ yield page.route("**/*", (route, request) => __async(this, null, function* () {
6069
+ var _a;
6070
+ const requestUrl = request.url();
6071
+ const requestHostname = new URL(requestUrl).hostname;
6072
+ let requestOptions = {
6073
+ timeout: 3e4,
6074
+ headers: __spreadValues(__spreadValues({}, yield request.allHeaders()), constants_default.REQUEST_HEADERS)
6075
+ };
6076
+ try {
6077
+ let response, body;
6078
+ response = yield page.request.fetch(request, requestOptions);
6079
+ body = yield response.body();
6080
+ let data = {
6081
+ statusCode: `${response.status()}`,
6082
+ url: requestUrl
6083
+ };
6084
+ if (response.status() >= 400 && response.status() < 600 && response.status() !== 0) {
6085
+ if (!discoveryErrors.browsers[globalBrowser]) {
6086
+ discoveryErrors.browsers[globalBrowser] = {};
6087
+ }
6088
+ if (discoveryErrors.browsers[globalBrowser] && !discoveryErrors.browsers[globalBrowser][globalViewport]) {
6089
+ discoveryErrors.browsers[globalBrowser][globalViewport] = [];
6090
+ }
6091
+ if (discoveryErrors.browsers[globalBrowser]) {
6092
+ (_a = discoveryErrors.browsers[globalBrowser][globalViewport]) == null ? void 0 : _a.push(data);
6093
+ }
6094
+ ctx.build.hasDiscoveryError = true;
6095
+ }
6096
+ route.fulfill({
6097
+ status: response.status(),
6098
+ headers: response.headers(),
6099
+ body
6100
+ });
6101
+ } catch (error) {
6102
+ ctx.log.debug(`Handling request ${requestUrl}
6103
+ - aborted due to ${error.message}`);
6104
+ route.abort();
6105
+ }
6106
+ }));
6107
+ }
6108
+ if (renderViewports && renderViewports.length > 0) {
6109
+ const first = renderViewports[0];
6110
+ globalViewport = first.viewportString;
6111
+ globalBrowser = browserName;
6112
+ if (globalViewport.toLowerCase().includes("iphone") || globalViewport.toLowerCase().includes("ipad")) {
6113
+ globalBrowser = constants_default.WEBKIT;
6114
+ }
6115
+ }
6116
+ if (browserName == constants_default.SAFARI || (globalViewport.toLowerCase().includes("iphone") || globalViewport.toLowerCase().includes("ipad"))) {
6117
+ globalBrowser = constants_default.WEBKIT;
6118
+ }
5996
6119
  yield page == null ? void 0 : page.goto(url.trim(), pageOptions);
5997
6120
  yield executeDocumentScripts(ctx, page, "afterNavigation", afterNavigationScript);
5998
6121
  for (let { viewport, viewportString, fullPage } of renderViewports) {
6122
+ globalViewport = viewportString;
6123
+ globalBrowser = browserName;
6124
+ ctx.log.debug(`globalViewport : ${globalViewport}`);
6125
+ if (browserName == constants_default.SAFARI || (globalViewport.toLowerCase().includes("iphone") || globalViewport.toLowerCase().includes("ipad"))) {
6126
+ globalBrowser = constants_default.WEBKIT;
6127
+ }
5999
6128
  let ssPath = `screenshots/${ssId}/${`${browserName}-${viewport.width}x${viewport.height}`}-${ssId}.png`;
6000
6129
  yield page == null ? void 0 : page.setViewportSize({ width: viewport.width, height: viewport.height || constants_default.MIN_VIEWPORT_HEIGHT });
6001
6130
  if (fullPage)
6002
6131
  yield page == null ? void 0 : page.evaluate(scrollToBottomAndBackToTop);
6003
6132
  yield page == null ? void 0 : page.waitForTimeout(waitForTimeout || 0);
6004
6133
  yield executeDocumentScripts(ctx, page, "beforeSnapshot", beforeSnapshotScript);
6134
+ discoveryErrors.name = name;
6135
+ discoveryErrors.url = url;
6136
+ discoveryErrors.timestamp = (/* @__PURE__ */ new Date()).toISOString();
6005
6137
  yield page == null ? void 0 : page.screenshot({ path: ssPath, fullPage });
6006
- yield ctx.client.uploadScreenshot(ctx.build, ssPath, name, browserName, viewportString, url, ctx.log);
6138
+ yield ctx.client.uploadScreenshot(ctx.build, ssPath, name, browserName, viewportString, url, ctx.log, discoveryErrors, ctx);
6139
+ discoveryErrors = {
6140
+ name: "",
6141
+ url: "",
6142
+ timestamp: "",
6143
+ snapshotUUID: "",
6144
+ browsers: {}
6145
+ };
6007
6146
  }
6008
6147
  } catch (error) {
6009
6148
  throw new Error(`captureScreenshotsForConfig failed for browser ${browserName}; error: ${error}`);
@@ -6173,7 +6312,13 @@ function uploadScreenshots(ctx) {
6173
6312
  viewport = `${width}x${height}`;
6174
6313
  }
6175
6314
  }
6176
- yield ctx.client.uploadScreenshot(ctx.build, filePath, ssId, "default", viewport, "", ctx.log);
6315
+ yield ctx.client.uploadScreenshot(ctx.build, filePath, ssId, "default", viewport, "", ctx.log, {
6316
+ name: "",
6317
+ url: "",
6318
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6319
+ snapshotUUID: "",
6320
+ browsers: {}
6321
+ }, ctx);
6177
6322
  ctx.log.info(`${filePath} : uploaded successfully`);
6178
6323
  noOfScreenshots++;
6179
6324
  } else {
@@ -7356,7 +7501,7 @@ var uploadPdf_default = command10;
7356
7501
 
7357
7502
  // src/commander/commander.ts
7358
7503
  var program2 = new commander.Command();
7359
- program2.name("smartui").description("CLI to help you run your SmartUI tests on LambdaTest platform").version(`v${version}`).option("-c --config <filepath>", "Config file path").option("--markBaseline", "Mark this build baseline").option("--baselineBranch <string>", "Mark this build baseline").option("--baselineBuild <string>", "Mark this build baseline").option("--githubURL <string>", "GitHub URL including commitId").option("--userName <string>", "Specify the LT username").option("--accessKey <string>", "Specify the LT accesskey").addCommand(exec_default2).addCommand(capture_default).addCommand(configWeb).addCommand(configStatic).addCommand(upload_default).addCommand(server_default2).addCommand(stopServer_default).addCommand(merge_default).addCommand(ping_default).addCommand(configFigma).addCommand(uploadFigma).addCommand(configWebFigma).addCommand(configAppFigma).addCommand(uploadWebFigmaCommand).addCommand(uploadAppFigmaCommand).addCommand(pingTest_default).addCommand(uploadPdf_default);
7504
+ program2.name("smartui").description("CLI to help you run your SmartUI tests on LambdaTest platform").version(`v${version}`).option("-c --config <filepath>", "Config file path").option("--markBaseline", "Mark this build baseline").option("--baselineBranch <string>", "Mark this build baseline").option("--baselineBuild <string>", "Mark this build baseline").option("--githubURL <string>", "GitHub URL including commitId").option("--gitURL <string>", "Git URL including commitId").option("--userName <string>", "Specify the LT username").option("--accessKey <string>", "Specify the LT accesskey").addCommand(exec_default2).addCommand(capture_default).addCommand(configWeb).addCommand(configStatic).addCommand(upload_default).addCommand(server_default2).addCommand(stopServer_default).addCommand(merge_default).addCommand(ping_default).addCommand(configFigma).addCommand(uploadFigma).addCommand(configWebFigma).addCommand(configAppFigma).addCommand(uploadWebFigmaCommand).addCommand(uploadAppFigmaCommand).addCommand(pingTest_default).addCommand(uploadPdf_default);
7360
7505
  var commander_default = program2;
7361
7506
  (function() {
7362
7507
  return __async(this, null, function* () {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdatest/smartui-cli",
3
- "version": "4.1.45",
3
+ "version": "4.1.47",
4
4
  "description": "A command line interface (CLI) to run SmartUI tests on LambdaTest",
5
5
  "files": [
6
6
  "dist/**/*"