@appium/support 2.61.1 → 3.0.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.
Files changed (59) hide show
  1. package/build/lib/console.d.ts +1 -1
  2. package/build/lib/console.js +169 -105
  3. package/build/lib/console.js.map +1 -1
  4. package/build/lib/env.js +142 -117
  5. package/build/lib/env.js.map +1 -1
  6. package/build/lib/fs.d.ts +9 -2
  7. package/build/lib/fs.d.ts.map +1 -1
  8. package/build/lib/fs.js +358 -246
  9. package/build/lib/fs.js.map +1 -1
  10. package/build/lib/image-util.js +139 -124
  11. package/build/lib/image-util.js.map +1 -1
  12. package/build/lib/index.js +64 -103
  13. package/build/lib/index.js.map +1 -1
  14. package/build/lib/log-internal.d.ts +4 -27
  15. package/build/lib/log-internal.d.ts.map +1 -1
  16. package/build/lib/log-internal.js +141 -123
  17. package/build/lib/log-internal.js.map +1 -1
  18. package/build/lib/logger.d.ts +1 -1
  19. package/build/lib/logger.d.ts.map +1 -1
  20. package/build/lib/logger.js +5 -14
  21. package/build/lib/logger.js.map +1 -1
  22. package/build/lib/logging.d.ts +3 -4
  23. package/build/lib/logging.d.ts.map +1 -1
  24. package/build/lib/logging.js +139 -110
  25. package/build/lib/logging.js.map +1 -1
  26. package/build/lib/mjpeg.js +169 -141
  27. package/build/lib/mjpeg.js.map +1 -1
  28. package/build/lib/mkdirp.js +7 -13
  29. package/build/lib/mkdirp.js.map +1 -1
  30. package/build/lib/net.d.ts.map +1 -1
  31. package/build/lib/net.js +278 -254
  32. package/build/lib/net.js.map +1 -1
  33. package/build/lib/node.js +203 -192
  34. package/build/lib/node.js.map +1 -1
  35. package/build/lib/npm.d.ts +19 -4
  36. package/build/lib/npm.d.ts.map +1 -1
  37. package/build/lib/npm.js +277 -228
  38. package/build/lib/npm.js.map +1 -1
  39. package/build/lib/plist.js +145 -136
  40. package/build/lib/plist.js.map +1 -1
  41. package/build/lib/process.js +41 -42
  42. package/build/lib/process.js.map +1 -1
  43. package/build/lib/system.js +39 -56
  44. package/build/lib/system.js.map +1 -1
  45. package/build/lib/tempdir.js +112 -73
  46. package/build/lib/tempdir.js.map +1 -1
  47. package/build/lib/timing.js +99 -84
  48. package/build/lib/timing.js.map +1 -1
  49. package/build/lib/util.js +454 -356
  50. package/build/lib/util.js.map +1 -1
  51. package/build/lib/zip.js +469 -423
  52. package/build/lib/zip.js.map +1 -1
  53. package/build/tsconfig.tsbuildinfo +1 -1
  54. package/lib/fs.js +15 -1
  55. package/lib/log-internal.js +12 -16
  56. package/lib/logging.js +2 -3
  57. package/lib/net.js +15 -6
  58. package/lib/npm.js +28 -18
  59. package/package.json +19 -18
package/build/lib/npm.js CHANGED
@@ -1,242 +1,291 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
2
+ // @ts-check
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
5
18
  });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
6
30
  exports.npm = exports.NPM = exports.INSTALL_LOCKFILE_RELATIVE_PATH = exports.CACHE_DIR_RELATIVE_PATH = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _path = _interopRequireDefault(require("path"));
11
-
12
- var _semver = _interopRequireDefault(require("semver"));
13
-
14
- var _env = require("./env");
15
-
16
- var _teen_process = require("teen_process");
17
-
18
- var _fs = require("./fs");
19
-
20
- var util = _interopRequireWildcard(require("./util"));
21
-
22
- var system = _interopRequireWildcard(require("./system"));
23
-
24
- var _resolveFrom = _interopRequireDefault(require("resolve-from"));
25
-
26
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
-
28
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
-
30
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
-
32
- const CACHE_DIR_RELATIVE_PATH = _path.default.join('node_modules', '.cache', 'appium');
33
-
34
- exports.CACHE_DIR_RELATIVE_PATH = CACHE_DIR_RELATIVE_PATH;
35
-
36
- const INSTALL_LOCKFILE_RELATIVE_PATH = _path.default.join(CACHE_DIR_RELATIVE_PATH, '.install.lock');
37
-
38
- exports.INSTALL_LOCKFILE_RELATIVE_PATH = INSTALL_LOCKFILE_RELATIVE_PATH;
39
-
31
+ const path_1 = __importDefault(require("path"));
32
+ const semver_1 = __importDefault(require("semver"));
33
+ const env_1 = require("./env");
34
+ const teen_process_1 = require("teen_process");
35
+ const fs_1 = require("./fs");
36
+ const util = __importStar(require("./util"));
37
+ const system = __importStar(require("./system"));
38
+ const resolve_from_1 = __importDefault(require("resolve-from"));
39
+ /**
40
+ * Relative path to directory containing any Appium internal files
41
+ * XXX: this is duplicated in `appium/lib/constants.js`.
42
+ */
43
+ exports.CACHE_DIR_RELATIVE_PATH = path_1.default.join('node_modules', '.cache', 'appium');
44
+ /**
45
+ * Relative path to lockfile used when installing an extension via `appium`
46
+ */
47
+ exports.INSTALL_LOCKFILE_RELATIVE_PATH = path_1.default.join(exports.CACHE_DIR_RELATIVE_PATH, '.install.lock');
48
+ /**
49
+ * XXX: This should probably be a singleton, but it isn't. Maybe this module should just export functions?
50
+ */
40
51
  class NPM {
41
- _getInstallLockfilePath(cwd) {
42
- return _path.default.join(cwd, INSTALL_LOCKFILE_RELATIVE_PATH);
43
- }
44
-
45
- async exec(cmd, args, opts, execOpts = {}) {
46
- let {
47
- cwd,
48
- json,
49
- lockFile
50
- } = opts;
51
- const teenProcessExecOpts = { ...execOpts,
52
- cwd
53
- };
54
- args.unshift(cmd);
55
-
56
- if (json) {
57
- args.push('--json');
58
- }
59
-
60
- const npmCmd = system.isWindows() ? 'npm.cmd' : 'npm';
61
-
62
- let runner = async () => await (0, _teen_process.exec)(npmCmd, args, teenProcessExecOpts);
63
-
64
- if (lockFile) {
65
- const acquireLock = util.getLockFileGuard(lockFile);
66
- const _runner = runner;
67
-
68
- runner = async () => await acquireLock(_runner);
69
- }
70
-
71
- let ret;
72
-
73
- try {
74
- const {
75
- stdout,
76
- stderr,
77
- code
78
- } = await runner();
79
- ret = {
80
- stdout,
81
- stderr,
82
- code
83
- };
84
-
85
- try {
86
- ret.json = JSON.parse(stdout);
87
- } catch (ign) {}
88
- } catch (e) {
89
- const {
90
- stdout = '',
91
- stderr = '',
92
- code = null
93
- } = e;
94
- const err = new Error(`npm command '${args.join(' ')}' failed with code ${code}.\n\nSTDOUT:\n${stdout.trim()}\n\nSTDERR:\n${stderr.trim()}`);
95
- throw err;
96
- }
97
-
98
- return ret;
99
- }
100
-
101
- async getLatestVersion(cwd, pkg) {
102
- try {
103
- var _await$this$exec$json;
104
-
105
- return ((_await$this$exec$json = (await this.exec('view', [pkg, 'dist-tags'], {
106
- json: true,
107
- cwd
108
- })).json) === null || _await$this$exec$json === void 0 ? void 0 : _await$this$exec$json.latest) ?? null;
109
- } catch (err) {
110
- if (!(err !== null && err !== void 0 && err.message.includes('E404'))) {
111
- throw err;
112
- }
113
-
114
- return null;
115
- }
116
- }
117
-
118
- async getLatestSafeUpgradeVersion(cwd, pkg, curVersion) {
119
- try {
120
- const allVersions = (await this.exec('view', [pkg, 'versions'], {
121
- json: true,
122
- cwd
123
- })).json;
124
- return this.getLatestSafeUpgradeFromVersions(curVersion, allVersions);
125
- } catch (err) {
126
- if (!(err !== null && err !== void 0 && err.message.includes('E404'))) {
127
- throw err;
128
- }
129
-
130
- return null;
52
+ /**
53
+ * Returns path to "install" lockfile
54
+ * @private
55
+ * @param {string} cwd
56
+ */
57
+ _getInstallLockfilePath(cwd) {
58
+ return path_1.default.join(cwd, exports.INSTALL_LOCKFILE_RELATIVE_PATH);
131
59
  }
132
- }
133
-
134
- async list(cwd, pkg) {
135
- return (await this.exec('list', pkg ? [pkg] : [], {
136
- cwd,
137
- json: true
138
- })).json;
139
- }
140
-
141
- getLatestSafeUpgradeFromVersions(curVersion, allVersions) {
142
- let safeUpgradeVer = null;
143
-
144
- const curSemver = _semver.default.parse(curVersion);
145
-
146
- if (curSemver === null) {
147
- throw new Error(`Could not parse current version '${curVersion}'`);
60
+ /**
61
+ * Execute `npm` with given args.
62
+ *
63
+ * If the process exits with a nonzero code, the contents of `STDOUT` and `STDERR` will be in the
64
+ * `message` of any rejected error.
65
+ * @param {string} cmd
66
+ * @param {string[]} args
67
+ * @param {ExecOpts} opts
68
+ * @param {Omit<TeenProcessExecOptions, 'cwd'>} [execOpts]
69
+ */
70
+ async exec(cmd, args, opts, execOpts = {}) {
71
+ let { cwd, json, lockFile } = opts;
72
+ // make sure we perform the current operation in cwd
73
+ /** @type {TeenProcessExecOptions} */
74
+ const teenProcessExecOpts = { ...execOpts, cwd };
75
+ args.unshift(cmd);
76
+ if (json) {
77
+ args.push('--json');
78
+ }
79
+ const npmCmd = system.isWindows() ? 'npm.cmd' : 'npm';
80
+ let runner = async () => await (0, teen_process_1.exec)(npmCmd, args, teenProcessExecOpts);
81
+ if (lockFile) {
82
+ const acquireLock = util.getLockFileGuard(lockFile);
83
+ const _runner = runner;
84
+ runner = async () => await acquireLock(_runner);
85
+ }
86
+ /** @type {import('teen_process').TeenProcessExecResult<string> & {json?: any}} */
87
+ let ret;
88
+ try {
89
+ const { stdout, stderr, code } = await runner();
90
+ ret = { stdout, stderr, code };
91
+ // if possible, parse NPM's json output. During NPM install 3rd-party
92
+ // packages can write to stdout, so sometimes the json output can't be
93
+ // guaranteed to be parseable
94
+ try {
95
+ ret.json = JSON.parse(stdout);
96
+ }
97
+ catch (ign) { }
98
+ }
99
+ catch (e) {
100
+ const { stdout = '', stderr = '', code = null, } = /** @type {import('teen_process').ExecError} */ (e);
101
+ const err = new Error(`npm command '${args.join(' ')}' failed with code ${code}.\n\nSTDOUT:\n${stdout.trim()}\n\nSTDERR:\n${stderr.trim()}`);
102
+ throw err;
103
+ }
104
+ return ret;
148
105
  }
149
-
150
- for (const testVer of allVersions) {
151
- const testSemver = _semver.default.parse(testVer);
152
-
153
- if (testSemver === null) {
154
- throw new Error(`Could not parse version to test against: '${testVer}'`);
155
- }
156
-
157
- if (testSemver.prerelease.length > 0) {
158
- continue;
159
- }
160
-
161
- if (curSemver.compare(testSemver) === 1) {
162
- continue;
163
- }
164
-
165
- if (testSemver.major > curSemver.major) {
166
- continue;
167
- }
168
-
169
- if (safeUpgradeVer === null || testSemver.compare(safeUpgradeVer) === 1) {
170
- safeUpgradeVer = testSemver;
171
- }
106
+ /**
107
+ * @param {string} cwd
108
+ * @param {string} pkg
109
+ * @returns {Promise<string?>}
110
+ */
111
+ async getLatestVersion(cwd, pkg) {
112
+ try {
113
+ return ((await this.exec('view', [pkg, 'dist-tags'], {
114
+ json: true,
115
+ cwd,
116
+ })).json?.latest ?? null);
117
+ }
118
+ catch (err) {
119
+ if (!err?.message.includes('E404')) {
120
+ throw err;
121
+ }
122
+ return null;
123
+ }
172
124
  }
173
-
174
- if (safeUpgradeVer) {
175
- safeUpgradeVer = safeUpgradeVer.format();
125
+ /**
126
+ * @param {string} cwd
127
+ * @param {string} pkg
128
+ * @param {string} curVersion
129
+ * @returns {Promise<string?>}
130
+ */
131
+ async getLatestSafeUpgradeVersion(cwd, pkg, curVersion) {
132
+ try {
133
+ const allVersions = (await this.exec('view', [pkg, 'versions'], {
134
+ json: true,
135
+ cwd,
136
+ })).json;
137
+ return this.getLatestSafeUpgradeFromVersions(curVersion, allVersions);
138
+ }
139
+ catch (err) {
140
+ if (!err?.message.includes('E404')) {
141
+ throw err;
142
+ }
143
+ return null;
144
+ }
176
145
  }
177
-
178
- return safeUpgradeVer;
179
- }
180
-
181
- async installPackage(cwd, pkgName, {
182
- pkgVer
183
- } = {}) {
184
- let dummyPkgJson;
185
-
186
- const dummyPkgPath = _path.default.join(cwd, 'package.json');
187
-
188
- try {
189
- dummyPkgJson = JSON.parse(await _fs.fs.readFile(dummyPkgPath, 'utf8'));
190
- } catch (err) {
191
- if (err.code === 'ENOENT') {
192
- dummyPkgJson = {};
193
- await _fs.fs.writeFile(dummyPkgPath, JSON.stringify(dummyPkgJson, null, 2), 'utf8');
194
- } else {
195
- throw err;
196
- }
146
+ /**
147
+ * Runs `npm ls`, optionally for a particular package.
148
+ * @param {string} cwd
149
+ * @param {string} [pkg]
150
+ */
151
+ async list(cwd, pkg) {
152
+ return (await this.exec('list', pkg ? [pkg] : [], { cwd, json: true })).json;
197
153
  }
198
-
199
- const installOpts = ['--save-dev'];
200
-
201
- if (!(await (0, _env.hasAppiumDependency)(cwd))) {
202
- if (process.env.APPIUM_OMIT_PEER_DEPS) {
203
- installOpts.push('--omit=peer');
204
- }
205
-
206
- installOpts.push('--save-exact', '--global-style', '--no-package-lock');
154
+ /**
155
+ * Given a current version and a list of all versions for a package, return the version which is
156
+ * the highest safely-upgradable version (meaning not crossing any major revision boundaries, and
157
+ * not including any alpha/beta/rc versions)
158
+ *
159
+ * @param {string} curVersion - the current version of a package
160
+ * @param {Array<string>} allVersions - a list of version strings
161
+ *
162
+ * @return {string|null} - the highest safely-upgradable version, or null if there isn't one
163
+ */
164
+ getLatestSafeUpgradeFromVersions(curVersion, allVersions) {
165
+ let safeUpgradeVer = null;
166
+ const curSemver = semver_1.default.parse(curVersion) ?? semver_1.default.parse(semver_1.default.coerce(curVersion));
167
+ if (curSemver === null) {
168
+ throw new Error(`Could not parse current version '${curVersion}'`);
169
+ }
170
+ for (const testVer of allVersions) {
171
+ const testSemver = semver_1.default.parse(testVer) ?? semver_1.default.parse(semver_1.default.coerce(testVer));
172
+ if (testSemver === null) {
173
+ continue;
174
+ }
175
+ // if the test version is a prerelease, ignore it
176
+ if (testSemver.prerelease.length > 0) {
177
+ continue;
178
+ }
179
+ // if the current version is later than the test version, skip this test version
180
+ if (curSemver.compare(testSemver) === 1) {
181
+ continue;
182
+ }
183
+ // if the test version is newer, but crosses a major revision boundary, also skip it
184
+ if (testSemver.major > curSemver.major) {
185
+ continue;
186
+ }
187
+ // otherwise this version is safe to upgrade to. But there might be multiple ones of this
188
+ // kind, so keep iterating and keeping the highest
189
+ if (safeUpgradeVer === null || testSemver.compare(safeUpgradeVer) === 1) {
190
+ safeUpgradeVer = testSemver;
191
+ }
192
+ }
193
+ if (safeUpgradeVer) {
194
+ safeUpgradeVer = safeUpgradeVer.format();
195
+ }
196
+ return safeUpgradeVer;
207
197
  }
208
-
209
- const res = await this.exec('install', [...installOpts, pkgVer ? `${pkgName}@${pkgVer}` : pkgName], {
210
- cwd,
211
- json: true,
212
- lockFile: this._getInstallLockfilePath(cwd)
213
- });
214
-
215
- if (res.json) {
216
- if (res.json.error) {
217
- throw new Error(res.json.error);
218
- }
198
+ /**
199
+ * Installs a package w/ `npm`
200
+ * @param {string} cwd
201
+ * @param {string} pkgName
202
+ * @param {InstallPackageOpts} [opts]
203
+ * @returns {Promise<NpmInstallReceipt>}
204
+ */
205
+ async installPackage(cwd, pkgName, { pkgVer, installType }) {
206
+ /** @type {any} */
207
+ let dummyPkgJson;
208
+ const dummyPkgPath = path_1.default.join(cwd, 'package.json');
209
+ try {
210
+ dummyPkgJson = JSON.parse(await fs_1.fs.readFile(dummyPkgPath, 'utf8'));
211
+ }
212
+ catch (err) {
213
+ if (err.code === 'ENOENT') {
214
+ dummyPkgJson = {};
215
+ await fs_1.fs.writeFile(dummyPkgPath, JSON.stringify(dummyPkgJson, null, 2), 'utf8');
216
+ }
217
+ else {
218
+ throw err;
219
+ }
220
+ }
221
+ const installOpts = ['--save-dev'];
222
+ if (!(await (0, env_1.hasAppiumDependency)(cwd))) {
223
+ if (process.env.APPIUM_OMIT_PEER_DEPS) {
224
+ installOpts.push('--omit=peer');
225
+ }
226
+ installOpts.push('--save-exact', '--global-style', '--no-package-lock');
227
+ }
228
+ const cmd = installType === 'local' ? 'link' : 'install';
229
+ const res = await this.exec(cmd, [...installOpts, pkgVer ? `${pkgName}@${pkgVer}` : pkgName], {
230
+ cwd,
231
+ json: true,
232
+ lockFile: this._getInstallLockfilePath(cwd),
233
+ });
234
+ if (res.json) {
235
+ // we parsed a valid json response, so if we got an error here, return that
236
+ // message straightaway
237
+ if (res.json.error) {
238
+ throw new Error(res.json.error);
239
+ }
240
+ }
241
+ // Now read package data from the installed package to return, and make sure
242
+ // everything got installed ok. Remember, pkgName might end up with a / in it due to an npm
243
+ // org, so if so, that will get correctly exploded into multiple directories, by path.resolve here
244
+ // (even on Windows!)
245
+ const pkgJsonPath = (0, resolve_from_1.default)(cwd, `${pkgName}/package.json`);
246
+ try {
247
+ const pkgJson = await fs_1.fs.readFile(pkgJsonPath, 'utf8');
248
+ const pkg = JSON.parse(pkgJson);
249
+ return { installPath: path_1.default.dirname(pkgJsonPath), pkg };
250
+ }
251
+ catch {
252
+ throw new Error('The package was not downloaded correctly; its package.json ' +
253
+ 'did not exist or was unreadable. We looked for it at ' +
254
+ pkgJsonPath);
255
+ }
219
256
  }
220
-
221
- const pkgJsonPath = (0, _resolveFrom.default)(cwd, `${pkgName}/package.json`);
222
-
223
- try {
224
- return require(pkgJsonPath);
225
- } catch {
226
- throw new Error('The package was not downloaded correctly; its package.json ' + 'did not exist or was unreadable. We looked for it at ' + pkgJsonPath);
257
+ /**
258
+ * @param {string} cwd
259
+ * @param {string} pkg
260
+ */
261
+ async uninstallPackage(cwd, pkg) {
262
+ await this.exec('uninstall', [pkg], {
263
+ cwd,
264
+ lockFile: this._getInstallLockfilePath(cwd),
265
+ });
227
266
  }
228
- }
229
-
230
- async uninstallPackage(cwd, pkg) {
231
- await this.exec('uninstall', [pkg], {
232
- cwd,
233
- lockFile: this._getInstallLockfilePath(cwd)
234
- });
235
- }
236
-
237
267
  }
238
-
239
268
  exports.NPM = NPM;
240
- const npm = new NPM();
241
- exports.npm = npm;
242
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDQUNIRV9ESVJfUkVMQVRJVkVfUEFUSCIsInBhdGgiLCJqb2luIiwiSU5TVEFMTF9MT0NLRklMRV9SRUxBVElWRV9QQVRIIiwiTlBNIiwiX2dldEluc3RhbGxMb2NrZmlsZVBhdGgiLCJjd2QiLCJleGVjIiwiY21kIiwiYXJncyIsIm9wdHMiLCJleGVjT3B0cyIsImpzb24iLCJsb2NrRmlsZSIsInRlZW5Qcm9jZXNzRXhlY09wdHMiLCJ1bnNoaWZ0IiwicHVzaCIsIm5wbUNtZCIsInN5c3RlbSIsImlzV2luZG93cyIsInJ1bm5lciIsImFjcXVpcmVMb2NrIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJfcnVubmVyIiwicmV0Iiwic3Rkb3V0Iiwic3RkZXJyIiwiY29kZSIsIkpTT04iLCJwYXJzZSIsImlnbiIsImUiLCJlcnIiLCJFcnJvciIsInRyaW0iLCJnZXRMYXRlc3RWZXJzaW9uIiwicGtnIiwibGF0ZXN0IiwibWVzc2FnZSIsImluY2x1ZGVzIiwiZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uIiwiY3VyVmVyc2lvbiIsImFsbFZlcnNpb25zIiwiZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVGcm9tVmVyc2lvbnMiLCJsaXN0Iiwic2FmZVVwZ3JhZGVWZXIiLCJjdXJTZW12ZXIiLCJzZW12ZXIiLCJ0ZXN0VmVyIiwidGVzdFNlbXZlciIsInByZXJlbGVhc2UiLCJsZW5ndGgiLCJjb21wYXJlIiwibWFqb3IiLCJmb3JtYXQiLCJpbnN0YWxsUGFja2FnZSIsInBrZ05hbWUiLCJwa2dWZXIiLCJkdW1teVBrZ0pzb24iLCJkdW1teVBrZ1BhdGgiLCJmcyIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwiaW5zdGFsbE9wdHMiLCJoYXNBcHBpdW1EZXBlbmRlbmN5IiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9PTUlUX1BFRVJfREVQUyIsInJlcyIsImVycm9yIiwicGtnSnNvblBhdGgiLCJyZXNvbHZlRnJvbSIsInJlcXVpcmUiLCJ1bmluc3RhbGxQYWNrYWdlIiwibnBtIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL25wbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge2hhc0FwcGl1bURlcGVuZGVuY3l9IGZyb20gJy4vZW52JztcbmltcG9ydCB7ZXhlY30gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7ZnN9IGZyb20gJy4vZnMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0ICogYXMgc3lzdGVtIGZyb20gJy4vc3lzdGVtJztcbmltcG9ydCByZXNvbHZlRnJvbSBmcm9tICdyZXNvbHZlLWZyb20nO1xuXG4vKipcbiAqIFJlbGF0aXZlIHBhdGggdG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgYW55IEFwcGl1bSBpbnRlcm5hbCBmaWxlc1xuICogWFhYOiB0aGlzIGlzIGR1cGxpY2F0ZWQgaW4gYGFwcGl1bS9saWIvY29uc3RhbnRzLmpzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IENBQ0hFX0RJUl9SRUxBVElWRV9QQVRIID0gcGF0aC5qb2luKCdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2FwcGl1bScpO1xuXG4vKipcbiAqIFJlbGF0aXZlIHBhdGggdG8gbG9ja2ZpbGUgdXNlZCB3aGVuIGluc3RhbGxpbmcgYW4gZXh0ZW5zaW9uIHZpYSBgYXBwaXVtYFxuICovXG5leHBvcnQgY29uc3QgSU5TVEFMTF9MT0NLRklMRV9SRUxBVElWRV9QQVRIID0gcGF0aC5qb2luKENBQ0hFX0RJUl9SRUxBVElWRV9QQVRILCAnLmluc3RhbGwubG9jaycpO1xuXG4vKipcbiAqIFhYWDogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgYSBzaW5nbGV0b24sIGJ1dCBpdCBpc24ndC4gIE1heWJlIHRoaXMgbW9kdWxlIHNob3VsZCBqdXN0IGV4cG9ydCBmdW5jdGlvbnM/XG4gKi9cbmV4cG9ydCBjbGFzcyBOUE0ge1xuICAvKipcbiAgICogUmV0dXJucyBwYXRoIHRvIFwiaW5zdGFsbFwiIGxvY2tmaWxlXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjd2RcbiAgICovXG4gIF9nZXRJbnN0YWxsTG9ja2ZpbGVQYXRoKGN3ZCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oY3dkLCBJTlNUQUxMX0xPQ0tGSUxFX1JFTEFUSVZFX1BBVEgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYG5wbWAgd2l0aCBnaXZlbiBhcmdzLlxuICAgKlxuICAgKiBJZiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uemVybyBjb2RlLCB0aGUgY29udGVudHMgb2YgYFNURE9VVGAgYW5kIGBTVERFUlJgIHdpbGwgYmUgaW4gdGhlXG4gICAqIGBtZXNzYWdlYCBvZiBhbnkgcmVqZWN0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJnc1xuICAgKiBAcGFyYW0ge0V4ZWNPcHRzfSBvcHRzXG4gICAqIEBwYXJhbSB7T21pdDxpbXBvcnQoJ3RlZW5fcHJvY2VzcycpLkV4ZWNPcHRpb25zLCAnY3dkJz59IFtleGVjT3B0c11cbiAgICovXG4gIGFzeW5jIGV4ZWMoY21kLCBhcmdzLCBvcHRzLCBleGVjT3B0cyA9IHt9KSB7XG4gICAgbGV0IHtjd2QsIGpzb24sIGxvY2tGaWxlfSA9IG9wdHM7XG5cbiAgICAvLyBtYWtlIHN1cmUgd2UgcGVyZm9ybSB0aGUgY3VycmVudCBvcGVyYXRpb24gaW4gY3dkXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3RlZW5fcHJvY2VzcycpLkV4ZWNPcHRpb25zfSAqL1xuICAgIGNvbnN0IHRlZW5Qcm9jZXNzRXhlY09wdHMgPSB7Li4uZXhlY09wdHMsIGN3ZH07XG5cbiAgICBhcmdzLnVuc2hpZnQoY21kKTtcbiAgICBpZiAoanNvbikge1xuICAgICAgYXJncy5wdXNoKCctLWpzb24nKTtcbiAgICB9XG4gICAgY29uc3QgbnBtQ21kID0gc3lzdGVtLmlzV2luZG93cygpID8gJ25wbS5jbWQnIDogJ25wbSc7XG4gICAgbGV0IHJ1bm5lciA9IGFzeW5jICgpID0+IGF3YWl0IGV4ZWMobnBtQ21kLCBhcmdzLCB0ZWVuUHJvY2Vzc0V4ZWNPcHRzKTtcbiAgICBpZiAobG9ja0ZpbGUpIHtcbiAgICAgIGNvbnN0IGFjcXVpcmVMb2NrID0gdXRpbC5nZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlKTtcbiAgICAgIGNvbnN0IF9ydW5uZXIgPSBydW5uZXI7XG4gICAgICBydW5uZXIgPSBhc3luYyAoKSA9PiBhd2FpdCBhY3F1aXJlTG9jayhfcnVubmVyKTtcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge2ltcG9ydCgndGVlbl9wcm9jZXNzJykuRXhlY1Jlc3VsdDxzdHJpbmc+ICYge2pzb24/OiBhbnl9fSAqL1xuICAgIGxldCByZXQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVyciwgY29kZX0gPSBhd2FpdCBydW5uZXIoKTtcbiAgICAgIHJldCA9IHtzdGRvdXQsIHN0ZGVyciwgY29kZX07XG4gICAgICAvLyBpZiBwb3NzaWJsZSwgcGFyc2UgTlBNJ3MganNvbiBvdXRwdXQuIER1cmluZyBOUE0gaW5zdGFsbCAzcmQtcGFydHlcbiAgICAgIC8vIHBhY2thZ2VzIGNhbiB3cml0ZSB0byBzdGRvdXQsIHNvIHNvbWV0aW1lcyB0aGUganNvbiBvdXRwdXQgY2FuJ3QgYmVcbiAgICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgcGFyc2VhYmxlXG4gICAgICB0cnkge1xuICAgICAgICByZXQuanNvbiA9IEpTT04ucGFyc2Uoc3Rkb3V0KTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0ZG91dCA9ICcnLFxuICAgICAgICBzdGRlcnIgPSAnJyxcbiAgICAgICAgY29kZSA9IG51bGwsXG4gICAgICB9ID0gLyoqIEB0eXBlIHtpbXBvcnQoJ3RlZW5fcHJvY2VzcycpLkV4ZWNFcnJvcn0gKi8gKGUpO1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICBgbnBtIGNvbW1hbmQgJyR7YXJncy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfScgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9LlxcblxcblNURE9VVDpcXG4ke3N0ZG91dC50cmltKCl9XFxuXFxuU1RERVJSOlxcbiR7c3RkZXJyLnRyaW0oKX1gXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjd2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc/Pn1cbiAgICovXG4gIGFzeW5jIGdldExhdGVzdFZlcnNpb24oY3dkLCBwa2cpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKFxuICAgICAgICAgIGF3YWl0IHRoaXMuZXhlYygndmlldycsIFtwa2csICdkaXN0LXRhZ3MnXSwge1xuICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICB9KVxuICAgICAgICApLmpzb24/LmxhdGVzdCA/PyBudWxsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKCFlcnI/Lm1lc3NhZ2UuaW5jbHVkZXMoJ0U0MDQnKSkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN3ZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtnXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJWZXJzaW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz8+fVxuICAgKi9cbiAgYXN5bmMgZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uKGN3ZCwgcGtnLCBjdXJWZXJzaW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFsbFZlcnNpb25zID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWMoJ3ZpZXcnLCBbcGtnLCAndmVyc2lvbnMnXSwge1xuICAgICAgICAgIGpzb246IHRydWUsXG4gICAgICAgICAgY3dkLFxuICAgICAgICB9KVxuICAgICAgKS5qc29uO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVGcm9tVmVyc2lvbnMoY3VyVmVyc2lvbiwgYWxsVmVyc2lvbnMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKCFlcnI/Lm1lc3NhZ2UuaW5jbHVkZXMoJ0U0MDQnKSkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBgbnBtIGxzYCwgb3B0aW9uYWxseSBmb3IgYSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjd2RcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwa2ddXG4gICAqL1xuICBhc3luYyBsaXN0KGN3ZCwgcGtnKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmV4ZWMoJ2xpc3QnLCBwa2cgPyBbcGtnXSA6IFtdLCB7Y3dkLCBqc29uOiB0cnVlfSkpLmpzb247XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBjdXJyZW50IHZlcnNpb24gYW5kIGEgbGlzdCBvZiBhbGwgdmVyc2lvbnMgZm9yIGEgcGFja2FnZSwgcmV0dXJuIHRoZSB2ZXJzaW9uIHdoaWNoIGlzXG4gICAqIHRoZSBoaWdoZXN0IHNhZmVseS11cGdyYWRhYmxlIHZlcnNpb24gKG1lYW5pbmcgbm90IGNyb3NzaW5nIGFueSBtYWpvciByZXZpc2lvbiBib3VuZGFyaWVzLCBhbmRcbiAgICogbm90IGluY2x1ZGluZyBhbnkgYWxwaGEvYmV0YS9yYyB2ZXJzaW9ucylcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1clZlcnNpb24gLSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGEgcGFja2FnZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFsbFZlcnNpb25zIC0gYSBsaXN0IG9mIHZlcnNpb24gc3RyaW5nc1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH0gLSB0aGUgaGlnaGVzdCBzYWZlbHktdXBncmFkYWJsZSB2ZXJzaW9uLCBvciBudWxsIGlmIHRoZXJlIGlzbid0IG9uZVxuICAgKi9cbiAgZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVGcm9tVmVyc2lvbnMoY3VyVmVyc2lvbiwgYWxsVmVyc2lvbnMpIHtcbiAgICBsZXQgc2FmZVVwZ3JhZGVWZXIgPSBudWxsO1xuICAgIGNvbnN0IGN1clNlbXZlciA9IHNlbXZlci5wYXJzZShjdXJWZXJzaW9uKTtcbiAgICBpZiAoY3VyU2VtdmVyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwYXJzZSBjdXJyZW50IHZlcnNpb24gJyR7Y3VyVmVyc2lvbn0nYCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGVzdFZlciBvZiBhbGxWZXJzaW9ucykge1xuICAgICAgY29uc3QgdGVzdFNlbXZlciA9IHNlbXZlci5wYXJzZSh0ZXN0VmVyKTtcbiAgICAgIGlmICh0ZXN0U2VtdmVyID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHZlcnNpb24gdG8gdGVzdCBhZ2FpbnN0OiAnJHt0ZXN0VmVyfSdgKTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZSB0ZXN0IHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlLCBpZ25vcmUgaXRcbiAgICAgIGlmICh0ZXN0U2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgbGF0ZXIgdGhhbiB0aGUgdGVzdCB2ZXJzaW9uLCBza2lwIHRoaXMgdGVzdCB2ZXJzaW9uXG4gICAgICBpZiAoY3VyU2VtdmVyLmNvbXBhcmUodGVzdFNlbXZlcikgPT09IDEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgdGVzdCB2ZXJzaW9uIGlzIG5ld2VyLCBidXQgY3Jvc3NlcyBhIG1ham9yIHJldmlzaW9uIGJvdW5kYXJ5LCBhbHNvIHNraXAgaXRcbiAgICAgIGlmICh0ZXN0U2VtdmVyLm1ham9yID4gY3VyU2VtdmVyLm1ham9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gb3RoZXJ3aXNlIHRoaXMgdmVyc2lvbiBpcyBzYWZlIHRvIHVwZ3JhZGUgdG8uIEJ1dCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvbmVzIG9mIHRoaXNcbiAgICAgIC8vIGtpbmQsIHNvIGtlZXAgaXRlcmF0aW5nIGFuZCBrZWVwaW5nIHRoZSBoaWdoZXN0XG4gICAgICBpZiAoc2FmZVVwZ3JhZGVWZXIgPT09IG51bGwgfHwgdGVzdFNlbXZlci5jb21wYXJlKHNhZmVVcGdyYWRlVmVyKSA9PT0gMSkge1xuICAgICAgICBzYWZlVXBncmFkZVZlciA9IHRlc3RTZW12ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzYWZlVXBncmFkZVZlcikge1xuICAgICAgc2FmZVVwZ3JhZGVWZXIgPSBzYWZlVXBncmFkZVZlci5mb3JtYXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNhZmVVcGdyYWRlVmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIGEgcGFja2FnZSB3LyBgbnBtYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3dkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwa2dOYW1lXG4gICAqIEBwYXJhbSB7SW5zdGFsbFBhY2thZ2VPcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KCd0eXBlLWZlc3QnKS5QYWNrYWdlSnNvbj59XG4gICAqL1xuICBhc3luYyBpbnN0YWxsUGFja2FnZShjd2QsIHBrZ05hbWUsIHtwa2dWZXJ9ID0ge30pIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBsZXQgZHVtbXlQa2dKc29uO1xuICAgIGNvbnN0IGR1bW15UGtnUGF0aCA9IHBhdGguam9pbihjd2QsICdwYWNrYWdlLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgZHVtbXlQa2dKc29uID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShkdW1teVBrZ1BhdGgsICd1dGY4JykpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBkdW1teVBrZ0pzb24gPSB7fTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGR1bW15UGtnUGF0aCwgSlNPTi5zdHJpbmdpZnkoZHVtbXlQa2dKc29uLCBudWxsLCAyKSwgJ3V0ZjgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YWxsT3B0cyA9IFsnLS1zYXZlLWRldiddO1xuICAgIGlmICghKGF3YWl0IGhhc0FwcGl1bURlcGVuZGVuY3koY3dkKSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5BUFBJVU1fT01JVF9QRUVSX0RFUFMpIHtcbiAgICAgICAgaW5zdGFsbE9wdHMucHVzaCgnLS1vbWl0PXBlZXInKTtcbiAgICAgIH1cbiAgICAgIGluc3RhbGxPcHRzLnB1c2goJy0tc2F2ZS1leGFjdCcsICctLWdsb2JhbC1zdHlsZScsICctLW5vLXBhY2thZ2UtbG9jaycpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZXhlYyhcbiAgICAgICdpbnN0YWxsJyxcbiAgICAgIFsuLi5pbnN0YWxsT3B0cywgcGtnVmVyID8gYCR7cGtnTmFtZX1AJHtwa2dWZXJ9YCA6IHBrZ05hbWVdLFxuICAgICAge1xuICAgICAgICBjd2QsXG4gICAgICAgIGpzb246IHRydWUsXG4gICAgICAgIGxvY2tGaWxlOiB0aGlzLl9nZXRJbnN0YWxsTG9ja2ZpbGVQYXRoKGN3ZCksXG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmIChyZXMuanNvbikge1xuICAgICAgLy8gd2UgcGFyc2VkIGEgdmFsaWQganNvbiByZXNwb25zZSwgc28gaWYgd2UgZ290IGFuIGVycm9yIGhlcmUsIHJldHVybiB0aGF0XG4gICAgICAvLyBtZXNzYWdlIHN0cmFpZ2h0YXdheVxuICAgICAgaWYgKHJlcy5qc29uLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuanNvbi5lcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm93IHJlYWQgcGFja2FnZSBkYXRhIGZyb20gdGhlIGluc3RhbGxlZCBwYWNrYWdlIHRvIHJldHVybiwgYW5kIG1ha2Ugc3VyZVxuICAgIC8vIGV2ZXJ5dGhpbmcgZ290IGluc3RhbGxlZCBvay4gUmVtZW1iZXIsIHBrZ05hbWUgbWlnaHQgZW5kIHVwIHdpdGggYSAvIGluIGl0IGR1ZSB0byBhbiBucG1cbiAgICAvLyBvcmcsIHNvIGlmIHNvLCB0aGF0IHdpbGwgZ2V0IGNvcnJlY3RseSBleHBsb2RlZCBpbnRvIG11bHRpcGxlIGRpcmVjdG9yaWVzLCBieSBwYXRoLnJlc29sdmUgaGVyZVxuICAgIC8vIChldmVuIG9uIFdpbmRvd3MhKVxuICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcmVzb2x2ZUZyb20oY3dkLCBgJHtwa2dOYW1lfS9wYWNrYWdlLmpzb25gKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUocGtnSnNvblBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHBhY2thZ2Ugd2FzIG5vdCBkb3dubG9hZGVkIGNvcnJlY3RseTsgaXRzIHBhY2thZ2UuanNvbiAnICtcbiAgICAgICAgICAnZGlkIG5vdCBleGlzdCBvciB3YXMgdW5yZWFkYWJsZS4gV2UgbG9va2VkIGZvciBpdCBhdCAnICtcbiAgICAgICAgICBwa2dKc29uUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN3ZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtnXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGxQYWNrYWdlKGN3ZCwgcGtnKSB7XG4gICAgYXdhaXQgdGhpcy5leGVjKCd1bmluc3RhbGwnLCBbcGtnXSwge1xuICAgICAgY3dkLFxuICAgICAgbG9ja0ZpbGU6IHRoaXMuX2dldEluc3RhbGxMb2NrZmlsZVBhdGgoY3dkKSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbnBtID0gbmV3IE5QTSgpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBOUE0uaW5zdGFsbFBhY2thZ2V9XG4gKiBAdHlwZWRlZiBJbnN0YWxsUGFja2FnZU9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RhbGxcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBOUE0uZXhlY31cbiAqIEB0eXBlZGVmIEV4ZWNPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3dkIC0gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICogQHByb3BlcnR5IHtib29sZWFufSBbanNvbl0gLSBJZiBgdHJ1ZWAsIHN1cHBseSBgLS1qc29uYCBmbGFnIHRvIG5wbSBhbmQgcmVzb2x2ZSB3LyBwYXJzZWQgSlNPTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsb2NrRmlsZV0gLSBQYXRoIHRvIGxvY2tmaWxlIHRvIHVzZVxuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQU1PLE1BQU1BLHVCQUF1QixHQUFHQyxhQUFBLENBQUtDLElBQUwsQ0FBVSxjQUFW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
269
+ exports.npm = new NPM();
270
+ /**
271
+ * Options for {@link NPM.installPackage}
272
+ * @typedef InstallPackageOpts
273
+ * @property {import('type-fest').LiteralUnion<'local', string>} [installType] - whether to install from a local path or from npm
274
+ * @property {string} [pkgVer] - the version of the package to install
275
+ */
276
+ /**
277
+ * Options for {@link NPM.exec}
278
+ * @typedef ExecOpts
279
+ * @property {string} cwd - Current working directory
280
+ * @property {boolean} [json] - If `true`, supply `--json` flag to npm and resolve w/ parsed JSON
281
+ * @property {string} [lockFile] - Path to lockfile to use
282
+ */
283
+ /**
284
+ * @typedef {import('teen_process').TeenProcessExecOptions} TeenProcessExecOptions
285
+ */
286
+ /**
287
+ * @typedef NpmInstallReceipt
288
+ * @property {string} installPath - Path to installed package
289
+ * @property {import('type-fest').PackageJson} pkg - Package data
290
+ */
291
+ //# sourceMappingURL=npm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"npm.js","names":["CACHE_DIR_RELATIVE_PATH","path","join","INSTALL_LOCKFILE_RELATIVE_PATH","NPM","_getInstallLockfilePath","cwd","exec","cmd","args","opts","execOpts","json","lockFile","teenProcessExecOpts","unshift","push","npmCmd","system","isWindows","runner","acquireLock","util","getLockFileGuard","_runner","ret","stdout","stderr","code","JSON","parse","ign","e","err","Error","trim","getLatestVersion","pkg","latest","message","includes","getLatestSafeUpgradeVersion","curVersion","allVersions","getLatestSafeUpgradeFromVersions","list","safeUpgradeVer","curSemver","semver","testVer","testSemver","prerelease","length","compare","major","format","installPackage","pkgName","pkgVer","dummyPkgJson","dummyPkgPath","fs","readFile","writeFile","stringify","installOpts","hasAppiumDependency","process","env","APPIUM_OMIT_PEER_DEPS","res","error","pkgJsonPath","resolveFrom","require","uninstallPackage","npm"],"sources":["../../lib/npm.js"],"sourcesContent":["// @ts-check\n\nimport path from 'path';\nimport semver from 'semver';\nimport {hasAppiumDependency} from './env';\nimport {exec} from 'teen_process';\nimport {fs} from './fs';\nimport * as util from './util';\nimport * as system from './system';\nimport resolveFrom from 'resolve-from';\n\n/**\n * Relative path to directory containing any Appium internal files\n * XXX: this is duplicated in `appium/lib/constants.js`.\n */\nexport const CACHE_DIR_RELATIVE_PATH = path.join('node_modules', '.cache', 'appium');\n\n/**\n * Relative path to lockfile used when installing an extension via `appium`\n */\nexport const INSTALL_LOCKFILE_RELATIVE_PATH = path.join(CACHE_DIR_RELATIVE_PATH, '.install.lock');\n\n/**\n * XXX: This should probably be a singleton, but it isn't. Maybe this module should just export functions?\n */\nexport class NPM {\n /**\n * Returns path to \"install\" lockfile\n * @private\n * @param {string} cwd\n */\n _getInstallLockfilePath(cwd) {\n return path.join(cwd, INSTALL_LOCKFILE_RELATIVE_PATH);\n }\n\n /**\n * Execute `npm` with given args.\n *\n * If the process exits with a nonzero code, the contents of `STDOUT` and `STDERR` will be in the\n * `message` of any rejected error.\n * @param {string} cmd\n * @param {string[]} args\n * @param {ExecOpts} opts\n * @param {Omit<import('teen_process').ExecOptions, 'cwd'>} [execOpts]\n */\n async exec(cmd, args, opts, execOpts = {}) {\n let {cwd, json, lockFile} = opts;\n\n // make sure we perform the current operation in cwd\n /** @type {import('teen_process').ExecOptions} */\n const teenProcessExecOpts = {...execOpts, cwd};\n\n args.unshift(cmd);\n if (json) {\n args.push('--json');\n }\n const npmCmd = system.isWindows() ? 'npm.cmd' : 'npm';\n let runner = async () => await exec(npmCmd, args, teenProcessExecOpts);\n if (lockFile) {\n const acquireLock = util.getLockFileGuard(lockFile);\n const _runner = runner;\n runner = async () => await acquireLock(_runner);\n }\n\n /** @type {import('teen_process').ExecResult<string> & {json?: any}} */\n let ret;\n try {\n const {stdout, stderr, code} = await runner();\n ret = {stdout, stderr, code};\n // if possible, parse NPM's json output. During NPM install 3rd-party\n // packages can write to stdout, so sometimes the json output can't be\n // guaranteed to be parseable\n try {\n ret.json = JSON.parse(stdout);\n } catch (ign) {}\n } catch (e) {\n const {\n stdout = '',\n stderr = '',\n code = null,\n } = /** @type {import('teen_process').ExecError} */ (e);\n const err = new Error(\n `npm command '${args.join(\n ' '\n )}' failed with code ${code}.\\n\\nSTDOUT:\\n${stdout.trim()}\\n\\nSTDERR:\\n${stderr.trim()}`\n );\n throw err;\n }\n return ret;\n }\n\n /**\n * @param {string} cwd\n * @param {string} pkg\n * @returns {Promise<string?>}\n */\n async getLatestVersion(cwd, pkg) {\n try {\n return (\n (\n await this.exec('view', [pkg, 'dist-tags'], {\n json: true,\n cwd,\n })\n ).json?.latest ?? null\n );\n } catch (err) {\n if (!err?.message.includes('E404')) {\n throw err;\n }\n return null;\n }\n }\n\n /**\n * @param {string} cwd\n * @param {string} pkg\n * @param {string} curVersion\n * @returns {Promise<string?>}\n */\n async getLatestSafeUpgradeVersion(cwd, pkg, curVersion) {\n try {\n const allVersions = (\n await this.exec('view', [pkg, 'versions'], {\n json: true,\n cwd,\n })\n ).json;\n return this.getLatestSafeUpgradeFromVersions(curVersion, allVersions);\n } catch (err) {\n if (!err?.message.includes('E404')) {\n throw err;\n }\n return null;\n }\n }\n\n /**\n * Runs `npm ls`, optionally for a particular package.\n * @param {string} cwd\n * @param {string} [pkg]\n */\n async list(cwd, pkg) {\n return (await this.exec('list', pkg ? [pkg] : [], {cwd, json: true})).json;\n }\n\n /**\n * Given a current version and a list of all versions for a package, return the version which is\n * the highest safely-upgradable version (meaning not crossing any major revision boundaries, and\n * not including any alpha/beta/rc versions)\n *\n * @param {string} curVersion - the current version of a package\n * @param {Array<string>} allVersions - a list of version strings\n *\n * @return {string|null} - the highest safely-upgradable version, or null if there isn't one\n */\n getLatestSafeUpgradeFromVersions(curVersion, allVersions) {\n let safeUpgradeVer = null;\n const curSemver = semver.parse(curVersion);\n if (curSemver === null) {\n throw new Error(`Could not parse current version '${curVersion}'`);\n }\n for (const testVer of allVersions) {\n const testSemver = semver.parse(testVer);\n if (testSemver === null) {\n throw new Error(`Could not parse version to test against: '${testVer}'`);\n }\n // if the test version is a prerelease, ignore it\n if (testSemver.prerelease.length > 0) {\n continue;\n }\n // if the current version is later than the test version, skip this test version\n if (curSemver.compare(testSemver) === 1) {\n continue;\n }\n // if the test version is newer, but crosses a major revision boundary, also skip it\n if (testSemver.major > curSemver.major) {\n continue;\n }\n // otherwise this version is safe to upgrade to. But there might be multiple ones of this\n // kind, so keep iterating and keeping the highest\n if (safeUpgradeVer === null || testSemver.compare(safeUpgradeVer) === 1) {\n safeUpgradeVer = testSemver;\n }\n }\n if (safeUpgradeVer) {\n safeUpgradeVer = safeUpgradeVer.format();\n }\n return safeUpgradeVer;\n }\n\n /**\n * Installs a package w/ `npm`\n * @param {string} cwd\n * @param {string} pkgName\n * @param {InstallPackageOpts} [opts]\n * @returns {Promise<import('type-fest').PackageJson>}\n */\n async installPackage(cwd, pkgName, {pkgVer} = {}) {\n /** @type {any} */\n let dummyPkgJson;\n const dummyPkgPath = path.join(cwd, 'package.json');\n try {\n dummyPkgJson = JSON.parse(await fs.readFile(dummyPkgPath, 'utf8'));\n } catch (err) {\n if (err.code === 'ENOENT') {\n dummyPkgJson = {};\n await fs.writeFile(dummyPkgPath, JSON.stringify(dummyPkgJson, null, 2), 'utf8');\n } else {\n throw err;\n }\n }\n\n const installOpts = ['--save-dev'];\n if (!(await hasAppiumDependency(cwd))) {\n if (process.env.APPIUM_OMIT_PEER_DEPS) {\n installOpts.push('--omit=peer');\n }\n installOpts.push('--save-exact', '--global-style', '--no-package-lock');\n }\n\n const res = await this.exec(\n 'install',\n [...installOpts, pkgVer ? `${pkgName}@${pkgVer}` : pkgName],\n {\n cwd,\n json: true,\n lockFile: this._getInstallLockfilePath(cwd),\n }\n );\n\n if (res.json) {\n // we parsed a valid json response, so if we got an error here, return that\n // message straightaway\n if (res.json.error) {\n throw new Error(res.json.error);\n }\n }\n\n // Now read package data from the installed package to return, and make sure\n // everything got installed ok. Remember, pkgName might end up with a / in it due to an npm\n // org, so if so, that will get correctly exploded into multiple directories, by path.resolve here\n // (even on Windows!)\n const pkgJsonPath = resolveFrom(cwd, `${pkgName}/package.json`);\n try {\n return require(pkgJsonPath);\n } catch {\n throw new Error(\n 'The package was not downloaded correctly; its package.json ' +\n 'did not exist or was unreadable. We looked for it at ' +\n pkgJsonPath\n );\n }\n }\n\n /**\n * @param {string} cwd\n * @param {string} pkg\n */\n async uninstallPackage(cwd, pkg) {\n await this.exec('uninstall', [pkg], {\n cwd,\n lockFile: this._getInstallLockfilePath(cwd),\n });\n }\n}\n\nexport const npm = new NPM();\n\n/**\n * Options for {@link NPM.installPackage}\n * @typedef InstallPackageOpts\n * @property {string} [pkgVer] - the version of the package to install\n */\n\n/**\n * Options for {@link NPM.exec}\n * @typedef ExecOpts\n * @property {string} cwd - Current working directory\n * @property {boolean} [json] - If `true`, supply `--json` flag to npm and resolve w/ parsed JSON\n * @property {string} [lockFile] - Path to lockfile to use\n */\n"],"mappings":"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"}
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../lib/npm.js"],"names":[],"mappings":"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"}