browsertime 23.5.0 → 24.0.0-alpha.2

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 (95) hide show
  1. package/CHANGELOG.md +20 -2
  2. package/bin/browsertime.js +3 -2
  3. package/lib/android/gnirehtet.js +2 -2
  4. package/lib/android/index.js +2 -2
  5. package/lib/android/root.js +2 -2
  6. package/lib/chrome/chromeDevtoolsProtocol.js +4 -4
  7. package/lib/chrome/har.js +2 -2
  8. package/lib/chrome/networkManager.js +2 -2
  9. package/lib/chrome/parseCpuTrace.js +2 -2
  10. package/lib/chrome/traceCategoriesParser.js +2 -2
  11. package/lib/chrome/webdriver/builder.js +1 -2
  12. package/lib/chrome/webdriver/chromium.js +2 -2
  13. package/lib/chrome/webdriver/setupChromiumOptions.js +2 -2
  14. package/lib/chrome/webdriver/traceUtilities.js +2 -2
  15. package/lib/connectivity/humble.js +2 -2
  16. package/lib/connectivity/index.js +2 -2
  17. package/lib/core/engine/collector.js +2 -2
  18. package/lib/core/engine/command/addText.js +2 -2
  19. package/lib/core/engine/command/android.js +2 -2
  20. package/lib/core/engine/command/bidi.js +2 -2
  21. package/lib/core/engine/command/cache.js +2 -2
  22. package/lib/core/engine/command/chromeDevToolsProtocol.js +2 -2
  23. package/lib/core/engine/command/chromeTrace.js +2 -2
  24. package/lib/core/engine/command/click.js +2 -2
  25. package/lib/core/engine/command/debug.js +2 -2
  26. package/lib/core/engine/command/geckoProfiler.js +2 -2
  27. package/lib/core/engine/command/javaScript.js +2 -2
  28. package/lib/core/engine/command/measure.js +2 -2
  29. package/lib/core/engine/command/mouse/clickAndHold.js +2 -2
  30. package/lib/core/engine/command/mouse/contextClick.js +2 -2
  31. package/lib/core/engine/command/mouse/doubleClick.js +2 -2
  32. package/lib/core/engine/command/mouse/mouseMove.js +2 -2
  33. package/lib/core/engine/command/mouse/singleClick.js +2 -2
  34. package/lib/core/engine/command/navigation.js +2 -2
  35. package/lib/core/engine/command/screenshot.js +2 -2
  36. package/lib/core/engine/command/scroll.js +2 -2
  37. package/lib/core/engine/command/select.js +2 -2
  38. package/lib/core/engine/command/set.js +2 -2
  39. package/lib/core/engine/command/stopWatch.js +2 -2
  40. package/lib/core/engine/command/switch.js +2 -2
  41. package/lib/core/engine/command/wait.js +2 -2
  42. package/lib/core/engine/index.js +8 -14
  43. package/lib/core/engine/iteration.js +2 -2
  44. package/lib/core/seleniumRunner.js +8 -12
  45. package/lib/core/webdriver/index.js +1 -1
  46. package/lib/edge/webdriver/builder.js +3 -4
  47. package/lib/firefox/firefoxBidi.js +2 -2
  48. package/lib/firefox/geckoProfiler.js +2 -2
  49. package/lib/firefox/memoryReport.js +2 -2
  50. package/lib/firefox/networkManager.js +2 -2
  51. package/lib/firefox/perfStats.js +2 -2
  52. package/lib/firefox/webdriver/builder.js +3 -5
  53. package/lib/firefox/webdriver/firefox.js +2 -2
  54. package/lib/screenshot/index.js +7 -9
  55. package/lib/screenshot/loadCustomJimp.js +17 -0
  56. package/lib/support/browserScript.js +4 -5
  57. package/lib/support/cli.js +15 -5
  58. package/lib/support/dns.js +2 -2
  59. package/lib/support/engineUtils.js +4 -5
  60. package/lib/support/fileUtil.js +20 -3
  61. package/lib/support/getPort.js +25 -0
  62. package/lib/support/getViewPort.js +2 -2
  63. package/lib/support/har/index.js +5 -6
  64. package/lib/support/images/index.js +8 -17
  65. package/lib/support/logging.js +14 -39
  66. package/lib/support/pathToFolder.js +3 -3
  67. package/lib/support/preURL.js +2 -2
  68. package/lib/support/statistics.js +2 -2
  69. package/lib/support/stop.js +2 -2
  70. package/lib/support/storageManager.js +5 -5
  71. package/lib/support/util.js +73 -3
  72. package/lib/support/xvfb.js +55 -26
  73. package/lib/video/postprocessing/finetune/addTextToVideo.js +2 -2
  74. package/lib/video/postprocessing/finetune/convertFps.js +2 -2
  75. package/lib/video/postprocessing/finetune/index.js +2 -2
  76. package/lib/video/postprocessing/finetune/removeOrange.js +2 -2
  77. package/lib/video/postprocessing/visualmetrics/getVideoMetrics.js +2 -2
  78. package/lib/video/postprocessing/visualmetrics/visualMetrics.js +2 -2
  79. package/lib/video/screenRecording/android/recorder.js +2 -2
  80. package/lib/video/screenRecording/desktop/convert.js +2 -2
  81. package/lib/video/screenRecording/desktop/desktopRecorder.js +2 -2
  82. package/lib/video/screenRecording/desktop/ffmpegRecorder.js +2 -2
  83. package/lib/video/screenRecording/desktop/osx/getScreen.js +2 -2
  84. package/lib/video/screenRecording/firefox/firefoxWindowRecorder.js +2 -2
  85. package/lib/video/screenRecording/ios/convertToMp4.js +2 -2
  86. package/lib/video/screenRecording/ios/iosRecorder.js +2 -2
  87. package/lib/video/screenRecording/iosSimulator/convertToMp4.js +2 -2
  88. package/lib/video/screenRecording/iosSimulator/recorder.js +2 -2
  89. package/lib/video/screenRecording/setOrangeBackground.js +2 -2
  90. package/package.json +8 -13
  91. package/types/support/engineUtils.d.ts.map +1 -1
  92. package/types/support/fileUtil.d.ts +1 -0
  93. package/types/support/fileUtil.d.ts.map +1 -1
  94. package/types/support/util.d.ts +3 -0
  95. package/types/support/util.d.ts.map +1 -1
@@ -1,6 +1,5 @@
1
- import groupBy from 'lodash.groupby';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime');
1
+ import { getLogger } from '@sitespeed.io/log';
2
+ const log = getLogger('browsertime');
4
3
 
5
4
  export function formatMetric(name, metric, multiple, inMs, extras) {
6
5
  if (metric === undefined) return;
@@ -45,6 +44,7 @@ export function logResultLogLine(results) {
45
44
  // get the id
46
45
  let pageId = results.har.log.pages[index].id;
47
46
  let entriesByPage = groupBy(results.har.log.entries, 'pageref');
47
+
48
48
  requests = entriesByPage[pageId]
49
49
  ? entriesByPage[pageId].length + ' requests'
50
50
  : '';
@@ -265,3 +265,73 @@ export function adjustVisualProgressTimestamps(
265
265
  }
266
266
  return visualProgress;
267
267
  }
268
+
269
+ export function localTime() {
270
+ const date = new Date();
271
+
272
+ const year = date.getFullYear();
273
+ const month = String(date.getMonth() + 1).padStart(2, '0');
274
+ const day = String(date.getDate()).padStart(2, '0');
275
+ const hours = String(date.getHours()).padStart(2, '0');
276
+ const minutes = String(date.getMinutes()).padStart(2, '0');
277
+ const seconds = String(date.getSeconds()).padStart(2, '0');
278
+
279
+ const offset = -date.getTimezoneOffset();
280
+ const sign = offset >= 0 ? '+' : '-';
281
+ const offsetHours = String(Math.floor(Math.abs(offset) / 60)).padStart(
282
+ 2,
283
+ '0'
284
+ );
285
+ const offsetMinutes = String(Math.abs(offset) % 60).padStart(2, '0');
286
+
287
+ return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}${sign}${offsetHours}:${offsetMinutes}`;
288
+ }
289
+
290
+ export function pick(obj, keys) {
291
+ const result = {};
292
+ if (!obj || typeof obj !== 'object') {
293
+ return result;
294
+ }
295
+ for (const key of keys) {
296
+ if (key in obj) {
297
+ result[key] = obj[key];
298
+ }
299
+ }
300
+ return result;
301
+ }
302
+
303
+ export function isEmpty(value) {
304
+ if (value === null) return true;
305
+
306
+ if (value === undefined) return true;
307
+
308
+ if (typeof value === 'boolean') return false;
309
+
310
+ if (typeof value === 'number') return false;
311
+
312
+ if (typeof value === 'string') return value.length === 0;
313
+
314
+ if (typeof value === 'function') return false;
315
+
316
+ if (Array.isArray(value)) return value.length === 0;
317
+
318
+ if (value instanceof Map || value instanceof Set) return value.size === 0;
319
+
320
+ if (typeof value === 'object') {
321
+ return Object.keys(value).length === 0;
322
+ }
323
+
324
+ return false;
325
+ }
326
+
327
+ function groupBy(array, property) {
328
+ const grouped = {};
329
+ for (const item of array) {
330
+ const key = item[property];
331
+ if (!grouped[key]) {
332
+ grouped[key] = [];
333
+ }
334
+ grouped[key].push(item);
335
+ }
336
+ return grouped;
337
+ }
@@ -1,55 +1,83 @@
1
- import { promisify } from 'node:util';
1
+ import { execa } from 'execa';
2
2
  import get from 'lodash.get';
3
- import Xvfb from '@cypress/xvfb';
4
3
  import { xvfbDisplay } from '../video/defaults.js';
5
4
  import { getViewPort } from '../support/getViewPort.js';
6
5
  import { isAndroidConfigured } from '../android/index.js';
7
6
 
8
- function buildXvfbArguments({ display, screen = 0, size, silent }) {
7
+ function buildXvfbCommand({ display, screen = 0, size, silent }) {
9
8
  return {
10
- displayNum: display,
11
- silent,
12
- reuse: true,
13
- xvfb_args: ['-ac', '-nolisten', 'tcp', '-screen', screen, `${size}x24`]
9
+ command: 'Xvfb',
10
+ args: [
11
+ `:${display}`,
12
+ '-ac',
13
+ '-nolisten',
14
+ 'tcp',
15
+ '-screen',
16
+ screen,
17
+ `${size}x24`
18
+ ],
19
+ silent
14
20
  };
15
21
  }
16
22
 
17
- async function startXvfb({ size, options }) {
23
+ export async function startXvfb({ size, options }) {
24
+ // If using Firefox, add some extra width to avoid issues
18
25
  let xvfbSize = size;
19
26
  if (options.browser === 'firefox') {
20
27
  const extraSizeInFirefox = 200;
21
- const viewPort = size.split('x');
22
- xvfbSize = Number(viewPort[0]) + extraSizeInFirefox + 'x' + viewPort[1];
28
+ const [width, height] = size.split('x');
29
+ xvfbSize = `${Number(width) + extraSizeInFirefox}x${height}`;
23
30
  }
24
- const xvfbArguments = buildXvfbArguments({
25
- display: get(options, 'xvfbParams.display', xvfbDisplay),
31
+
32
+ const display = get(options, 'xvfbParams.display', xvfbDisplay);
33
+ const silent = options.verbose >= 2 ? false : true;
34
+
35
+ const { command, args } = buildXvfbCommand({
36
+ display,
26
37
  size: xvfbSize,
27
- silent: options.verbose >= 2 ? false : true
38
+ silent
39
+ });
40
+
41
+ const xvfbProcess = execa(command, args, {
42
+ stdio: silent ? 'ignore' : 'inherit',
43
+ detached: true
28
44
  });
29
- const xvfb = new Xvfb(xvfbArguments);
30
- const start = promisify(xvfb.start.bind(xvfb));
31
- await start();
32
- return xvfb;
45
+
46
+ const waitToSettle = get(options, 'xvfbParams.waitToSettle', 500);
47
+ await new Promise(resolve => {
48
+ setTimeout(resolve, waitToSettle);
49
+ });
50
+
51
+ // Export for the browser
52
+ process.env.DISPLAY = `:${display}`;
53
+
54
+ return {
55
+ display,
56
+ process: xvfbProcess
57
+ };
33
58
  }
59
+ export async function stopXvfb(xvfbSession) {
60
+ if (!xvfbSession || !xvfbSession.process) {
61
+ return;
62
+ }
34
63
 
35
- async function stopXvfb(xvfb) {
36
- const stop = promisify(xvfb.stop.bind(xvfb));
37
- return stop();
64
+ try {
65
+ xvfbSession.process.kill('SIGTERM');
66
+ await xvfbSession.process;
67
+ } catch {
68
+ // Just swallow
69
+ }
38
70
  }
39
71
 
40
- /**
41
- * Create a new XVFB instance
42
- * @class
43
- */
44
72
  export class XVFB {
45
73
  constructor(options) {
46
74
  this.options = options;
75
+ this.xvfbSession = undefined;
47
76
  }
48
77
 
49
78
  async start() {
50
- // This is the fix for the current use of ENV in Docker
51
- // we should do a better fix for that
52
79
  const useXvfb = get(this.options, 'xvfb', false);
80
+
53
81
  if (
54
82
  (useXvfb === true || useXvfb === 'true') &&
55
83
  !isAndroidConfigured(this.options)
@@ -64,6 +92,7 @@ export class XVFB {
64
92
  async stop() {
65
93
  if (this.xvfbSession) {
66
94
  await stopXvfb(this.xvfbSession);
95
+ this.xvfbSession = undefined;
67
96
  }
68
97
  }
69
98
  }
@@ -1,9 +1,9 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
2
+ import { getLogger } from '@sitespeed.io/log';
3
3
  import { getTimingMetrics } from './getTimingMetrics.js';
4
4
  import { getFont } from './getFont.js';
5
5
  import { isAndroidConfigured } from '../../../android/index.js';
6
- const log = intel.getLogger('browsertime.video');
6
+ const log = getLogger('browsertime.video');
7
7
 
8
8
  function isSmallish(options) {
9
9
  return (
@@ -1,6 +1,6 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime.video');
2
+ import { getLogger } from '@sitespeed.io/log';
3
+ const log = getLogger('browsertime.video');
4
4
 
5
5
  export async function convert(source, destination, framerate) {
6
6
  const scriptArguments = [
@@ -5,7 +5,7 @@ import {
5
5
  unlink as _unlink
6
6
  } from 'node:fs';
7
7
  import { promisify } from 'node:util';
8
- import intel from 'intel';
8
+ import { getLogger } from '@sitespeed.io/log';
9
9
  import get from 'lodash.get';
10
10
  import { addTextToVideo } from './addTextToVideo.js';
11
11
  import { removeOrange } from './removeOrange.js';
@@ -15,7 +15,7 @@ import { isAndroidConfigured } from '../../../android/index.js';
15
15
  const rename = promisify(_rename);
16
16
  const copyFile = promisify(_copyFile);
17
17
  const unlink = promisify(_unlink);
18
- const log = intel.getLogger('browsertime.video');
18
+ const log = getLogger('browsertime.video');
19
19
 
20
20
  export async function finetuneVideo(
21
21
  videoDir,
@@ -1,6 +1,6 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime.video');
2
+ import { getLogger } from '@sitespeed.io/log';
3
+ const log = getLogger('browsertime.video');
4
4
 
5
5
  export async function removeOrange(
6
6
  inputFile,
@@ -1,8 +1,8 @@
1
1
  import path from 'node:path';
2
- import intel from 'intel';
2
+ import { getLogger } from '@sitespeed.io/log';
3
3
  import { run } from './visualMetrics.js';
4
4
  import { extraMetrics } from './extraMetrics.js';
5
- const log = intel.getLogger('browsertime.video');
5
+ const log = getLogger('browsertime.video');
6
6
 
7
7
  export async function getVideoMetrics(
8
8
  videoDir,
@@ -1,11 +1,11 @@
1
1
  import { fileURLToPath } from 'node:url';
2
2
  import path from 'node:path';
3
3
  import { execa } from 'execa';
4
- import intel from 'intel';
4
+ import { getLogger } from '@sitespeed.io/log';
5
5
  import get from 'lodash.get';
6
6
  import { readFile, removeFile, copyFile } from '../../../support/fileUtil.js';
7
7
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
- const log = intel.getLogger('browsertime.video');
8
+ const log = getLogger('browsertime.video');
9
9
 
10
10
  const SCRIPT_PATH = path.join(
11
11
  __dirname,
@@ -1,11 +1,11 @@
1
1
  import { promisify } from 'node:util';
2
2
  import { unlink as _unlink } from 'node:fs';
3
3
  import get from 'lodash.get';
4
- import intel from 'intel';
4
+ import { getLogger } from '@sitespeed.io/log';
5
5
  import { framerate } from '../../defaults.js';
6
6
  import { Android } from '../../../android/index.js';
7
7
  const unlink = promisify(_unlink);
8
- const log = intel.getLogger('browsertime.video');
8
+ const log = getLogger('browsertime.video');
9
9
  const delay = ms => new Promise(res => setTimeout(res, ms));
10
10
 
11
11
  export class AndroidRecorder {
@@ -1,6 +1,6 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime.video');
2
+ import { getLogger } from '@sitespeed.io/log';
3
+ const log = getLogger('browsertime.video');
4
4
 
5
5
  export async function convert(source, destination, crf, threads) {
6
6
  const scriptArguments = [
@@ -1,6 +1,6 @@
1
1
  import { promisify } from 'node:util';
2
2
  import { unlink as _unlink, rename as _rename } from 'node:fs';
3
- import intel from 'intel';
3
+ import { getLogger } from '@sitespeed.io/log';
4
4
  import get from 'lodash.get';
5
5
  import { start as _start, stop as _stop } from './ffmpegRecorder.js';
6
6
  import { convert } from './convert.js';
@@ -14,7 +14,7 @@ import {
14
14
  import { getViewPort } from '../../../support/getViewPort.js';
15
15
  const unlink = promisify(_unlink);
16
16
  const rename = promisify(_rename);
17
- const log = intel.getLogger('browsertime.video');
17
+ const log = getLogger('browsertime.video');
18
18
 
19
19
  export class DesktopRecorder {
20
20
  constructor(options) {
@@ -1,8 +1,8 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
2
+ import { getLogger } from '@sitespeed.io/log';
3
3
  import { getScreenOnOSX } from './osx/getScreen.js';
4
4
  import { getSPDisplaysDataType } from './osx/getSPDisplaysDataType.js';
5
- const log = intel.getLogger('browsertime.video');
5
+ const log = getLogger('browsertime.video');
6
6
 
7
7
  async function buildX11FfmpegArguments({
8
8
  display,
@@ -1,6 +1,6 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime.video');
2
+ import { getLogger } from '@sitespeed.io/log';
3
+ const log = getLogger('browsertime.video');
4
4
 
5
5
  export async function getScreenOnOSX() {
6
6
  const scriptArguments = [
@@ -7,11 +7,11 @@ import {
7
7
  copyFileSync
8
8
  } from 'node:fs';
9
9
  import path from 'node:path';
10
- import intel from 'intel';
10
+ import { getLogger } from '@sitespeed.io/log';
11
11
  import { execa } from 'execa';
12
12
  import { removeDirAndFiles } from '../../../support/fileUtil.js';
13
13
  import { Android, isAndroidConfigured } from '../../../android/index.js';
14
- const log = intel.getLogger('browsertime.video');
14
+ const log = getLogger('browsertime.video');
15
15
 
16
16
  const unlink = promisify(_unlink);
17
17
 
@@ -1,6 +1,6 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime.video');
2
+ import { getLogger } from '@sitespeed.io/log';
3
+ const log = getLogger('browsertime.video');
4
4
 
5
5
  export async function convert(source, destination) {
6
6
  const scriptArguments = [
@@ -4,8 +4,8 @@ import { execaCommand as command } from 'execa';
4
4
  import { promisify } from 'node:util';
5
5
  import { unlink as _unlink } from 'node:fs';
6
6
  import { convert } from './convertToMp4.js';
7
- import intel from 'intel';
8
- const log = intel.getLogger('browsertime.video');
7
+ import { getLogger } from '@sitespeed.io/log';
8
+ const log = getLogger('browsertime.video');
9
9
  const unlink = promisify(_unlink);
10
10
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
11
  const moduleRootPath = path.resolve(__dirname, '..', '..', '..', '..');
@@ -1,6 +1,6 @@
1
1
  import { execa } from 'execa';
2
- import intel from 'intel';
3
- const log = intel.getLogger('browsertime.video');
2
+ import { getLogger } from '@sitespeed.io/log';
3
+ const log = getLogger('browsertime.video');
4
4
 
5
5
  export async function convert(source, destination) {
6
6
  const scriptArguments = [
@@ -2,11 +2,11 @@ import path from 'node:path';
2
2
  import { promisify } from 'node:util';
3
3
  import fs from 'node:fs';
4
4
  import { execaCommand } from 'execa';
5
- import intel from 'intel';
5
+ import { getLogger } from '@sitespeed.io/log';
6
6
  import { convert } from './convertToMp4.js';
7
7
  const unlink = promisify(fs.unlink);
8
8
  const delay = ms => new Promise(res => setTimeout(res, ms));
9
- const log = intel.getLogger('browsertime.video');
9
+ const log = getLogger('browsertime.video');
10
10
 
11
11
  export class IOSSimulatorRecorder {
12
12
  constructor(options, baseDir) {
@@ -1,6 +1,6 @@
1
- import intel from 'intel';
1
+ import { getLogger } from '@sitespeed.io/log';
2
2
  import { until, By } from 'selenium-webdriver';
3
- const log = intel.getLogger('browsertime.video');
3
+ const log = getLogger('browsertime.video');
4
4
  export async function setOrangeBackground(driver) {
5
5
  log.debug('Add orange color');
6
6
  // We tried other ways for Android (access an orange page)
package/package.json CHANGED
@@ -1,41 +1,36 @@
1
1
  {
2
2
  "name": "browsertime",
3
3
  "description": "Get performance metrics from your web page using Browsertime.",
4
- "version": "23.5.0",
4
+ "version": "24.0.0-alpha.2",
5
5
  "bin": "./bin/browsertime.js",
6
6
  "type": "module",
7
7
  "types": "./types/scripting.d.ts",
8
8
  "dependencies": {
9
- "@cypress/xvfb": "1.2.4",
10
9
  "@devicefarmer/adbkit": "3.3.8",
11
10
  "@sitespeed.io/chromedriver": "131.0.6778-69",
12
- "@sitespeed.io/edgedriver": "126.0.2592-102",
11
+ "@sitespeed.io/edgedriver": "131.0.2903-112",
13
12
  "@sitespeed.io/geckodriver": "0.35.0-1",
13
+ "@sitespeed.io/log": "0.2.3",
14
14
  "@sitespeed.io/throttle": "5.0.1",
15
15
  "@sitespeed.io/tracium": "0.3.3",
16
- "btoa": "1.2.1",
17
16
  "chrome-har": "1.0.1",
18
17
  "chrome-remote-interface": "0.33.2",
19
- "dayjs": "1.11.13",
20
18
  "execa": "9.5.2",
21
19
  "fast-stats": "0.0.7",
22
20
  "ff-test-bidi-har-export": "0.0.17",
23
- "find-up": "7.0.0",
24
- "get-port": "7.1.0",
25
- "hasbin": "1.2.3",
26
- "intel": "1.2.0",
27
21
  "lodash.get": "4.4.2",
28
- "lodash.groupby": "4.6.0",
29
- "lodash.isempty": "4.4.0",
30
22
  "lodash.merge": "4.6.2",
31
- "lodash.pick": "4.4.0",
32
23
  "lodash.set": "4.3.2",
33
24
  "selenium-webdriver": "4.27.0",
34
25
  "usb-power-profiling": "1.5.0",
35
26
  "yargs": "17.7.2"
36
27
  },
37
28
  "optionalDependencies": {
38
- "jimp": "0.22.12"
29
+ "@jimp/custom": "0.22.12",
30
+ "@jimp/png": "0.22.12",
31
+ "@jimp/jpeg": "0.22.12",
32
+ "@jimp/plugin-resize": "0.22.12",
33
+ "@jimp/plugin-scale": "0.22.12"
39
34
  },
40
35
  "devDependencies": {
41
36
  "@types/selenium-webdriver": "4.1.25",
@@ -1 +1 @@
1
- {"version":3,"file":"engineUtils.d.ts","sourceRoot":"","sources":["../../lib/support/engineUtils.js"],"names":[],"mappings":"AAmFA,+EAOC;AAED,kEAKC;AAED,qFAKC;AACD,oCAEC"}
1
+ {"version":3,"file":"engineUtils.d.ts","sourceRoot":"","sources":["../../lib/support/engineUtils.js"],"names":[],"mappings":"AAkFA,+EAOC;AAED,kEAKC;AAED,qFAKC;AACD,oCAEC"}
@@ -7,4 +7,5 @@ export function readFile(fileName: any): Promise<Buffer>;
7
7
  export function removeDirAndFiles(dirName: any): Promise<void>;
8
8
  export function removeByType(dir: any, type: any): Promise<void>;
9
9
  export function findFiles(dir: any, filter: any): Promise<string[]>;
10
+ export function findUpSync(filenames: any, startDir?: string): string;
10
11
  //# sourceMappingURL=fileUtil.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileUtil.d.ts","sourceRoot":"","sources":["../../lib/support/fileUtil.js"],"names":[],"mappings":"AAwBA,8DAEC;AAED,kEAEC;AAED,6DAEC;AAED,uEAEC;AACD,yDAEC;AACD,yDAEC;AACD,+DAqBC;AACD,iEAUC;AACD,oEAMC"}
1
+ {"version":3,"file":"fileUtil.d.ts","sourceRoot":"","sources":["../../lib/support/fileUtil.js"],"names":[],"mappings":"AAyBA,8DAEC;AAED,kEAEC;AAED,6DAEC;AAED,uEAEC;AACD,yDAEC;AACD,yDAEC;AACD,+DAqBC;AACD,iEAUC;AACD,oEAMC;AAED,sEAcC"}
@@ -4,4 +4,7 @@ export function toArray(arrayLike: any): any[];
4
4
  export function jsonifyVisualProgress(visualProgress: any): any;
5
5
  export function jsonifyKeyColorFrames(keyColorFrames: any): any;
6
6
  export function adjustVisualProgressTimestamps(visualProgress: any, profilerStartTime: any, recordingStartTime: any): any;
7
+ export function localTime(): string;
8
+ export function pick(obj: any, keys: any): {};
9
+ export function isEmpty(value: any): boolean;
7
10
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../lib/support/util.js"],"names":[],"mappings":"AAIA,oGAeC;AACD,qDA0LC;AACD,+CAQC;AACD,gEAeC;AACD,gEAsBC;AACD,0HAWC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../lib/support/util.js"],"names":[],"mappings":"AAGA,oGAeC;AACD,qDA2LC;AACD,+CAQC;AACD,gEAeC;AACD,gEAsBC;AACD,0HAWC;AAED,oCAmBC;AAED,8CAWC;AAED,6CAsBC"}