@testim/testim-cli 3.283.0 → 3.285.0

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.
@@ -7,9 +7,11 @@
7
7
  const fs = require('fs');
8
8
  const childProcess = require('child_process');
9
9
  const path = require('path');
10
+ const chalk = require('chalk');
10
11
  const validateNpmPackageName = require('validate-npm-package-name');
11
12
  const { promisify } = require('util');
12
13
  const { ArgError } = require('../errors.js');
14
+ const { copyDir } = require('../utils/fsUtils');
13
15
 
14
16
  const exec = promisify(childProcess.exec);
15
17
 
@@ -40,10 +42,12 @@ module.exports.init = async function init(name) {
40
42
  const nameValidity = validateNpmPackageName(packageName);
41
43
 
42
44
  if (!nameValidity.validForNewPackages) {
43
- if (nameValidity.errors) nameValidity.errors.forEach((e) => console.log(e));
44
- if (nameValidity.warnings) nameValidity.warnings.forEach((e) => console.log(e));
45
+ const message = `The name '${packageName}' is not a valid package name:`;
46
+ console.log(chalk.red(message));
47
+ if (nameValidity.errors) nameValidity.errors.forEach((e) => console.log(chalk.red(e)));
48
+ if (nameValidity.warnings) nameValidity.warnings.forEach((e) => console.log(chalk.yellowBright(`warning: ${e}`)));
45
49
 
46
- throw new ArgError('Package name is not valid');
50
+ throw new ArgError(`${message}\nvalidation errors:\n${nameValidity.errors?.join('\n') || ''}\nwarnings:\n${nameValidity.warnings?.join('\n') || ''}`);
47
51
  }
48
52
 
49
53
  const response = await prompts({
@@ -55,14 +59,14 @@ module.exports.init = async function init(name) {
55
59
  inactive: 'yes',
56
60
  });
57
61
 
58
- const sourceFolder = response.isJs ? 'template.js' : 'template.ts';
62
+ const sourceFolder = response.isJs ? 'template.js' : 'template.ts'; // these are directories and not file names
59
63
 
60
64
  const source = path.join(__dirname, sourceFolder);
61
- const dest = path.join(process.cwd(), name);
65
+ const destDir = path.join(process.cwd(), name);
62
66
 
63
- let spinner = ora(`Creating new test project in ${dest}`).start();
67
+ let spinner = ora(`Creating new test project in ${destDir}`).start();
64
68
 
65
- await fs.promises.copyFile(source, dest);
69
+ await copyDir(source, destDir);
66
70
 
67
71
  const sourcePackageJson = path.join(__dirname, sourceFolder, 'package.json');
68
72
  const destPackageJson = path.join(process.cwd(), name, 'package.json');
@@ -79,9 +83,9 @@ module.exports.init = async function init(name) {
79
83
 
80
84
  spinner.succeed();
81
85
  spinner = ora('Installing dependencies').start();
82
- await exec('npm install', { cwd: dest });
86
+ await exec('npm install', { cwd: destDir });
83
87
 
84
88
  spinner.succeed();
85
89
 
86
- console.log(`Testim Dev Kit project folder successfully created in ${dest}.`);
90
+ console.log(`Testim Dev Kit project folder successfully created in ${destDir}.`);
87
91
  };
@@ -252,7 +252,7 @@ const FIREFOX_FILE_NEVER_ASK = [
252
252
  'application/vnd.cups-pdf',
253
253
  ];
254
254
 
255
- function buildFirefoxOptions(opts, browserOptions) {
255
+ function buildFirefoxOptions(opts, browserOptions, lambdatestService) {
256
256
  const fireFoxPrefs = {
257
257
  'pdfjs.disabled': true, //disable pdf viewer. Otherwise, the pdf viewer takes over when we download a pdf.
258
258
  };
@@ -278,7 +278,7 @@ function buildFirefoxOptions(opts, browserOptions) {
278
278
  'moz:firefoxOptions': {
279
279
  prefs: fireFoxPrefs,
280
280
  },
281
- });
281
+ }, lambdatestService.isLambdatestRun() ? { enableCustomTranslation: true } : {});
282
282
 
283
283
  if (browserOptions.disableCookiesSameSiteNoneRequiresSecure) {
284
284
  opts.desiredCapabilities['moz:firefoxOptions'].prefs['network.cookie.sameSite.noneRequiresSecure'] = false;
@@ -510,7 +510,7 @@ function buildSeleniumOptions(browserOptions, testName, testRunConfig, gridInfo,
510
510
  opts = buildChromiumOptions(opts, browserOptions, testRunConfig, customExtensionLocalLocation, gridInfo, predefinedTestimExtension, lambdatestService);
511
511
  break;
512
512
  case 'firefox':
513
- opts = buildFirefoxOptions(opts, browserOptions);
513
+ opts = buildFirefoxOptions(opts, browserOptions, lambdatestService);
514
514
  break;
515
515
  case 'safari':
516
516
  case 'safari technology preview':
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@testim/testim-cli",
3
- "version": "3.283.0",
3
+ "version": "3.285.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@testim/testim-cli",
9
- "version": "3.283.0",
9
+ "version": "3.285.0",
10
10
  "license": "Proprietary",
11
11
  "dependencies": {
12
12
  "@applitools/eyes-sdk-core": "13.11.21",
@@ -62,7 +62,7 @@
62
62
  "superagent-proxy": "3.0.0",
63
63
  "test-exclude": "6.0.0",
64
64
  "threads": "0.12.0",
65
- "ua-parser-js": "0.7.28",
65
+ "ua-parser-js": "0.7.33",
66
66
  "validate-npm-package-name": "3.0.0",
67
67
  "webdriverio": "7.24.0",
68
68
  "winston": "3.6.0",
@@ -226,6 +226,7 @@
226
226
  "version": "1.1.35",
227
227
  "resolved": "https://registry.npmjs.org/@applitools/execution-grid-client/-/execution-grid-client-1.1.35.tgz",
228
228
  "integrity": "sha512-C5F7u0feVoQ9kncFiVSM2jqNHjAmz+VUdY55TfZuchq1CzSQv34pxhra5OlU62TZ74Cs4Uz0gv+tJYeGb6oeYA==",
229
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
229
230
  "dependencies": {
230
231
  "@applitools/logger": "1.1.30",
231
232
  "@applitools/utils": "1.3.16",
@@ -418,9 +419,9 @@
418
419
  }
419
420
  },
420
421
  "node_modules/@babel/runtime": {
421
- "version": "7.20.7",
422
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
423
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
422
+ "version": "7.20.13",
423
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
424
+ "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
424
425
  "dependencies": {
425
426
  "regenerator-runtime": "^0.13.11"
426
427
  },
@@ -1328,9 +1329,9 @@
1328
1329
  }
1329
1330
  },
1330
1331
  "node_modules/acorn": {
1331
- "version": "8.8.1",
1332
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
1333
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
1332
+ "version": "8.8.2",
1333
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
1334
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
1334
1335
  "bin": {
1335
1336
  "acorn": "bin/acorn"
1336
1337
  },
@@ -2182,9 +2183,9 @@
2182
2183
  }
2183
2184
  },
2184
2185
  "node_modules/axios-retry": {
2185
- "version": "3.3.1",
2186
- "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.3.1.tgz",
2187
- "integrity": "sha512-RohAUQTDxBSWLFEnoIG/6bvmy8l3TfpkclgStjl5MDCMBDgapAWCmr1r/9harQfWC8bzLC8job6UcL1A1Yc+/Q==",
2186
+ "version": "3.4.0",
2187
+ "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.4.0.tgz",
2188
+ "integrity": "sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA==",
2188
2189
  "dependencies": {
2189
2190
  "@babel/runtime": "^7.15.4",
2190
2191
  "is-retry-allowed": "^2.2.0"
@@ -4215,9 +4216,9 @@
4215
4216
  "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
4216
4217
  },
4217
4218
  "node_modules/devtools/node_modules/ua-parser-js": {
4218
- "version": "1.0.32",
4219
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.32.tgz",
4220
- "integrity": "sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA==",
4219
+ "version": "1.0.33",
4220
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz",
4221
+ "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==",
4221
4222
  "funding": [
4222
4223
  {
4223
4224
  "type": "opencollective",
@@ -5681,9 +5682,9 @@
5681
5682
  }
5682
5683
  },
5683
5684
  "node_modules/get-intrinsic": {
5684
- "version": "1.1.3",
5685
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
5686
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
5685
+ "version": "1.2.0",
5686
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
5687
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
5687
5688
  "dependencies": {
5688
5689
  "function-bind": "^1.1.1",
5689
5690
  "has": "^1.0.3",
@@ -12336,9 +12337,9 @@
12336
12337
  }
12337
12338
  },
12338
12339
  "node_modules/punycode": {
12339
- "version": "2.2.0",
12340
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz",
12341
- "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==",
12340
+ "version": "2.3.0",
12341
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
12342
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
12342
12343
  "engines": {
12343
12344
  "node": ">=6"
12344
12345
  }
@@ -14787,9 +14788,9 @@
14787
14788
  }
14788
14789
  },
14789
14790
  "node_modules/ua-parser-js": {
14790
- "version": "0.7.28",
14791
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
14792
- "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==",
14791
+ "version": "0.7.33",
14792
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz",
14793
+ "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==",
14793
14794
  "funding": [
14794
14795
  {
14795
14796
  "type": "opencollective",
@@ -16101,9 +16102,9 @@
16101
16102
  "integrity": "sha512-VvBI5iF1OadOpoIKMuocE479tPmxJ7Af80v5zXDAxsqyEdEk3ZDYeDRb6W+SCiN1Uiur6j1iW0OxQ5JAQ/nIAQ=="
16102
16103
  },
16103
16104
  "@babel/runtime": {
16104
- "version": "7.20.7",
16105
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz",
16106
- "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==",
16105
+ "version": "7.20.13",
16106
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
16107
+ "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
16107
16108
  "requires": {
16108
16109
  "regenerator-runtime": "^0.13.11"
16109
16110
  }
@@ -16835,9 +16836,9 @@
16835
16836
  }
16836
16837
  },
16837
16838
  "acorn": {
16838
- "version": "8.8.1",
16839
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
16840
- "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
16839
+ "version": "8.8.2",
16840
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
16841
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw=="
16841
16842
  },
16842
16843
  "acorn-globals": {
16843
16844
  "version": "6.0.0",
@@ -17496,9 +17497,9 @@
17496
17497
  }
17497
17498
  },
17498
17499
  "axios-retry": {
17499
- "version": "3.3.1",
17500
- "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.3.1.tgz",
17501
- "integrity": "sha512-RohAUQTDxBSWLFEnoIG/6bvmy8l3TfpkclgStjl5MDCMBDgapAWCmr1r/9harQfWC8bzLC8job6UcL1A1Yc+/Q==",
17500
+ "version": "3.4.0",
17501
+ "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.4.0.tgz",
17502
+ "integrity": "sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA==",
17502
17503
  "requires": {
17503
17504
  "@babel/runtime": "^7.15.4",
17504
17505
  "is-retry-allowed": "^2.2.0"
@@ -19136,9 +19137,9 @@
19136
19137
  "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
19137
19138
  },
19138
19139
  "ua-parser-js": {
19139
- "version": "1.0.32",
19140
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.32.tgz",
19141
- "integrity": "sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA=="
19140
+ "version": "1.0.33",
19141
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz",
19142
+ "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ=="
19142
19143
  }
19143
19144
  }
19144
19145
  },
@@ -20303,9 +20304,9 @@
20303
20304
  "peer": true
20304
20305
  },
20305
20306
  "get-intrinsic": {
20306
- "version": "1.1.3",
20307
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
20308
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
20307
+ "version": "1.2.0",
20308
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
20309
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
20309
20310
  "requires": {
20310
20311
  "function-bind": "^1.1.1",
20311
20312
  "has": "^1.0.3",
@@ -25251,9 +25252,9 @@
25251
25252
  }
25252
25253
  },
25253
25254
  "punycode": {
25254
- "version": "2.2.0",
25255
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz",
25256
- "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw=="
25255
+ "version": "2.3.0",
25256
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
25257
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
25257
25258
  },
25258
25259
  "puppeteer-core": {
25259
25260
  "version": "13.7.0",
@@ -27217,9 +27218,9 @@
27217
27218
  "devOptional": true
27218
27219
  },
27219
27220
  "ua-parser-js": {
27220
- "version": "0.7.28",
27221
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
27222
- "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g=="
27221
+ "version": "0.7.33",
27222
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz",
27223
+ "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw=="
27223
27224
  },
27224
27225
  "unbzip2-stream": {
27225
27226
  "version": "1.4.3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testim/testim-cli",
3
- "version": "3.283.0",
3
+ "version": "3.285.0",
4
4
  "description": "Command line interface for running Testing on your CI",
5
5
  "author": "Oren Rubin",
6
6
  "contributors": [{
@@ -38,7 +38,7 @@
38
38
  "istanbul-lib-coverage": "3.0.0",
39
39
  "@bcoe/v8-coverage": "0.2.3",
40
40
  "convert-source-map": "1.7.0",
41
- "multer": "1.4.4"
41
+ "multer": "1.4.5-lts.1"
42
42
  },
43
43
  "dependencies": {
44
44
  "@applitools/eyes-sdk-core": "13.11.21",
@@ -94,7 +94,7 @@
94
94
  "superagent-proxy": "3.0.0",
95
95
  "test-exclude": "6.0.0",
96
96
  "threads": "0.12.0",
97
- "ua-parser-js": "0.7.28",
97
+ "ua-parser-js": "0.7.33",
98
98
  "validate-npm-package-name": "3.0.0",
99
99
  "webdriverio": "7.24.0",
100
100
  "winston": "3.6.0",
@@ -20,6 +20,7 @@ const LT_TUNNEL_BINARY_PATHNAME = {
20
20
  win32x64: 'windows/64bit/LT_Windows.zip',
21
21
  darwinia32: 'mac/32bit/LT_Mac.zip',
22
22
  darwinx64: 'mac/64bit/LT_Mac.zip',
23
+ darwinarm64: 'mac/64bit/LT_Mac.zip',
23
24
  linuxia32: 'linux/32bit/LT_Linux.zip',
24
25
  linuxx64: 'linux/64bit/LT_Linux.zip',
25
26
  freebsdia32: 'freebsd/32bit/LT_Freebsd.zip',
package/utils/fsUtils.js CHANGED
@@ -138,6 +138,25 @@ async function getEnginesVersionAsync() {
138
138
  }
139
139
  }
140
140
 
141
+ /**
142
+ * @param {string} src Source directory to copy its contents
143
+ * @param {string} dest Target directory to copy to
144
+ * @param {boolean} [createParentDirs=true] Whether to create parent directories
145
+ */
146
+ async function copyDir(src, dest, createParentDirs = true) {
147
+ const dirents = await fsPromises.readdir(src, { withFileTypes: true });
148
+ await fsPromises.mkdir(dest, { recursive: createParentDirs });
149
+ for (const item of dirents) {
150
+ const srcPath = path.join(src, item.name);
151
+ const destPath = path.join(dest, item.name);
152
+ if (item.isDirectory()) {
153
+ await copyDir(srcPath, destPath);
154
+ } else {
155
+ await fsPromises.copyFile(srcPath, destPath);
156
+ }
157
+ }
158
+ }
159
+
141
160
  module.exports = {
142
161
  getCliLocation,
143
162
  download,
@@ -151,4 +170,5 @@ module.exports = {
151
170
  getRunnerVersion,
152
171
  getEnginesVersion,
153
172
  getEnginesVersionAsync,
173
+ copyDir,
154
174
  };