@lambdatest/smartui-cli 2.0.3 → 2.0.4

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 +81 -18
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -196,9 +196,9 @@ var DEFAULT_CONFIG = {
196
196
  "edge"
197
197
  ],
198
198
  viewports: [
199
- [1920, 1080],
200
- [1366, 768],
201
- [360, 640]
199
+ [1920],
200
+ [1366],
201
+ [360]
202
202
  ],
203
203
  waitForTimeout: 1e3
204
204
  }
@@ -237,13 +237,13 @@ function createWebStaticConfig(filepath) {
237
237
  }
238
238
 
239
239
  // package.json
240
- var version = "2.0.3";
240
+ var version = "2.0.4";
241
241
  var ajv = new Ajv__default.default({ allErrors: true });
242
242
  ajv.addFormat("web-url", {
243
243
  type: "string",
244
244
  validate: (url) => {
245
245
  const urlPattern = new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$", "i");
246
- return urlPattern.test(url);
246
+ return urlPattern.test(url.trim());
247
247
  }
248
248
  });
249
249
  addErrors__default.default(ajv);
@@ -264,17 +264,26 @@ var ConfigSchema = {
264
264
  type: "array",
265
265
  items: {
266
266
  type: "array",
267
- items: [
268
- { type: "number", minimum: 320, maximum: 7680 },
269
- { type: "number", minimum: 320, maximum: 7680 }
267
+ oneOf: [
268
+ {
269
+ items: [{ type: "number", minimum: 320, maximum: 7680 }],
270
+ minItems: 1,
271
+ maxItems: 1
272
+ },
273
+ {
274
+ items: [
275
+ { type: "number", minimum: 320, maximum: 7680 },
276
+ { type: "number", minimum: 320, maximum: 7680 }
277
+ ],
278
+ minItems: 2,
279
+ maxItems: 2
280
+ }
270
281
  ],
271
- additionalItems: false,
272
- minItems: 2,
273
- maxItems: 2
282
+ errorMessage: "Invalid config; width/height must be >= 320 and <= 7680"
274
283
  },
275
284
  uniqueItems: true,
276
285
  maxItems: 5,
277
- errorMessage: "Invalid config; width/height must be >= 320 and <= 7680; max viewports allowed - 5"
286
+ errorMessage: "Invalid config; max unique viewports allowed - 5"
278
287
  },
279
288
  waitForPageRender: {
280
289
  type: "number",
@@ -326,11 +335,55 @@ var WebStaticConfigSchema = {
326
335
  };
327
336
  var validateConfig = ajv.compile(ConfigSchema);
328
337
  var validateWebStaticConfig = ajv.compile(WebStaticConfigSchema);
338
+ var HTTP_SCHEME = "https:";
339
+ var HTTP_SCHEME_PREFIX = "https://";
340
+ var WWW = "www.";
329
341
  function delDir(dir) {
330
342
  if (fs__default.default.existsSync(dir)) {
331
343
  fs__default.default.rmSync(dir, { recursive: true });
332
344
  }
333
345
  }
346
+ function ensureHttps(urlString) {
347
+ try {
348
+ if (urlString && urlString.startsWith(WWW)) {
349
+ urlString = HTTP_SCHEME_PREFIX + urlString;
350
+ }
351
+ let url = new URL(urlString);
352
+ if (url.protocol !== HTTP_SCHEME) {
353
+ url.protocol = HTTP_SCHEME;
354
+ }
355
+ return url.toString();
356
+ } catch (error) {
357
+ console.error("Invalid URL: " + urlString, error);
358
+ return null;
359
+ }
360
+ }
361
+ function scrollToBottomAndBackToTop({
362
+ frequency = 100,
363
+ timing = 8,
364
+ remoteWindow = window
365
+ } = {}) {
366
+ return new Promise((resolve) => {
367
+ let scrolls = 1;
368
+ let scrollLength = remoteWindow.document.body.scrollHeight / frequency;
369
+ (function scroll() {
370
+ let scrollBy = scrollLength * scrolls;
371
+ remoteWindow.setTimeout(() => {
372
+ remoteWindow.scrollTo(0, scrollBy);
373
+ if (scrolls < frequency) {
374
+ scrolls += 1;
375
+ scroll();
376
+ }
377
+ if (scrolls === frequency) {
378
+ remoteWindow.setTimeout(() => {
379
+ remoteWindow.scrollTo(0, 0);
380
+ resolve();
381
+ }, timing);
382
+ }
383
+ }, timing);
384
+ })();
385
+ });
386
+ }
334
387
 
335
388
  // src/lib/httpClient.ts
336
389
  var httpClient = class {
@@ -461,7 +514,7 @@ var ctx_default = (options) => {
461
514
  process.exit();
462
515
  }
463
516
  for (let viewport of config.web.viewports)
464
- viewports.push({ width: viewport[0], height: viewport[1] });
517
+ viewports.push({ width: viewport[0], height: viewport[1] || 0 });
465
518
  return {
466
519
  env,
467
520
  log: logger_default,
@@ -685,6 +738,7 @@ var BROWSER_FIREFOX = "firefox";
685
738
  var BROWSER_EDGE = "edge";
686
739
  var EDGE_CHANNEL = "msedge";
687
740
  var PW_WEBKIT = "webkit";
741
+ var MIN_RESOLUTION_HEIGHT = 320;
688
742
  function captureScreenshots(ctx, screenshots) {
689
743
  return __async(this, null, function* () {
690
744
  var _a;
@@ -692,6 +746,7 @@ function captureScreenshots(ctx, screenshots) {
692
746
  let totalBrowsers = ctx.webConfig.browsers.length;
693
747
  let totalViewports = ctx.webConfig.viewports.length;
694
748
  let totalScreenshots = screenshots.length;
749
+ let capturedScreenshots = 0;
695
750
  for (let i = 0; i < totalBrowsers; i++) {
696
751
  let browserName = (_a = ctx.webConfig.browsers[i]) == null ? void 0 : _a.toLowerCase();
697
752
  let browser;
@@ -718,17 +773,25 @@ function captureScreenshots(ctx, screenshots) {
718
773
  let screenshot = screenshots[j];
719
774
  let screenshotId = screenshot.name.toLowerCase().replace(/\s/g, "-");
720
775
  const page = yield context.newPage();
776
+ if (screenshot.url) {
777
+ screenshot.url = screenshot.url.trim();
778
+ screenshot.url = ensureHttps(screenshot.url);
779
+ }
721
780
  yield page.goto(screenshot.url, pageOptions);
722
- yield page.waitForTimeout(screenshot.waitForTimeout || 0);
723
781
  for (let k = 0; k < totalViewports; k++) {
724
782
  let { width, height } = ctx.webConfig.viewports[k];
725
783
  let ssName = `${browserName}-${width}x${height}-${screenshotId}.png`;
726
784
  let ssPath = `screenshots/${screenshotId}/${ssName}.png`;
727
- yield page.setViewportSize({ width, height });
728
- yield page.screenshot({ path: ssPath });
785
+ yield page.setViewportSize({ width, height: height || MIN_RESOLUTION_HEIGHT });
786
+ if (height === 0)
787
+ yield page.evaluate(scrollToBottomAndBackToTop);
788
+ yield page.waitForTimeout(screenshot.waitForTimeout || 0);
789
+ yield page.screenshot({ path: ssPath, fullPage: height ? false : true });
729
790
  let completed = i == totalBrowsers - 1 && j == totalScreenshots - 1 && k == totalViewports - 1 ? true : false;
730
791
  browserName = browserName === BROWSER_SAFARI ? PW_WEBKIT : browserName;
731
792
  ctx.client.uploadScreenshot(ctx.build, ssPath, screenshot.name, browserName, `${width}x${height}`, completed);
793
+ capturedScreenshots++;
794
+ ctx.task.output = chalk__default.default.gray(`screenshots captured: ${capturedScreenshots}/${totalBrowsers * totalViewports * totalScreenshots}`);
732
795
  }
733
796
  yield page.close();
734
797
  }
@@ -747,8 +810,8 @@ var captureScreenshots_default = (ctx) => {
747
810
  title: "Capturing screenshots",
748
811
  task: (ctx2, task) => __async(void 0, null, function* () {
749
812
  try {
750
- let { webStaticConfig: screenshots } = ctx2;
751
- let totalScreenshots = yield captureScreenshots(ctx2, screenshots);
813
+ ctx2.task = task;
814
+ let totalScreenshots = yield captureScreenshots(ctx2, ctx2.webStaticConfig);
752
815
  task.title = "Screenshots captured successfully";
753
816
  task.output = chalk__default.default.gray(`total screenshots: ${totalScreenshots}`);
754
817
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdatest/smartui-cli",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "A command line interface (CLI) to run SmartUI tests on LambdaTest",
5
5
  "files": [
6
6
  "dist/**/*"