appium-xcode 5.0.2 → 5.1.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.
- package/CHANGELOG.md +7 -0
- package/build/lib/helpers.d.ts +25 -0
- package/build/lib/helpers.d.ts.map +1 -0
- package/build/lib/helpers.js +1 -1
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/index.d.ts +16 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/{index.js → lib/index.js} +2 -2
- package/build/lib/index.js.map +1 -0
- package/build/lib/xcode.d.ts +111 -0
- package/build/lib/xcode.d.ts.map +1 -0
- package/build/lib/xcode.js +17 -11
- package/build/lib/xcode.js.map +1 -1
- package/lib/helpers.js +2 -2
- package/{index.js → lib/index.js} +5 -1
- package/lib/xcode.js +49 -31
- package/package.json +14 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [5.1.0](https://github.com/appium/appium-xcode/compare/v5.0.2...v5.1.0) (2023-04-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* ship type declarations ([94548ae](https://github.com/appium/appium-xcode/commit/94548ae4d3728b982d0e818efeedbd4b55ffc955))
|
|
7
|
+
|
|
1
8
|
## [5.0.2](https://github.com/appium/appium-xcode/compare/v5.0.1...v5.0.2) (2023-03-27)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executes 'xcrun' command line utility
|
|
3
|
+
*
|
|
4
|
+
* @param {string[]} args xcrun arguments
|
|
5
|
+
* @param {number} timeout [15000] The maximum number of milliseconds to wait until xcrun exists
|
|
6
|
+
* @returns {Promise<import("teen_process").TeenProcessExecResult>} The result of xcrun execution
|
|
7
|
+
* @throws {Error} If xcrun returned non-zero exit code or timed out
|
|
8
|
+
*/
|
|
9
|
+
export function runXcrunCommand(args: string[], timeout?: number): Promise<import("teen_process").TeenProcessExecResult<any>>;
|
|
10
|
+
/**
|
|
11
|
+
* Uses macOS Spotlight service to detect where the given app is installed
|
|
12
|
+
*
|
|
13
|
+
* @param {string} bundleId Bundle identifier of the target app
|
|
14
|
+
* @returns {Promise<string[]>} Full paths to where the app with the given bundle id is present.
|
|
15
|
+
*/
|
|
16
|
+
export function findAppPaths(bundleId: string): Promise<string[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Finds and retrieves the content of the Xcode's Info.plist file
|
|
19
|
+
*
|
|
20
|
+
* @param {string} developerRoot Full path to the Contents/Developer folder under Xcode.app root
|
|
21
|
+
* @returns {Promise<object>} All plist entries as an object or an empty object if no plist was found
|
|
22
|
+
*/
|
|
23
|
+
export function readXcodePlist(developerRoot: string): Promise<object>;
|
|
24
|
+
export const XCRUN_TIMEOUT: 15000;
|
|
25
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/helpers.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,sCALW,MAAM,EAAE,YACR,MAAM,GACJ,0DAAqD,CAcjE;AAED;;;;;GAKG;AACH,uCAHW,MAAM,GACJ,QAAQ,MAAM,EAAE,CAAC,CAyB7B;AAED;;;;;GAKG;AACH,8CAHW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAO3B;AAjED,kCAAmC"}
|
package/build/lib/helpers.js
CHANGED
|
@@ -52,4 +52,4 @@ async function readXcodePlist(developerRoot) {
|
|
|
52
52
|
const plistPath = _path.default.resolve(developerRoot, '..', 'Info.plist');
|
|
53
53
|
return (await _support.fs.exists(plistPath)) ? await _support.plist.parsePlistFile(plistPath) : {};
|
|
54
54
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYmx1ZWJpcmQiLCJfdGVlbl9wcm9jZXNzIiwiX3N1cHBvcnQiLCJfcGF0aCIsIlhDUlVOX1RJTUVPVVQiLCJleHBvcnRzIiwicnVuWGNydW5Db21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJleGVjIiwiZXJyIiwic3RkZXJyIiwibWVzc2FnZSIsImZpbmRBcHBQYXRocyIsImJ1bmRsZUlkIiwic3Rkb3V0IiwiZSIsIm1hdGNoZWRQYXRocyIsIl8iLCJ0cmltIiwic3BsaXQiLCJtYXAiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaXNFbXB0eSIsInJlc3VsdHMiLCJwIiwiZnMiLCJleGlzdHMiLCJCIiwiYWxsIiwicmVhZFhjb2RlUGxpc3QiLCJkZXZlbG9wZXJSb290IiwicGxpc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuXG4vKipcbiAqIEV4ZWN1dGVzICd4Y3J1bicgY29tbWFuZCBsaW5lIHV0aWxpdHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIHhjcnVuIGFyZ3VtZW50c1xuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgeGNydW4gZXhpc3RzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJ0ZWVuX3Byb2Nlc3NcIikuVGVlblByb2Nlc3NFeGVjUmVzdWx0Pn0gVGhlIHJlc3VsdCBvZiB4Y3J1biBleGVjdXRpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB4Y3J1biByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgb3IgdGltZWQgb3V0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5YY3J1bkNvbW1hbmQgKGFyZ3MsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWMoJ3hjcnVuJywgYXJncywge3RpbWVvdXR9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIHRydWUgZXJyb3IgY2FuIGJlIGhpZGRlbiB3aXRoaW4gdGhlIHN0ZGVyclxuICAgIGlmIChlcnIuc3RkZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2Vyci5tZXNzYWdlfTogJHtlcnIuc3RkZXJyfWA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogVXNlcyBtYWNPUyBTcG90bGlnaHQgc2VydmljZSB0byBkZXRlY3Qgd2hlcmUgdGhlIGdpdmVuIGFwcCBpcyBpbnN0YWxsZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWQgQnVuZGxlIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBhcHBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gRnVsbCBwYXRocyB0byB3aGVyZSB0aGUgYXBwIHdpdGggdGhlIGdpdmVuIGJ1bmRsZSBpZCBpcyBwcmVzZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEFwcFBhdGhzIChidW5kbGVJZCkge1xuICBsZXQgc3Rkb3V0O1xuICB0cnkge1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJy91c3IvYmluL21kZmluZCcsIFtcbiAgICAgIGBrTURJdGVtQ0ZCdW5kbGVJZGVudGlmaWVyPSR7YnVuZGxlSWR9YFxuICAgIF0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZWRQYXRocyA9IF8udHJpbShzdGRvdXQpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoXy50cmltKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChfLmlzRW1wdHkobWF0Y2hlZFBhdGhzKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gbWF0Y2hlZFBhdGhzLm1hcCgocCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHApKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH0pKCkpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8oYXdhaXQgQi5hbGwocmVzdWx0cykpLmZpbHRlcihCb29sZWFuKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbmQgcmV0cmlldmVzIHRoZSBjb250ZW50IG9mIHRoZSBYY29kZSdzIEluZm8ucGxpc3QgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZlbG9wZXJSb290IEZ1bGwgcGF0aCB0byB0aGUgQ29udGVudHMvRGV2ZWxvcGVyIGZvbGRlciB1bmRlciBYY29kZS5hcHAgcm9vdFxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gQWxsIHBsaXN0IGVudHJpZXMgYXMgYW4gb2JqZWN0IG9yIGFuIGVtcHR5IG9iamVjdCBpZiBubyBwbGlzdCB3YXMgZm91bmRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRYY29kZVBsaXN0IChkZXZlbG9wZXJSb290KSB7XG4gIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShkZXZlbG9wZXJSb290LCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuICByZXR1cm4gYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aClcbiAgICA/IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHBsaXN0UGF0aClcbiAgICA6IHt9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUVPLE1BQU1LLGFBQWEsR0FBRyxLQUFLO0FBQUNDLE9BQUEsQ0FBQUQsYUFBQSxHQUFBQSxhQUFBO0FBVTVCLGVBQWVFLGVBQWVBLENBQUVDLElBQUksRUFBRUMsT0FBTyxHQUFHSixhQUFhLEVBQUU7RUFDcEUsSUFBSTtJQUNGLE9BQU8sTUFBTSxJQUFBSyxrQkFBSSxFQUFDLE9BQU8sRUFBRUYsSUFBSSxFQUFFO01BQUNDO0lBQU8sQ0FBQyxDQUFDO0VBQzdDLENBQUMsQ0FBQyxPQUFPRSxHQUFHLEVBQUU7SUFFWixJQUFJQSxHQUFHLENBQUNDLE1BQU0sRUFBRTtNQUNkRCxHQUFHLENBQUNFLE9BQU8sR0FBSSxHQUFFRixHQUFHLENBQUNFLE9BQVEsS0FBSUYsR0FBRyxDQUFDQyxNQUFPLEVBQUM7SUFDL0M7SUFFQSxNQUFNRCxHQUFHO0VBQ1g7QUFDRjtBQVFPLGVBQWVHLFlBQVlBLENBQUVDLFFBQVEsRUFBRTtFQUM1QyxJQUFJQyxNQUFNO0VBQ1YsSUFBSTtJQUNGLENBQUM7TUFBQ0E7SUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFBTixrQkFBSSxFQUFDLGlCQUFpQixFQUFFLENBQ3ZDLDZCQUE0QkssUUFBUyxFQUFDLENBQ3hDLENBQUM7RUFDSixDQUFDLENBQUMsT0FBT0UsQ0FBQyxFQUFFO0lBQ1YsT0FBTyxFQUFFO0VBQ1g7RUFFQSxNQUFNQyxZQUFZLEdBQUdDLGVBQUMsQ0FBQ0MsSUFBSSxDQUFDSixNQUFNLENBQUMsQ0FDaENLLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWEMsR0FBRyxDQUFDSCxlQUFDLENBQUNDLElBQUksQ0FBQyxDQUNYRyxNQUFNLENBQUNDLE9BQU8sQ0FBQztFQUNsQixJQUFJTCxlQUFDLENBQUNNLE9BQU8sQ0FBQ1AsWUFBWSxDQUFDLEVBQUU7SUFDM0IsT0FBTyxFQUFFO0VBQ1g7RUFDQSxNQUFNUSxPQUFPLEdBQUdSLFlBQVksQ0FBQ0ksR0FBRyxDQUFFSyxDQUFDLElBQUssQ0FBQyxZQUFZO0lBQ25ELElBQUksTUFBTUMsV0FBRSxDQUFDQyxNQUFNLENBQUNGLENBQUMsQ0FBQyxFQUFFO01BQ3RCLE9BQU9BLENBQUM7SUFDVjtFQUNGLENBQUMsR0FBRyxDQUFDO0VBQ0wsT0FBOEIsQ0FBQyxNQUFNRyxpQkFBQyxDQUFDQyxHQUFHLENBQUNMLE9BQU8sQ0FBQyxFQUFFSCxNQUFNLENBQUNDLE9BQU8sQ0FBQztBQUN0RTtBQVFPLGVBQWVRLGNBQWNBLENBQUVDLGFBQWEsRUFBRTtFQUNuRCxNQUFNQyxTQUFTLEdBQUdDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxhQUFhLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQztFQUNqRSxPQUFPLE9BQU1MLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDSyxTQUFTLENBQUMsSUFDN0IsTUFBTUcsY0FBSyxDQUFDQyxjQUFjLENBQUNKLFNBQVMsQ0FBQyxHQUNyQyxDQUFDLENBQUM7QUFDUiJ9
|
package/build/lib/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":["_lodash","_interopRequireDefault","require","_bluebird","_teen_process","_support","_path","XCRUN_TIMEOUT","exports","runXcrunCommand","args","timeout","exec","err","stderr","message","findAppPaths","bundleId","stdout","e","matchedPaths","_","trim","split","map","filter","Boolean","isEmpty","results","p","fs","exists","B","all","readXcodePlist","developerRoot","plistPath","path","resolve","plist","parsePlistFile"],"sources":["../../lib/helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport B from 'bluebird';\nimport { exec } from 'teen_process';\nimport { fs, plist } from '@appium/support';\nimport path from 'path';\n\nexport const XCRUN_TIMEOUT = 15000;\n\n/**\n * Executes 'xcrun' command line utility\n *\n * @param {string[]} args xcrun arguments\n * @param {number} timeout [15000] The maximum number of milliseconds to wait until xcrun exists\n * @returns {Promise<import(\"teen_process\").
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["_lodash","_interopRequireDefault","require","_bluebird","_teen_process","_support","_path","XCRUN_TIMEOUT","exports","runXcrunCommand","args","timeout","exec","err","stderr","message","findAppPaths","bundleId","stdout","e","matchedPaths","_","trim","split","map","filter","Boolean","isEmpty","results","p","fs","exists","B","all","readXcodePlist","developerRoot","plistPath","path","resolve","plist","parsePlistFile"],"sources":["../../lib/helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport B from 'bluebird';\nimport { exec } from 'teen_process';\nimport { fs, plist } from '@appium/support';\nimport path from 'path';\n\nexport const XCRUN_TIMEOUT = 15000;\n\n/**\n * Executes 'xcrun' command line utility\n *\n * @param {string[]} args xcrun arguments\n * @param {number} timeout [15000] The maximum number of milliseconds to wait until xcrun exists\n * @returns {Promise<import(\"teen_process\").TeenProcessExecResult>} The result of xcrun execution\n * @throws {Error} If xcrun returned non-zero exit code or timed out\n */\nexport async function runXcrunCommand (args, timeout = XCRUN_TIMEOUT) {\n try {\n return await exec('xcrun', args, {timeout});\n } catch (err) {\n // the true error can be hidden within the stderr\n if (err.stderr) {\n err.message = `${err.message}: ${err.stderr}`;\n }\n\n throw err;\n }\n}\n\n/**\n * Uses macOS Spotlight service to detect where the given app is installed\n *\n * @param {string} bundleId Bundle identifier of the target app\n * @returns {Promise<string[]>} Full paths to where the app with the given bundle id is present.\n */\nexport async function findAppPaths (bundleId) {\n let stdout;\n try {\n ({stdout} = await exec('/usr/bin/mdfind', [\n `kMDItemCFBundleIdentifier=${bundleId}`\n ]));\n } catch (e) {\n return [];\n }\n\n const matchedPaths = _.trim(stdout)\n .split('\\n')\n .map(_.trim)\n .filter(Boolean);\n if (_.isEmpty(matchedPaths)) {\n return [];\n }\n const results = matchedPaths.map((p) => (async () => {\n if (await fs.exists(p)) {\n return p;\n }\n })());\n return /** @type {string[]} */(await B.all(results)).filter(Boolean);\n}\n\n/**\n * Finds and retrieves the content of the Xcode's Info.plist file\n *\n * @param {string} developerRoot Full path to the Contents/Developer folder under Xcode.app root\n * @returns {Promise<object>} All plist entries as an object or an empty object if no plist was found\n */\nexport async function readXcodePlist (developerRoot) {\n const plistPath = path.resolve(developerRoot, '..', 'Info.plist');\n return await fs.exists(plistPath)\n ? await plist.parsePlistFile(plistPath)\n : {};\n}\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEO,MAAMK,aAAa,GAAG,KAAK;AAACC,OAAA,CAAAD,aAAA,GAAAA,aAAA;AAU5B,eAAeE,eAAeA,CAAEC,IAAI,EAAEC,OAAO,GAAGJ,aAAa,EAAE;EACpE,IAAI;IACF,OAAO,MAAM,IAAAK,kBAAI,EAAC,OAAO,EAAEF,IAAI,EAAE;MAACC;IAAO,CAAC,CAAC;EAC7C,CAAC,CAAC,OAAOE,GAAG,EAAE;IAEZ,IAAIA,GAAG,CAACC,MAAM,EAAE;MACdD,GAAG,CAACE,OAAO,GAAI,GAAEF,GAAG,CAACE,OAAQ,KAAIF,GAAG,CAACC,MAAO,EAAC;IAC/C;IAEA,MAAMD,GAAG;EACX;AACF;AAQO,eAAeG,YAAYA,CAAEC,QAAQ,EAAE;EAC5C,IAAIC,MAAM;EACV,IAAI;IACF,CAAC;MAACA;IAAM,CAAC,GAAG,MAAM,IAAAN,kBAAI,EAAC,iBAAiB,EAAE,CACvC,6BAA4BK,QAAS,EAAC,CACxC,CAAC;EACJ,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV,OAAO,EAAE;EACX;EAEA,MAAMC,YAAY,GAAGC,eAAC,CAACC,IAAI,CAACJ,MAAM,CAAC,CAChCK,KAAK,CAAC,IAAI,CAAC,CACXC,GAAG,CAACH,eAAC,CAACC,IAAI,CAAC,CACXG,MAAM,CAACC,OAAO,CAAC;EAClB,IAAIL,eAAC,CAACM,OAAO,CAACP,YAAY,CAAC,EAAE;IAC3B,OAAO,EAAE;EACX;EACA,MAAMQ,OAAO,GAAGR,YAAY,CAACI,GAAG,CAAEK,CAAC,IAAK,CAAC,YAAY;IACnD,IAAI,MAAMC,WAAE,CAACC,MAAM,CAACF,CAAC,CAAC,EAAE;MACtB,OAAOA,CAAC;IACV;EACF,CAAC,GAAG,CAAC;EACL,OAA8B,CAAC,MAAMG,iBAAC,CAACC,GAAG,CAACL,OAAO,CAAC,EAAEH,MAAM,CAACC,OAAO,CAAC;AACtE;AAQO,eAAeQ,cAAcA,CAAEC,aAAa,EAAE;EACnD,MAAMC,SAAS,GAAGC,aAAI,CAACC,OAAO,CAACH,aAAa,EAAE,IAAI,EAAE,YAAY,CAAC;EACjE,OAAO,OAAML,WAAE,CAACC,MAAM,CAACK,SAAS,CAAC,IAC7B,MAAMG,cAAK,CAACC,cAAc,CAACJ,SAAS,CAAC,GACrC,CAAC,CAAC;AACR"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default xcode;
|
|
2
|
+
export type XcodeVersion = import('./xcode').XcodeVersion;
|
|
3
|
+
import { getPath } from './xcode';
|
|
4
|
+
import { getVersion } from './xcode';
|
|
5
|
+
import { getMaxIOSSDK } from './xcode';
|
|
6
|
+
import { getMaxTVOSSDK } from './xcode';
|
|
7
|
+
import { getClangVersion } from './xcode';
|
|
8
|
+
declare namespace xcode {
|
|
9
|
+
export { getPath };
|
|
10
|
+
export { getVersion };
|
|
11
|
+
export { getMaxIOSSDK };
|
|
12
|
+
export { getMaxTVOSSDK };
|
|
13
|
+
export { getClangVersion };
|
|
14
|
+
}
|
|
15
|
+
export { getPath, getVersion, getMaxIOSSDK, getMaxTVOSSDK, getClangVersion };
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":";2BA2Ba,OAAO,SAAS,EAAE,YAAY;wBApBpC,SAAS;2BAAT,SAAS;6BAAT,SAAS;8BAAT,SAAS;gCAAT,SAAS"}
|
|
@@ -35,7 +35,7 @@ Object.defineProperty(exports, "getVersion", {
|
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
require("source-map-support/register");
|
|
38
|
-
var _xcode = require("./
|
|
38
|
+
var _xcode = require("./xcode");
|
|
39
39
|
const xcode = {
|
|
40
40
|
getPath: _xcode.getPath,
|
|
41
41
|
getVersion: _xcode.getVersion,
|
|
@@ -45,4 +45,4 @@ const xcode = {
|
|
|
45
45
|
};
|
|
46
46
|
var _default = xcode;
|
|
47
47
|
exports.default = _default;
|
|
48
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfeGNvZGUiLCJyZXF1aXJlIiwieGNvZGUiLCJnZXRQYXRoIiwiZ2V0VmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREsiLCJnZXRDbGFuZ1ZlcnNpb24iLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBnZXRWZXJzaW9uLFxuICBnZXRNYXhJT1NTREssXG4gIGdldE1heFRWT1NTREssXG4gIGdldENsYW5nVmVyc2lvbixcbn0gZnJvbSAnLi94Y29kZSc7XG5cbmNvbnN0IHhjb2RlID0ge1xuICBnZXRQYXRoLFxuICBnZXRWZXJzaW9uLFxuICBnZXRNYXhJT1NTREssXG4gIGdldE1heFRWT1NTREssXG4gIGdldENsYW5nVmVyc2lvblxufTtcblxuZXhwb3J0IHtcbiAgZ2V0UGF0aCxcbiAgZ2V0VmVyc2lvbixcbiAgZ2V0TWF4SU9TU0RLLFxuICBnZXRNYXhUVk9TU0RLLFxuICBnZXRDbGFuZ1ZlcnNpb25cbn07XG5leHBvcnQgZGVmYXVsdCB4Y29kZTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL3hjb2RlJykuWGNvZGVWZXJzaW9ufSBYY29kZVZlcnNpb25cbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBUUEsTUFBTUMsS0FBSyxHQUFHO0VBQ1pDLE9BQU8sRUFBUEEsY0FBTztFQUNQQyxVQUFVLEVBQVZBLGlCQUFVO0VBQ1ZDLFlBQVksRUFBWkEsbUJBQVk7RUFDWkMsYUFBYSxFQUFiQSxvQkFBYTtFQUNiQyxlQUFlLEVBQWZBO0FBQ0YsQ0FBQztBQUFDLElBQUFDLFFBQUEsR0FTYU4sS0FBSztBQUFBTyxPQUFBLENBQUFDLE9BQUEsR0FBQUYsUUFBQSJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_xcode","require","xcode","getPath","getVersion","getMaxIOSSDK","getMaxTVOSSDK","getClangVersion","_default","exports","default"],"sources":["../../lib/index.js"],"sourcesContent":["// transpile:main\nimport {\n getPath,\n getVersion,\n getMaxIOSSDK,\n getMaxTVOSSDK,\n getClangVersion,\n} from './xcode';\n\nconst xcode = {\n getPath,\n getVersion,\n getMaxIOSSDK,\n getMaxTVOSSDK,\n getClangVersion\n};\n\nexport {\n getPath,\n getVersion,\n getMaxIOSSDK,\n getMaxTVOSSDK,\n getClangVersion\n};\nexport default xcode;\n\n/**\n * @typedef {import('./xcode').XcodeVersion} XcodeVersion\n */\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAQA,MAAMC,KAAK,GAAG;EACZC,OAAO,EAAPA,cAAO;EACPC,UAAU,EAAVA,iBAAU;EACVC,YAAY,EAAZA,mBAAY;EACZC,aAAa,EAAbA,oBAAa;EACbC,eAAe,EAAfA;AACF,CAAC;AAAC,IAAAC,QAAA,GASaN,KAAK;AAAAO,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export type XcodeVersion = {
|
|
2
|
+
/**
|
|
3
|
+
* Xcode version as a string
|
|
4
|
+
*/
|
|
5
|
+
versionString: string;
|
|
6
|
+
/**
|
|
7
|
+
* Xcode version as a float number
|
|
8
|
+
*/
|
|
9
|
+
versionFloat: number;
|
|
10
|
+
/**
|
|
11
|
+
* Major number of Xcode version
|
|
12
|
+
*/
|
|
13
|
+
major: number;
|
|
14
|
+
/**
|
|
15
|
+
* Minor number of Xcode version
|
|
16
|
+
*/
|
|
17
|
+
minor: number;
|
|
18
|
+
/**
|
|
19
|
+
* Patch number of Xcode version (if exists)
|
|
20
|
+
*/
|
|
21
|
+
patch?: number | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Returns Xcode version as a string
|
|
24
|
+
*/
|
|
25
|
+
toString: () => string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Retrieves the full path to Xcode Developer subfolder.
|
|
29
|
+
* If `DEVELOPER_DIR` environment variable is provided then its value has a priority.
|
|
30
|
+
* @param {number} timeout The maximum timeout for xcode-select execution
|
|
31
|
+
* @returns {Promise<string>} Full path to Xcode Developer subfolder timeout
|
|
32
|
+
* @throws {Error} If there was an error while retrieving the path.
|
|
33
|
+
*/
|
|
34
|
+
export const getPath: ((timeout?: number) => Promise<string>) & _.MemoizedFunction;
|
|
35
|
+
/**
|
|
36
|
+
* @typedef {Object} XcodeVersion
|
|
37
|
+
* @property {string} versionString Xcode version as a string
|
|
38
|
+
* @property {number} versionFloat Xcode version as a float number
|
|
39
|
+
* @property {number} major Major number of Xcode version
|
|
40
|
+
* @property {number} minor Minor number of Xcode version
|
|
41
|
+
* @property {number} [patch] Patch number of Xcode version (if exists)
|
|
42
|
+
* @property {() => string} toString Returns Xcode version as a string
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Retrieves Xcode version
|
|
46
|
+
*
|
|
47
|
+
* @param {boolean} parse [false] Whether to parse the version to a XcodeVersion version
|
|
48
|
+
* @param {number} retries [2] How many retries to apply for getting the version number
|
|
49
|
+
* @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands
|
|
50
|
+
* @returns {Promise<XcodeVersion | string>} Xcode version depending on the value of `parse` flag
|
|
51
|
+
* @throws {Error} If there was a failure while retrieving the version
|
|
52
|
+
*/
|
|
53
|
+
export function getVersion(parse?: boolean, retries?: number, timeout?: number): Promise<XcodeVersion | string>;
|
|
54
|
+
/**
|
|
55
|
+
* Retrieves the maximum version of iOS SDK supported by the installed Xcode
|
|
56
|
+
*
|
|
57
|
+
* @param {number} timeout Timeout of milliseconds to wait for terminal commands
|
|
58
|
+
* @param {number} retries The maximum number of retries
|
|
59
|
+
* @returns {string} The SDK version
|
|
60
|
+
* @throws {Error} If the SDK version number cannot be determined
|
|
61
|
+
*/
|
|
62
|
+
export const getMaxIOSSDK: ((retries?: any, timeout?: any) => Promise<string | null>) & _.MemoizedFunction;
|
|
63
|
+
/**
|
|
64
|
+
* Retrieves the maximum version of iOS SDK supported by the installed Xcode
|
|
65
|
+
*
|
|
66
|
+
* @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands
|
|
67
|
+
* @returns {Promise<string>} The SDK version
|
|
68
|
+
* @throws {Error} If the SDK version number cannot be determined
|
|
69
|
+
*/
|
|
70
|
+
export function getMaxIOSSDKWithoutRetry(timeout?: number): Promise<string>;
|
|
71
|
+
/**
|
|
72
|
+
* Retrieves the maximum version of tvOS SDK supported by the installed Xcode
|
|
73
|
+
*
|
|
74
|
+
* @throws {Error} If the SDK version number cannot be determined
|
|
75
|
+
*/
|
|
76
|
+
export const getMaxTVOSSDK: ((retries?: number, timeout?: number) => Promise<string>) & _.MemoizedFunction;
|
|
77
|
+
/**
|
|
78
|
+
* Retrieves the maximum version of tvOS SDK supported by the installed Xcode
|
|
79
|
+
*
|
|
80
|
+
* @param {number} timeout Timeout of milliseconds to wait for terminal commands
|
|
81
|
+
* @returns {Promise<string>} The SDK version
|
|
82
|
+
* @throws {Error} If the SDK version number cannot be determined
|
|
83
|
+
*/
|
|
84
|
+
export function getMaxTVOSSDKWithoutRetry(timeout?: number): Promise<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Check https://trac.macports.org/wiki/XcodeVersionInfo
|
|
87
|
+
* to see the actual mapping between clang and other components.
|
|
88
|
+
*
|
|
89
|
+
* @returns {Promise<string|null>} The actual Clang version in x.x.x.x or x.x.x format,
|
|
90
|
+
* which is supplied with Command Line Tools. `null` is returned
|
|
91
|
+
* if CLT are not installed.
|
|
92
|
+
*/
|
|
93
|
+
export function getClangVersion(): Promise<string | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Retrieves the full path to Xcode Developer subfolder via `DEVELOPER_DIR` environment variable
|
|
96
|
+
*
|
|
97
|
+
* @returns {Promise<string>} Full path to Xcode Developer subfolder
|
|
98
|
+
* @throws {Error} If it is not possible to retrieve a proper path
|
|
99
|
+
* @privateRemarks This method assumes `DEVELOPER_DIR` is defined.
|
|
100
|
+
*/
|
|
101
|
+
export function getPathFromDeveloperDir(): Promise<string>;
|
|
102
|
+
/**
|
|
103
|
+
* Retrieves the full path to Xcode Developer subfolder via xcode-select
|
|
104
|
+
*
|
|
105
|
+
* @param {number} timeout The maximum timeout for xcode-select execution
|
|
106
|
+
* @returns {Promise<string>} Full path to Xcode Developer subfolder
|
|
107
|
+
* @throws {Error} If it is not possible to retrieve a proper path
|
|
108
|
+
*/
|
|
109
|
+
export function getPathFromXcodeSelect(timeout?: number): Promise<string>;
|
|
110
|
+
import _ from 'lodash';
|
|
111
|
+
//# sourceMappingURL=xcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xcode.d.ts","sourceRoot":"","sources":["../../lib/xcode.js"],"names":[],"mappings":";;;;mBAiIc,MAAM;;;;kBACN,MAAM;;;;WACN,MAAM;;;;WACN,MAAM;;;;;;;;cAEN,MAAM,MAAM;;AAjD1B;;;;;;GAMG;AACH,kCAEa,MAAM,KACJ,QAAQ,MAAM,CAAC,uBAE0F;AA8BxH;;;;;;;;GAQG;AAEH;;;;;;;;GAQG;AACH,mCANW,OAAO,YACP,MAAM,YACN,MAAM,GACJ,QAAQ,YAAY,GAAG,MAAM,CAAC,CAsB1C;AA6CD;;;;;;;GAOG;AACH,2GAIE;AA9BF;;;;;;GAMG;AACH,mDAJW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAY3B;AAiCD;;;;GAIG;AACH,wCAGa,MAAM,YADN,MAAM,KAEJ,QAAQ,MAAM,CAAC,uBAK5B;AA/BF;;;;;;GAMG;AACH,oDAJW,MAAM,GACJ,QAAQ,MAAM,CAAC,CAW3B;AAxED;;;;;;;GAOG;AACH,mCAJa,QAAQ,MAAM,GAAC,IAAI,CAAC,CAmBhC;AA7HD;;;;;;GAMG;AACH,2CAJa,QAAQ,MAAM,CAAC,CAe3B;AApED;;;;;;GAMG;AACH,iDAJW,MAAM,GACJ,QAAQ,MAAM,CAAC,CA4C3B;cA5Da,QAAQ"}
|
package/build/lib/xcode.js
CHANGED
|
@@ -41,11 +41,15 @@ async function getPathFromXcodeSelect(timeout = _helpers.XCRUN_TIMEOUT) {
|
|
|
41
41
|
timeout
|
|
42
42
|
}));
|
|
43
43
|
} catch (e) {
|
|
44
|
-
|
|
44
|
+
const msg = `Cannot determine the path to Xcode by running 'xcode-select -p' command. ` + `Original error: ${e.stderr || e.message}`;
|
|
45
|
+
log.error(msg);
|
|
46
|
+
throw new Error(msg);
|
|
45
47
|
}
|
|
46
|
-
const developerRoot = stdout.replace(/\/$/, '').trim();
|
|
48
|
+
const developerRoot = String(stdout).replace(/\/$/, '').trim();
|
|
47
49
|
if (!developerRoot) {
|
|
48
|
-
|
|
50
|
+
const msg = await generateErrorMessage(`'xcode-select -p' returned an empty string`);
|
|
51
|
+
log.error(msg);
|
|
52
|
+
throw new Error(msg);
|
|
49
53
|
}
|
|
50
54
|
const {
|
|
51
55
|
CFBundleIdentifier
|
|
@@ -53,7 +57,9 @@ async function getPathFromXcodeSelect(timeout = _helpers.XCRUN_TIMEOUT) {
|
|
|
53
57
|
if (CFBundleIdentifier === XCODE_BUNDLE_ID) {
|
|
54
58
|
return developerRoot;
|
|
55
59
|
}
|
|
56
|
-
|
|
60
|
+
const msg = await generateErrorMessage(`'${developerRoot}' is not a valid Xcode path`);
|
|
61
|
+
log.error(msg);
|
|
62
|
+
throw msg;
|
|
57
63
|
}
|
|
58
64
|
async function getPathFromDeveloperDir() {
|
|
59
65
|
const developerRoot = process.env.DEVELOPER_DIR;
|
|
@@ -63,11 +69,11 @@ async function getPathFromDeveloperDir() {
|
|
|
63
69
|
if (CFBundleIdentifier === XCODE_BUNDLE_ID) {
|
|
64
70
|
return developerRoot;
|
|
65
71
|
}
|
|
66
|
-
|
|
72
|
+
const msg = `The path to Xcode Developer dir '${developerRoot}' provided in DEVELOPER_DIR ` + `environment variable is not a valid path`;
|
|
73
|
+
log.error(msg);
|
|
74
|
+
throw new Error(msg);
|
|
67
75
|
}
|
|
68
|
-
const getPath = _lodash.default.memoize(
|
|
69
|
-
return process.env.DEVELOPER_DIR ? getPathFromDeveloperDir() : getPathFromXcodeSelect(timeout);
|
|
70
|
-
});
|
|
76
|
+
const getPath = _lodash.default.memoize((timeout = _helpers.XCRUN_TIMEOUT) => process.env.DEVELOPER_DIR ? getPathFromDeveloperDir() : getPathFromXcodeSelect(timeout));
|
|
71
77
|
exports.getPath = getPath;
|
|
72
78
|
async function getVersionWithoutRetry(timeout = _helpers.XCRUN_TIMEOUT) {
|
|
73
79
|
const developerPath = await getPath(timeout);
|
|
@@ -140,8 +146,8 @@ async function getMaxTVOSSDKWithoutRetry(timeout = _helpers.XCRUN_TIMEOUT) {
|
|
|
140
146
|
}
|
|
141
147
|
return sdkVersion;
|
|
142
148
|
}
|
|
143
|
-
const getMaxTVOSSDK = _lodash.default.memoize(function getMaxTVOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = _helpers.XCRUN_TIMEOUT) {
|
|
144
|
-
return (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
|
|
149
|
+
const getMaxTVOSSDK = _lodash.default.memoize(async function getMaxTVOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = _helpers.XCRUN_TIMEOUT) {
|
|
150
|
+
return await (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
|
|
145
151
|
});
|
|
146
152
|
exports.getMaxTVOSSDK = getMaxTVOSSDK;
|
|
147
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3VwcG9ydCIsInJlcXVpcmUiLCJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYXN5bmNib3giLCJfbG9kYXNoIiwiX3RlZW5fcHJvY2VzcyIsIl9zZW12ZXIiLCJfaGVscGVycyIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJYQ09ERV9CVU5ETEVfSUQiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJnZXRQYXRoRnJvbVhjb2RlU2VsZWN0IiwidGltZW91dCIsIlhDUlVOX1RJTUVPVVQiLCJnZW5lcmF0ZUVycm9yTWVzc2FnZSIsInByZWZpeCIsInhjb2RlUGF0aHMiLCJmaW5kQXBwUGF0aHMiLCJfIiwiaXNFbXB0eSIsInByb3Bvc2FscyIsIm1hcCIsInAiLCJwYXRoIiwiam9pbiIsImxlbmd0aCIsInN0ZG91dCIsImV4ZWMiLCJlIiwiZXJyb3JBbmRUaHJvdyIsInN0ZGVyciIsIm1lc3NhZ2UiLCJkZXZlbG9wZXJSb290IiwicmVwbGFjZSIsInRyaW0iLCJDRkJ1bmRsZUlkZW50aWZpZXIiLCJyZWFkWGNvZGVQbGlzdCIsImdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyIiwicHJvY2VzcyIsImVudiIsIkRFVkVMT1BFUl9ESVIiLCJnZXRQYXRoIiwibWVtb2l6ZSIsImV4cG9ydHMiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwiZGV2ZWxvcGVyUGF0aCIsIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIiwic2VtdmVyIiwiY29lcmNlIiwiZ2V0VmVyc2lvbk1lbW9pemVkIiwicmV0cmllcyIsInJldHJ5IiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvbiIsInZlcnNpb25TdHJpbmciLCJwYXRjaCIsIm1ham9yIiwibWlub3IiLCJ2ZXJzaW9uRmxvYXQiLCJwYXJzZUZsb2F0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJnZXRDbGFuZ1ZlcnNpb24iLCJmcyIsIndoaWNoIiwiaW5mbyIsIm1hdGNoIiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiYXJncyIsInJ1blhjcnVuQ29tbWFuZCIsInNka1ZlcnNpb24iLCJFcnJvciIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiXSwic291cmNlcyI6WyIuLi8uLi9saWIveGNvZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMsIGxvZ2dlciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgcnVuWGNydW5Db21tYW5kLCBmaW5kQXBwUGF0aHMsIFhDUlVOX1RJTUVPVVQsIHJlYWRYY29kZVBsaXN0XG59IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMgPSAyO1xuY29uc3QgWENPREVfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5kdC5YY29kZSc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIHN1YmZvbGRlciB2aWEgeGNvZGUtc2VsZWN0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIG1heGltdW0gdGltZW91dCBmb3IgeGNvZGUtc2VsZWN0IGV4ZWN1dGlvblxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRnVsbCBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBzdWJmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcm9wZXIgcGF0aFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBnZW5lcmF0ZUVycm9yTWVzc2FnZSA9IGFzeW5jIChwcmVmaXgpID0+IHtcbiAgICBjb25zdCB4Y29kZVBhdGhzID0gYXdhaXQgZmluZEFwcFBhdGhzKFhDT0RFX0JVTkRMRV9JRCk7XG4gICAgaWYgKF8uaXNFbXB0eSh4Y29kZVBhdGhzKSkge1xuICAgICAgcmV0dXJuIGAke3ByZWZpeH0uIENvbnNpZGVyIGluc3RhbGxpbmcgWGNvZGUgdG8gYWRkcmVzcyB0aGlzIGlzc3VlLmA7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcG9zYWxzID0geGNvZGVQYXRocy5tYXAoKHApID0+IGAgICAgc3VkbyB4Y29kZS1zZWxlY3QgLXMgXCIke3BhdGguam9pbihwLCAnQ29udGVudHMnLCAnRGV2ZWxvcGVyJyl9XCJgKTtcbiAgICByZXR1cm4gYCR7cHJlZml4fS4gYCArXG4gICAgICBgQ29uc2lkZXIgcnVubmluZyR7cHJvcG9zYWxzLmxlbmd0aCA+IDEgPyAnIGFueSBvZicgOiAnJ306XFxuJHtwcm9wb3NhbHMuam9pbignXFxuJyl9XFxudG8gYWRkcmVzcyB0aGlzIGlzc3VlLmA7XG4gIH07XG5cbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZGV0ZXJtaW5lIHRoZSBwYXRoIHRvIFhjb2RlIGJ5IHJ1bm5pbmcgJ3hjb2RlLXNlbGVjdCAtcCcgY29tbWFuZC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCBkZXZlbG9wZXJSb290ID0gc3Rkb3V0LnJlcGxhY2UoL1xcLyQvLCAnJykudHJpbSgpO1xuICBpZiAoIWRldmVsb3BlclJvb3QpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhhd2FpdCBnZW5lcmF0ZUVycm9yTWVzc2FnZShgJ3hjb2RlLXNlbGVjdCAtcCcgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nYCkpO1xuICB9XG4gIC8vIHhjb2RlLXNlbGVjdCBtaWdodCBhbHNvIHJldHVybiBhIHBhdGggdG8gY29tbWFuZCBsaW5lIHRvb2xzXG4gIGNvbnN0IHtDRkJ1bmRsZUlkZW50aWZpZXJ9ID0gYXdhaXQgcmVhZFhjb2RlUGxpc3QoZGV2ZWxvcGVyUm9vdCk7XG4gIGlmIChDRkJ1bmRsZUlkZW50aWZpZXIgPT09IFhDT0RFX0JVTkRMRV9JRCkge1xuICAgIHJldHVybiBkZXZlbG9wZXJSb290O1xuICB9XG5cbiAgbG9nLmVycm9yQW5kVGhyb3coYXdhaXQgZ2VuZXJhdGVFcnJvck1lc3NhZ2UoYCcke2RldmVsb3BlclJvb3R9JyBpcyBub3QgYSB2YWxpZCBYY29kZSBwYXRoYCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBzdWJmb2xkZXIgdmlhIERFVkVMT1BFUl9ESVIgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBGdWxsIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIHN1YmZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByb3BlciBwYXRoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyICgpIHtcbiAgY29uc3QgZGV2ZWxvcGVyUm9vdCA9IHByb2Nlc3MuZW52LkRFVkVMT1BFUl9ESVI7XG4gIGNvbnN0IHtDRkJ1bmRsZUlkZW50aWZpZXJ9ID0gYXdhaXQgcmVhZFhjb2RlUGxpc3QoZGV2ZWxvcGVyUm9vdCk7XG4gIGlmIChDRkJ1bmRsZUlkZW50aWZpZXIgPT09IFhDT0RFX0JVTkRMRV9JRCkge1xuICAgIHJldHVybiBkZXZlbG9wZXJSb290O1xuICB9XG5cbiAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBkaXIgJyR7ZGV2ZWxvcGVyUm9vdH0nIHByb3ZpZGVkIGluIERFVkVMT1BFUl9ESVIgYCArXG4gICAgYGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBhIHZhbGlkIHBhdGhgKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZ1bGwgcGF0aCB0byBYY29kZSBEZXZlbG9wZXIgc3ViZm9sZGVyLlxuICogSWYgREVWRUxPUEVSX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwcm92aWRlZCB0aGVuIGl0cyB2YWx1ZSBoYXMgYSBwcmlvcml0eS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRoZSBtYXhpbXVtIHRpbWVvdXQgZm9yIHhjb2RlLXNlbGVjdCBleGVjdXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byBYY29kZSBEZXZlbG9wZXIgc3ViZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhdGguXG4gKi9cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0UGF0aCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkRFVkVMT1BFUl9ESVIgPyBnZXRQYXRoRnJvbURldmVsb3BlckRpcigpIDogZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBYY29kZSB2ZXJzaW9uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbXZlclwiKS5TZW1WZXIgfCBudWxsPn0gWGNvZGUgdmVyc2lvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgdmVyc2lvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBkZXZlbG9wZXJQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcbiAgLy8gd2Ugd2FudCB0byByZWFkIHRoZSBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyBmcm9tIFhjb2RlJ3MgcGxpc3QuXG4gIGNvbnN0IHtDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZ30gPSBhd2FpdCByZWFkWGNvZGVQbGlzdChkZXZlbG9wZXJQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UoQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmcpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBYY29kZSB2ZXJzaW9uIG9yIHRoZSBjYWNoZWQgb25lIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFsyXSBIb3cgbWFueSByZXRyaWVzIHRvIGFwcGx5IGZvciB2ZXJzaW9uIHJldHJpZXZhbFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VtdmVyXCIpLlNlbVZlciB8IG51bGw+fSBYY29kZSB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSB2ZXJzaW9uXG4gKi9cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gWGNvZGVWZXJzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvblN0cmluZyBYY29kZSB2ZXJzaW9uIGFzIGEgc3RyaW5nXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkZsb2F0IFhjb2RlIHZlcnNpb24gYXMgYSBmbG9hdCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYWpvciBNYWpvciBudW1iZXIgb2YgWGNvZGUgdmVyc2lvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pbm9yIE1pbm9yIG51bWJlciBvZiBYY29kZSB2ZXJzaW9uXG4gKiBAcHJvcGVydHkge251bWJlcj99IHBhdGNoIFBhdGNoIG51bWJlciBvZiBYY29kZSB2ZXJzaW9uIChpZiBleGlzdHMpXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgWGNvZGUgdmVyc2lvblxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyc2UgW2ZhbHNlXSBXaGV0aGVyIHRvIHBhcnNlIHRoZSB2ZXJzaW9uIHRvIGEgWGNvZGVWZXJzaW9uIHZlcnNpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFsyXSBIb3cgbWFueSByZXRyaWVzIHRvIGFwcGx5IGZvciBnZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8WGNvZGVWZXJzaW9uIHwgc3RyaW5nPn0gWGNvZGUgdmVyc2lvbiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGBwYXJzZWAgZmxhZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgdmVyc2lvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uIChwYXJzZSA9IGZhbHNlLCByZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb25NZW1vaXplZChyZXRyaWVzLCB0aW1lb3V0KTtcbiAgLy8geGNvZGUgdmVyc2lvbiBzdHJpbmdzIGFyZSBub3QgZXhhY3RseSBzZW12ZXIgc3RyaW5nOiBwYXRjaCB2ZXJzaW9ucyBvZiAwXG4gIC8vIGFyZSByZW1vdmVkIChlLmcuLCAnMTAuMC4wJyA9PiAnMTAuMCcpXG4gIGNvbnN0IHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uLnBhdGNoID4gMCA/IHZlcnNpb24udmVyc2lvbiA6IGAke3ZlcnNpb24ubWFqb3J9LiR7dmVyc2lvbi5taW5vcn1gO1xuICBpZiAoIXBhcnNlKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZlcnNpb25TdHJpbmcsXG4gICAgdmVyc2lvbkZsb2F0OiBwYXJzZUZsb2F0KHZlcnNpb25TdHJpbmcpLFxuICAgIG1ham9yOiB2ZXJzaW9uLm1ham9yLFxuICAgIG1pbm9yOiB2ZXJzaW9uLm1pbm9yLFxuICAgIHBhdGNoOiB2ZXJzaW9uLnBhdGNoID4gMCA/IHZlcnNpb24ucGF0Y2ggOiB1bmRlZmluZWQsXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBodHRwczovL3RyYWMubWFjcG9ydHMub3JnL3dpa2kvWGNvZGVWZXJzaW9uSW5mb1xuICogdG8gc2VlIHRoZSBhY3R1YWwgbWFwcGluZyBiZXR3ZWVuIGNsYW5nIGFuZCBvdGhlciBjb21wb25lbnRzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz8+fSBUaGUgYWN0dWFsIENsYW5nIHZlcnNpb24gaW4geC54LngueCBvciB4LngueCBmb3JtYXQsXG4gKiB3aGljaCBpcyBzdXBwbGllZCB3aXRoIENvbW1hbmQgTGluZSBUb29scy4gYG51bGxgIGlzIHJldHVybmVkXG4gKiBpZiBDTFQgYXJlIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENsYW5nVmVyc2lvbiAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goJ2NsYW5nJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuaW5mbygnQ2Fubm90IGZpbmQgY2xhbmcgZXhlY3V0YWJsZSBvbiB0aGUgbG9jYWwgc3lzdGVtLiAnICtcbiAgICAgICdBcmUgWGNvZGUgQ29tbWFuZCBMaW5lIFRvb2xzIGluc3RhbGxlZD8nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2NsYW5nJywgWyctLXZlcnNpb24nXSk7XG4gIGNvbnN0IG1hdGNoID0gL2NsYW5nLShbMC05Ll0rKS8uZXhlYyhzdGRvdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgbG9nLmluZm8oYENhbm5vdCBwYXJzZSBjbGFuZyB2ZXJzaW9uIGZyb20gJHtzdGRvdXR9YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG1hdGNoWzFdO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIGlPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRpbWVvdXQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRlcm1pbmFsIGNvbW1hbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgU0RLIHZlcnNpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgU0RLIHZlcnNpb24gbnVtYmVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL1xcZC5cXGQvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyBpT1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIGlPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRpbWVvdXQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRlcm1pbmFsIGNvbW1hbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllcyBbMl0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBTREsgdmVyc2lvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBTREsgdmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksIHRpbWVvdXQpO1xuICB9XG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIHR2T1MgU0RLIHN1cHBvcnRlZCBieSB0aGUgaW5zdGFsbGVkIFhjb2RlXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIFNESyB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIFNESyB2ZXJzaW9uIG51bWJlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBhcmdzID0gWyctLXNkaycsICdhcHBsZXR2c2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG4gIGlmIChpc05hTihwYXJzZUZsb2F0KHNka1ZlcnNpb24pKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyB0dk9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuICByZXR1cm4gc2RrVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG1heGltdW0gdmVyc2lvbiBvZiB0dk9TIFNESyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RhbGxlZCBYY29kZVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFsxNTAwMF0gVGltZW91dCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGVybWluYWwgY29tbWFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFsyXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllc1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIFNESyB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIFNESyB2ZXJzaW9uIG51bWJlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNYXhUVk9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldE1heElPU1NESywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCBnZXRDbGFuZ1ZlcnNpb24sXG4gIGdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyLCBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLGFBQUEsR0FB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
|
|
153
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3VwcG9ydCIsInJlcXVpcmUiLCJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYXN5bmNib3giLCJfbG9kYXNoIiwiX3RlZW5fcHJvY2VzcyIsIl9zZW12ZXIiLCJfaGVscGVycyIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJYQ09ERV9CVU5ETEVfSUQiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJnZXRQYXRoRnJvbVhjb2RlU2VsZWN0IiwidGltZW91dCIsIlhDUlVOX1RJTUVPVVQiLCJnZW5lcmF0ZUVycm9yTWVzc2FnZSIsInByZWZpeCIsInhjb2RlUGF0aHMiLCJmaW5kQXBwUGF0aHMiLCJfIiwiaXNFbXB0eSIsInByb3Bvc2FscyIsIm1hcCIsInAiLCJwYXRoIiwiam9pbiIsImxlbmd0aCIsInN0ZG91dCIsImV4ZWMiLCJlIiwibXNnIiwic3RkZXJyIiwibWVzc2FnZSIsImVycm9yIiwiRXJyb3IiLCJkZXZlbG9wZXJSb290IiwiU3RyaW5nIiwicmVwbGFjZSIsInRyaW0iLCJDRkJ1bmRsZUlkZW50aWZpZXIiLCJyZWFkWGNvZGVQbGlzdCIsImdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyIiwicHJvY2VzcyIsImVudiIsIkRFVkVMT1BFUl9ESVIiLCJnZXRQYXRoIiwibWVtb2l6ZSIsImV4cG9ydHMiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwiZGV2ZWxvcGVyUGF0aCIsIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIiwic2VtdmVyIiwiY29lcmNlIiwiZ2V0VmVyc2lvbk1lbW9pemVkIiwicmV0cmllcyIsInJldHJ5IiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvbiIsInZlcnNpb25TdHJpbmciLCJwYXRjaCIsIm1ham9yIiwibWlub3IiLCJ2ZXJzaW9uRmxvYXQiLCJwYXJzZUZsb2F0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJnZXRDbGFuZ1ZlcnNpb24iLCJmcyIsIndoaWNoIiwiaW5mbyIsIm1hdGNoIiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiYXJncyIsInJ1blhjcnVuQ29tbWFuZCIsInNka1ZlcnNpb24iLCJnZXRNYXhJT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiaXNOYU4iLCJnZXRNYXhUVk9TU0RLIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZzLCBsb2dnZXIgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7XG4gIHJ1blhjcnVuQ29tbWFuZCwgZmluZEFwcFBhdGhzLCBYQ1JVTl9USU1FT1VULCByZWFkWGNvZGVQbGlzdFxufSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTID0gMjtcbmNvbnN0IFhDT0RFX0JVTkRMRV9JRCA9ICdjb20uYXBwbGUuZHQuWGNvZGUnO1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBzdWJmb2xkZXIgdmlhIHhjb2RlLXNlbGVjdFxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSBtYXhpbXVtIHRpbWVvdXQgZm9yIHhjb2RlLXNlbGVjdCBleGVjdXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEZ1bGwgcGF0aCB0byBYY29kZSBEZXZlbG9wZXIgc3ViZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJvcGVyIHBhdGhcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aEZyb21YY29kZVNlbGVjdCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGNvbnN0IGdlbmVyYXRlRXJyb3JNZXNzYWdlID0gYXN5bmMgKHByZWZpeCkgPT4ge1xuICAgIGNvbnN0IHhjb2RlUGF0aHMgPSBhd2FpdCBmaW5kQXBwUGF0aHMoWENPREVfQlVORExFX0lEKTtcbiAgICBpZiAoXy5pc0VtcHR5KHhjb2RlUGF0aHMpKSB7XG4gICAgICByZXR1cm4gYCR7cHJlZml4fS4gQ29uc2lkZXIgaW5zdGFsbGluZyBYY29kZSB0byBhZGRyZXNzIHRoaXMgaXNzdWUuYDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wb3NhbHMgPSB4Y29kZVBhdGhzLm1hcCgocCkgPT4gYCAgICBzdWRvIHhjb2RlLXNlbGVjdCAtcyBcIiR7cGF0aC5qb2luKHAsICdDb250ZW50cycsICdEZXZlbG9wZXInKX1cImApO1xuICAgIHJldHVybiBgJHtwcmVmaXh9LiBgICtcbiAgICAgIGBDb25zaWRlciBydW5uaW5nJHtwcm9wb3NhbHMubGVuZ3RoID4gMSA/ICcgYW55IG9mJyA6ICcnfTpcXG4ke3Byb3Bvc2Fscy5qb2luKCdcXG4nKX1cXG50byBhZGRyZXNzIHRoaXMgaXNzdWUuYDtcbiAgfTtcblxuICBsZXQgc3Rkb3V0O1xuICB0cnkge1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3hjb2RlLXNlbGVjdCcsIFsnLS1wcmludC1wYXRoJ10sIHt0aW1lb3V0fSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgbXNnID0gYENhbm5vdCBkZXRlcm1pbmUgdGhlIHBhdGggdG8gWGNvZGUgYnkgcnVubmluZyAneGNvZGUtc2VsZWN0IC1wJyBjb21tYW5kLiBgICtcbiAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWA7XG4gICAgbG9nLmVycm9yKG1zZyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbiAgLy8gdHJpbSBhbmQgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoXG4gIGNvbnN0IGRldmVsb3BlclJvb3QgPSBTdHJpbmcoc3Rkb3V0KS5yZXBsYWNlKC9cXC8kLywgJycpLnRyaW0oKTtcbiAgaWYgKCFkZXZlbG9wZXJSb290KSB7XG4gICAgY29uc3QgbXNnID0gYXdhaXQgZ2VuZXJhdGVFcnJvck1lc3NhZ2UoYCd4Y29kZS1zZWxlY3QgLXAnIHJldHVybmVkIGFuIGVtcHR5IHN0cmluZ2ApO1xuICAgIGxvZy5lcnJvcihtc2cpO1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG4gIC8vIHhjb2RlLXNlbGVjdCBtaWdodCBhbHNvIHJldHVybiBhIHBhdGggdG8gY29tbWFuZCBsaW5lIHRvb2xzXG4gIGNvbnN0IHtDRkJ1bmRsZUlkZW50aWZpZXJ9ID0gYXdhaXQgcmVhZFhjb2RlUGxpc3QoZGV2ZWxvcGVyUm9vdCk7XG4gIGlmIChDRkJ1bmRsZUlkZW50aWZpZXIgPT09IFhDT0RFX0JVTkRMRV9JRCkge1xuICAgIHJldHVybiBkZXZlbG9wZXJSb290O1xuICB9XG5cbiAgY29uc3QgbXNnID0gYXdhaXQgZ2VuZXJhdGVFcnJvck1lc3NhZ2UoYCcke2RldmVsb3BlclJvb3R9JyBpcyBub3QgYSB2YWxpZCBYY29kZSBwYXRoYCk7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBtc2c7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIHN1YmZvbGRlciB2aWEgYERFVkVMT1BFUl9ESVJgIGVudmlyb25tZW50IHZhcmlhYmxlXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRnVsbCBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBzdWJmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcm9wZXIgcGF0aFxuICogQHByaXZhdGVSZW1hcmtzIFRoaXMgbWV0aG9kIGFzc3VtZXMgYERFVkVMT1BFUl9ESVJgIGlzIGRlZmluZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyICgpIHtcbiAgY29uc3QgZGV2ZWxvcGVyUm9vdCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhwcm9jZXNzLmVudi5ERVZFTE9QRVJfRElSKTtcbiAgY29uc3Qge0NGQnVuZGxlSWRlbnRpZmllcn0gPSBhd2FpdCByZWFkWGNvZGVQbGlzdChkZXZlbG9wZXJSb290KTtcbiAgaWYgKENGQnVuZGxlSWRlbnRpZmllciA9PT0gWENPREVfQlVORExFX0lEKSB7XG4gICAgcmV0dXJuIGRldmVsb3BlclJvb3Q7XG4gIH1cblxuICBjb25zdCBtc2cgPSBgVGhlIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIGRpciAnJHtkZXZlbG9wZXJSb290fScgcHJvdmlkZWQgaW4gREVWRUxPUEVSX0RJUiBgICtcbiAgYGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBhIHZhbGlkIHBhdGhgO1xuICBsb2cuZXJyb3IobXNnKTtcbiAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIHN1YmZvbGRlci5cbiAqIElmIGBERVZFTE9QRVJfRElSYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwcm92aWRlZCB0aGVuIGl0cyB2YWx1ZSBoYXMgYSBwcmlvcml0eS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSBtYXhpbXVtIHRpbWVvdXQgZm9yIHhjb2RlLXNlbGVjdCBleGVjdXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEZ1bGwgcGF0aCB0byBYY29kZSBEZXZlbG9wZXIgc3ViZm9sZGVyIHRpbWVvdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgcGF0aC5cbiAqL1xuY29uc3QgZ2V0UGF0aCA9IF8ubWVtb2l6ZShcbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpID0+IHByb2Nlc3MuZW52LkRFVkVMT1BFUl9ESVIgPyBnZXRQYXRoRnJvbURldmVsb3BlckRpcigpIDogZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KSk7XG5cbi8qKlxuICogUmV0cmlldmVzIFhjb2RlIHZlcnNpb25cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRpbWVvdXQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRlcm1pbmFsIGNvbW1hbmRzLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VtdmVyXCIpLlNlbVZlciB8IG51bGw+fSBYY29kZSB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSB2ZXJzaW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb25XaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGRldmVsb3BlclBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgY29uc3Qge0NGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nfSA9IGF3YWl0IHJlYWRYY29kZVBsaXN0KGRldmVsb3BlclBhdGgpO1xuICByZXR1cm4gc2VtdmVyLmNvZXJjZShDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIFhjb2RlIHZlcnNpb24gb3IgdGhlIGNhY2hlZCBvbmUgaWYgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHJldHJpZXMgIEhvdyBtYW55IHJldHJpZXMgdG8gYXBwbHkgZm9yIHZlcnNpb24gcmV0cmlldmFsXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VtdmVyXCIpLlNlbVZlciB8IG51bGw+fSBYY29kZSB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSB2ZXJzaW9uXG4gKi9cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gWGNvZGVWZXJzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvblN0cmluZyBYY29kZSB2ZXJzaW9uIGFzIGEgc3RyaW5nXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkZsb2F0IFhjb2RlIHZlcnNpb24gYXMgYSBmbG9hdCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYWpvciBNYWpvciBudW1iZXIgb2YgWGNvZGUgdmVyc2lvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pbm9yIE1pbm9yIG51bWJlciBvZiBYY29kZSB2ZXJzaW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BhdGNoXSBQYXRjaCBudW1iZXIgb2YgWGNvZGUgdmVyc2lvbiAoaWYgZXhpc3RzKVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IHRvU3RyaW5nIFJldHVybnMgWGNvZGUgdmVyc2lvbiBhcyBhIHN0cmluZ1xuICovXG5cbi8qKlxuICogUmV0cmlldmVzIFhjb2RlIHZlcnNpb25cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBhcnNlIFtmYWxzZV0gV2hldGhlciB0byBwYXJzZSB0aGUgdmVyc2lvbiB0byBhIFhjb2RlVmVyc2lvbiB2ZXJzaW9uXG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllcyBbMl0gSG93IG1hbnkgcmV0cmllcyB0byBhcHBseSBmb3IgZ2V0dGluZyB0aGUgdmVyc2lvbiBudW1iZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFsxNTAwMF0gVGltZW91dCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGVybWluYWwgY29tbWFuZHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFhjb2RlVmVyc2lvbiB8IHN0cmluZz59IFhjb2RlIHZlcnNpb24gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBgcGFyc2VgIGZsYWdcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIHJldHJpZXZpbmcgdGhlIHZlcnNpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbiAocGFyc2UgPSBmYWxzZSwgcmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IHZlcnNpb24gPSAvKiogQHR5cGUge2ltcG9ydCgnc2VtdmVyJykuU2VtVmVyfSAqLyhhd2FpdCBnZXRWZXJzaW9uTWVtb2l6ZWQocmV0cmllcywgdGltZW91dCkpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGh0dHBzOi8vdHJhYy5tYWNwb3J0cy5vcmcvd2lraS9YY29kZVZlcnNpb25JbmZvXG4gKiB0byBzZWUgdGhlIGFjdHVhbCBtYXBwaW5nIGJldHdlZW4gY2xhbmcgYW5kIG90aGVyIGNvbXBvbmVudHMuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nfG51bGw+fSBUaGUgYWN0dWFsIENsYW5nIHZlcnNpb24gaW4geC54LngueCBvciB4LngueCBmb3JtYXQsXG4gKiB3aGljaCBpcyBzdXBwbGllZCB3aXRoIENvbW1hbmQgTGluZSBUb29scy4gYG51bGxgIGlzIHJldHVybmVkXG4gKiBpZiBDTFQgYXJlIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENsYW5nVmVyc2lvbiAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goJ2NsYW5nJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuaW5mbygnQ2Fubm90IGZpbmQgY2xhbmcgZXhlY3V0YWJsZSBvbiB0aGUgbG9jYWwgc3lzdGVtLiAnICtcbiAgICAgICdBcmUgWGNvZGUgQ29tbWFuZCBMaW5lIFRvb2xzIGluc3RhbGxlZD8nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2NsYW5nJywgWyctLXZlcnNpb24nXSk7XG4gIGNvbnN0IG1hdGNoID0gL2NsYW5nLShbMC05Ll0rKS8uZXhlYyhzdGRvdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgbG9nLmluZm8oYENhbm5vdCBwYXJzZSBjbGFuZyB2ZXJzaW9uIGZyb20gJHtzdGRvdXR9YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG1hdGNoWzFdO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIGlPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRpbWVvdXQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRlcm1pbmFsIGNvbW1hbmRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgU0RLIHZlcnNpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgU0RLIHZlcnNpb24gbnVtYmVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL1xcZC5cXGQvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyBpT1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIGlPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHBhcmFtIHtudW1iZXJ9IHJldHJpZXMgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBTREsgdmVyc2lvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBTREsgdmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksIHRpbWVvdXQpO1xuICB9XG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIHR2T1MgU0RLIHN1cHBvcnRlZCBieSB0aGUgaW5zdGFsbGVkIFhjb2RlXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGltZW91dCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGVybWluYWwgY29tbWFuZHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBTREsgdmVyc2lvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBTREsgdmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG4gIGNvbnN0IHNka1ZlcnNpb24gPSBzdGRvdXQudHJpbSgpO1xuICBpZiAoaXNOYU4ocGFyc2VGbG9hdChzZGtWZXJzaW9uKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgdHZPUyBTREsgdmVyc2lvbjogJyR7c2RrVmVyc2lvbn0nYCk7XG4gIH1cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBtYXhpbXVtIHZlcnNpb24gb2YgdHZPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIFNESyB2ZXJzaW9uIG51bWJlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNYXhUVk9TU0RLID0gXy5tZW1vaXplKFxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGltZW91dCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGVybWluYWwgY29tbWFuZHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJldHJpZXMgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gVGhlIFNESyB2ZXJzaW9uXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmd9ICovKGF3YWl0IHJldHJ5KHJldHJpZXMsIGdldE1heFRWT1NTREtXaXRob3V0UmV0cnksIHRpbWVvdXQpKTtcbiAgfVxuKTtcblxuZXhwb3J0IHtcbiAgZ2V0UGF0aCwgZ2V0VmVyc2lvbiwgZ2V0TWF4SU9TU0RLLCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldE1heFRWT1NTREssIGdldE1heFRWT1NTREtXaXRob3V0UmV0cnksIGdldENsYW5nVmVyc2lvbixcbiAgZ2V0UGF0aEZyb21EZXZlbG9wZXJEaXIsIGdldFBhdGhGcm9tWGNvZGVTZWxlY3QsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sUUFBQSxHQUFBUCxPQUFBO0FBSUEsTUFBTVEseUJBQXlCLEdBQUcsQ0FBQztBQUNuQyxNQUFNQyxlQUFlLEdBQUcsb0JBQW9CO0FBRTVDLE1BQU1DLEdBQUcsR0FBR0MsZUFBTSxDQUFDQyxTQUFTLENBQUMsT0FBTyxDQUFDO0FBU3JDLGVBQWVDLHNCQUFzQkEsQ0FBRUMsT0FBTyxHQUFHQyxzQkFBYSxFQUFFO0VBSzlELE1BQU1DLG9CQUFvQixHQUFHLE1BQU9DLE1BQU0sSUFBSztJQUM3QyxNQUFNQyxVQUFVLEdBQUcsTUFBTSxJQUFBQyxxQkFBWSxFQUFDVixlQUFlLENBQUM7SUFDdEQsSUFBSVcsZUFBQyxDQUFDQyxPQUFPLENBQUNILFVB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
|
package/build/lib/xcode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xcode.js","names":["_support","require","_path","_interopRequireDefault","_asyncbox","_lodash","_teen_process","_semver","_helpers","DEFAULT_NUMBER_OF_RETRIES","XCODE_BUNDLE_ID","log","logger","getLogger","getPathFromXcodeSelect","timeout","XCRUN_TIMEOUT","generateErrorMessage","prefix","xcodePaths","findAppPaths","_","isEmpty","proposals","map","p","path","join","length","stdout","exec","e","errorAndThrow","stderr","message","developerRoot","replace","trim","CFBundleIdentifier","readXcodePlist","getPathFromDeveloperDir","process","env","DEVELOPER_DIR","getPath","memoize","exports","getVersionWithoutRetry","developerPath","CFBundleShortVersionString","semver","coerce","getVersionMemoized","retries","retry","getVersion","parse","version","versionString","patch","major","minor","versionFloat","parseFloat","undefined","toString","getClangVersion","fs","which","info","match","getMaxIOSSDKWithoutRetry","args","runXcrunCommand","sdkVersion","Error","getMaxIOSSDK","getMaxTVOSSDKWithoutRetry","isNaN","getMaxTVOSSDK"],"sources":["../../lib/xcode.js"],"sourcesContent":["import { fs, logger } from '@appium/support';\nimport path from 'path';\nimport { retry } from 'asyncbox';\nimport _ from 'lodash';\nimport { exec } from 'teen_process';\nimport semver from 'semver';\nimport {\n runXcrunCommand, findAppPaths, XCRUN_TIMEOUT, readXcodePlist\n} from './helpers';\n\nconst DEFAULT_NUMBER_OF_RETRIES = 2;\nconst XCODE_BUNDLE_ID = 'com.apple.dt.Xcode';\n\nconst log = logger.getLogger('Xcode');\n\n/**\n * Retrieves the full path to Xcode Developer subfolder via xcode-select\n *\n * @param {number} timeout The maximum timeout for xcode-select execution\n * @returns {Promise<string>} Full path to Xcode Developer subfolder\n * @throws {Error} If it is not possible to retrieve a proper path\n */\nasync function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {\n const generateErrorMessage = async (prefix) => {\n const xcodePaths = await findAppPaths(XCODE_BUNDLE_ID);\n if (_.isEmpty(xcodePaths)) {\n return `${prefix}. Consider installing Xcode to address this issue.`;\n }\n\n const proposals = xcodePaths.map((p) => ` sudo xcode-select -s \"${path.join(p, 'Contents', 'Developer')}\"`);\n return `${prefix}. ` +\n `Consider running${proposals.length > 1 ? ' any of' : ''}:\\n${proposals.join('\\n')}\\nto address this issue.`;\n };\n\n let stdout;\n try {\n ({stdout} = await exec('xcode-select', ['--print-path'], {timeout}));\n } catch (e) {\n log.errorAndThrow(`Cannot determine the path to Xcode by running 'xcode-select -p' command. ` +\n `Original error: ${e.stderr || e.message}`);\n }\n // trim and remove trailing slash\n const developerRoot = stdout.replace(/\\/$/, '').trim();\n if (!developerRoot) {\n log.errorAndThrow(await generateErrorMessage(`'xcode-select -p' returned an empty string`));\n }\n // xcode-select might also return a path to command line tools\n const {CFBundleIdentifier} = await readXcodePlist(developerRoot);\n if (CFBundleIdentifier === XCODE_BUNDLE_ID) {\n return developerRoot;\n }\n\n log.errorAndThrow(await generateErrorMessage(`'${developerRoot}' is not a valid Xcode path`));\n}\n\n/**\n * Retrieves the full path to Xcode Developer subfolder via DEVELOPER_DIR environment variable\n *\n * @returns {Promise<string>} Full path to Xcode Developer subfolder\n * @throws {Error} If it is not possible to retrieve a proper path\n */\nasync function getPathFromDeveloperDir () {\n const developerRoot = process.env.DEVELOPER_DIR;\n const {CFBundleIdentifier} = await readXcodePlist(developerRoot);\n if (CFBundleIdentifier === XCODE_BUNDLE_ID) {\n return developerRoot;\n }\n\n log.errorAndThrow(`The path to Xcode Developer dir '${developerRoot}' provided in DEVELOPER_DIR ` +\n `environment variable is not a valid path`);\n}\n\n/**\n * Retrieves the full path to Xcode Developer subfolder.\n * If DEVELOPER_DIR environment variable is provided then its value has a priority.\n *\n * @property {number} timeout [15000] The maximum timeout for xcode-select execution\n * @returns {string} Full path to Xcode Developer subfolder\n * @throws {Error} If there was an error while retrieving the path.\n */\nconst getPath = _.memoize(function getPath (timeout = XCRUN_TIMEOUT) {\n return process.env.DEVELOPER_DIR ? getPathFromDeveloperDir() : getPathFromXcodeSelect(timeout);\n});\n\n/**\n * Retrieves Xcode version\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands.\n * @returns {Promise<import(\"semver\").SemVer | null>} Xcode version\n * @throws {Error} If there was a failure while retrieving the version\n */\nasync function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const developerPath = await getPath(timeout);\n // we want to read the CFBundleShortVersionString from Xcode's plist.\n const {CFBundleShortVersionString} = await readXcodePlist(developerPath);\n return semver.coerce(CFBundleShortVersionString);\n}\n\n/**\n * Retrieves Xcode version or the cached one if called more than once\n *\n * @param {number} retries [2] How many retries to apply for version retrieval\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @returns {Promise<import(\"semver\").SemVer | null>} Xcode version\n * @throws {Error} If there was a failure while retrieving the version\n */\nconst getVersionMemoized = _.memoize(\n function getVersionMemoized (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getVersionWithoutRetry, timeout);\n }\n);\n\n/**\n * @typedef {Object} XcodeVersion\n * @property {string} versionString Xcode version as a string\n * @property {number} versionFloat Xcode version as a float number\n * @property {number} major Major number of Xcode version\n * @property {number} minor Minor number of Xcode version\n * @property {number?} patch Patch number of Xcode version (if exists)\n */\n\n/**\n * Retrieves Xcode version\n *\n * @param {boolean} parse [false] Whether to parse the version to a XcodeVersion version\n * @param {number} retries [2] How many retries to apply for getting the version number\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @returns {Promise<XcodeVersion | string>} Xcode version depending on the value of `parse` flag\n * @throws {Error} If there was a failure while retrieving the version\n */\nasync function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n const version = await getVersionMemoized(retries, timeout);\n // xcode version strings are not exactly semver string: patch versions of 0\n // are removed (e.g., '10.0.0' => '10.0')\n const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;\n if (!parse) {\n return versionString;\n }\n\n return {\n versionString,\n versionFloat: parseFloat(versionString),\n major: version.major,\n minor: version.minor,\n patch: version.patch > 0 ? version.patch : undefined,\n toString () {\n return versionString;\n },\n };\n}\n\n/**\n * Check https://trac.macports.org/wiki/XcodeVersionInfo\n * to see the actual mapping between clang and other components.\n *\n * @returns {Promise<string?>} The actual Clang version in x.x.x.x or x.x.x format,\n * which is supplied with Command Line Tools. `null` is returned\n * if CLT are not installed.\n */\nasync function getClangVersion () {\n try {\n await fs.which('clang');\n } catch (e) {\n log.info('Cannot find clang executable on the local system. ' +\n 'Are Xcode Command Line Tools installed?');\n return null;\n }\n const {stdout} = await exec('clang', ['--version']);\n const match = /clang-([0-9.]+)/.exec(stdout);\n if (!match) {\n log.info(`Cannot parse clang version from ${stdout}`);\n return null;\n }\n return match[1];\n}\n\n/**\n * Retrieves the maximum version of iOS SDK supported by the installed Xcode\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @returns {string} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nasync function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n const sdkVersion = stdout.trim();\n const match = /\\d.\\d/.exec(stdout);\n if (!match) {\n throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);\n }\n return sdkVersion;\n}\n\n/**\n * Retrieves the maximum version of iOS SDK supported by the installed Xcode\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @param {number} retries [2] The maximum number of retries\n * @returns {string} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nconst getMaxIOSSDK = _.memoize(\n function getMaxIOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getMaxIOSSDKWithoutRetry, timeout);\n }\n);\n\n/**\n * Retrieves the maximum version of tvOS SDK supported by the installed Xcode\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @returns {string} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nasync function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n const sdkVersion = stdout.trim();\n if (isNaN(parseFloat(sdkVersion))) {\n throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);\n }\n return sdkVersion;\n}\n\n/**\n * Retrieves the maximum version of tvOS SDK supported by the installed Xcode\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @param {number} retries [2] The maximum number of retries\n * @returns {string} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nconst getMaxTVOSSDK = _.memoize(\n function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getMaxTVOSSDKWithoutRetry, timeout);\n }\n);\n\nexport {\n getPath, getVersion, getMaxIOSSDK, getMaxIOSSDKWithoutRetry,\n getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry, getClangVersion,\n getPathFromDeveloperDir, getPathFromXcodeSelect,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xcode.js","names":["_support","require","_path","_interopRequireDefault","_asyncbox","_lodash","_teen_process","_semver","_helpers","DEFAULT_NUMBER_OF_RETRIES","XCODE_BUNDLE_ID","log","logger","getLogger","getPathFromXcodeSelect","timeout","XCRUN_TIMEOUT","generateErrorMessage","prefix","xcodePaths","findAppPaths","_","isEmpty","proposals","map","p","path","join","length","stdout","exec","e","msg","stderr","message","error","Error","developerRoot","String","replace","trim","CFBundleIdentifier","readXcodePlist","getPathFromDeveloperDir","process","env","DEVELOPER_DIR","getPath","memoize","exports","getVersionWithoutRetry","developerPath","CFBundleShortVersionString","semver","coerce","getVersionMemoized","retries","retry","getVersion","parse","version","versionString","patch","major","minor","versionFloat","parseFloat","undefined","toString","getClangVersion","fs","which","info","match","getMaxIOSSDKWithoutRetry","args","runXcrunCommand","sdkVersion","getMaxIOSSDK","getMaxTVOSSDKWithoutRetry","isNaN","getMaxTVOSSDK"],"sources":["../../lib/xcode.js"],"sourcesContent":["import { fs, logger } from '@appium/support';\nimport path from 'path';\nimport { retry } from 'asyncbox';\nimport _ from 'lodash';\nimport { exec } from 'teen_process';\nimport semver from 'semver';\nimport {\n runXcrunCommand, findAppPaths, XCRUN_TIMEOUT, readXcodePlist\n} from './helpers';\n\nconst DEFAULT_NUMBER_OF_RETRIES = 2;\nconst XCODE_BUNDLE_ID = 'com.apple.dt.Xcode';\n\nconst log = logger.getLogger('Xcode');\n\n/**\n * Retrieves the full path to Xcode Developer subfolder via xcode-select\n *\n * @param {number} timeout The maximum timeout for xcode-select execution\n * @returns {Promise<string>} Full path to Xcode Developer subfolder\n * @throws {Error} If it is not possible to retrieve a proper path\n */\nasync function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {\n /**\n * @param {string} prefix\n * @returns {Promise<string>}\n */\n const generateErrorMessage = async (prefix) => {\n const xcodePaths = await findAppPaths(XCODE_BUNDLE_ID);\n if (_.isEmpty(xcodePaths)) {\n return `${prefix}. Consider installing Xcode to address this issue.`;\n }\n\n const proposals = xcodePaths.map((p) => ` sudo xcode-select -s \"${path.join(p, 'Contents', 'Developer')}\"`);\n return `${prefix}. ` +\n `Consider running${proposals.length > 1 ? ' any of' : ''}:\\n${proposals.join('\\n')}\\nto address this issue.`;\n };\n\n let stdout;\n try {\n ({stdout} = await exec('xcode-select', ['--print-path'], {timeout}));\n } catch (e) {\n const msg = `Cannot determine the path to Xcode by running 'xcode-select -p' command. ` +\n `Original error: ${e.stderr || e.message}`;\n log.error(msg);\n throw new Error(msg);\n }\n // trim and remove trailing slash\n const developerRoot = String(stdout).replace(/\\/$/, '').trim();\n if (!developerRoot) {\n const msg = await generateErrorMessage(`'xcode-select -p' returned an empty string`);\n log.error(msg);\n throw new Error(msg);\n }\n // xcode-select might also return a path to command line tools\n const {CFBundleIdentifier} = await readXcodePlist(developerRoot);\n if (CFBundleIdentifier === XCODE_BUNDLE_ID) {\n return developerRoot;\n }\n\n const msg = await generateErrorMessage(`'${developerRoot}' is not a valid Xcode path`);\n log.error(msg);\n throw msg;\n}\n\n/**\n * Retrieves the full path to Xcode Developer subfolder via `DEVELOPER_DIR` environment variable\n *\n * @returns {Promise<string>} Full path to Xcode Developer subfolder\n * @throws {Error} If it is not possible to retrieve a proper path\n * @privateRemarks This method assumes `DEVELOPER_DIR` is defined.\n */\nasync function getPathFromDeveloperDir () {\n const developerRoot = /** @type {string} */(process.env.DEVELOPER_DIR);\n const {CFBundleIdentifier} = await readXcodePlist(developerRoot);\n if (CFBundleIdentifier === XCODE_BUNDLE_ID) {\n return developerRoot;\n }\n\n const msg = `The path to Xcode Developer dir '${developerRoot}' provided in DEVELOPER_DIR ` +\n `environment variable is not a valid path`;\n log.error(msg);\n throw new Error(msg);\n}\n\n/**\n * Retrieves the full path to Xcode Developer subfolder.\n * If `DEVELOPER_DIR` environment variable is provided then its value has a priority.\n * @param {number} timeout The maximum timeout for xcode-select execution\n * @returns {Promise<string>} Full path to Xcode Developer subfolder timeout\n * @throws {Error} If there was an error while retrieving the path.\n */\nconst getPath = _.memoize(\n /**\n * @param {number} timeout\n * @returns {Promise<string>}\n */\n (timeout = XCRUN_TIMEOUT) => process.env.DEVELOPER_DIR ? getPathFromDeveloperDir() : getPathFromXcodeSelect(timeout));\n\n/**\n * Retrieves Xcode version\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands.\n * @returns {Promise<import(\"semver\").SemVer | null>} Xcode version\n * @throws {Error} If there was a failure while retrieving the version\n */\nasync function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const developerPath = await getPath(timeout);\n // we want to read the CFBundleShortVersionString from Xcode's plist.\n const {CFBundleShortVersionString} = await readXcodePlist(developerPath);\n return semver.coerce(CFBundleShortVersionString);\n}\n\n/**\n * Retrieves Xcode version or the cached one if called more than once\n *\n * @param {number} retries How many retries to apply for version retrieval\n * @param {number} timeout Timeout of milliseconds to wait for terminal commands\n * @returns {Promise<import(\"semver\").SemVer | null>} Xcode version\n * @throws {Error} If there was a failure while retrieving the version\n */\nconst getVersionMemoized = _.memoize(\n function getVersionMemoized (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getVersionWithoutRetry, timeout);\n }\n);\n\n/**\n * @typedef {Object} XcodeVersion\n * @property {string} versionString Xcode version as a string\n * @property {number} versionFloat Xcode version as a float number\n * @property {number} major Major number of Xcode version\n * @property {number} minor Minor number of Xcode version\n * @property {number} [patch] Patch number of Xcode version (if exists)\n * @property {() => string} toString Returns Xcode version as a string\n */\n\n/**\n * Retrieves Xcode version\n *\n * @param {boolean} parse [false] Whether to parse the version to a XcodeVersion version\n * @param {number} retries [2] How many retries to apply for getting the version number\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @returns {Promise<XcodeVersion | string>} Xcode version depending on the value of `parse` flag\n * @throws {Error} If there was a failure while retrieving the version\n */\nasync function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n const version = /** @type {import('semver').SemVer} */(await getVersionMemoized(retries, timeout));\n // xcode version strings are not exactly semver string: patch versions of 0\n // are removed (e.g., '10.0.0' => '10.0')\n const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;\n if (!parse) {\n return versionString;\n }\n\n return {\n versionString,\n versionFloat: parseFloat(versionString),\n major: version.major,\n minor: version.minor,\n patch: version.patch > 0 ? version.patch : undefined,\n toString () {\n return versionString;\n },\n };\n}\n\n/**\n * Check https://trac.macports.org/wiki/XcodeVersionInfo\n * to see the actual mapping between clang and other components.\n *\n * @returns {Promise<string|null>} The actual Clang version in x.x.x.x or x.x.x format,\n * which is supplied with Command Line Tools. `null` is returned\n * if CLT are not installed.\n */\nasync function getClangVersion () {\n try {\n await fs.which('clang');\n } catch (e) {\n log.info('Cannot find clang executable on the local system. ' +\n 'Are Xcode Command Line Tools installed?');\n return null;\n }\n const {stdout} = await exec('clang', ['--version']);\n const match = /clang-([0-9.]+)/.exec(stdout);\n if (!match) {\n log.info(`Cannot parse clang version from ${stdout}`);\n return null;\n }\n return match[1];\n}\n\n/**\n * Retrieves the maximum version of iOS SDK supported by the installed Xcode\n *\n * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands\n * @returns {Promise<string>} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nasync function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n const sdkVersion = stdout.trim();\n const match = /\\d.\\d/.exec(stdout);\n if (!match) {\n throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);\n }\n return sdkVersion;\n}\n\n/**\n * Retrieves the maximum version of iOS SDK supported by the installed Xcode\n *\n * @param {number} timeout Timeout of milliseconds to wait for terminal commands\n * @param {number} retries The maximum number of retries\n * @returns {string} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nconst getMaxIOSSDK = _.memoize(\n function getMaxIOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getMaxIOSSDKWithoutRetry, timeout);\n }\n);\n\n/**\n * Retrieves the maximum version of tvOS SDK supported by the installed Xcode\n *\n * @param {number} timeout Timeout of milliseconds to wait for terminal commands\n * @returns {Promise<string>} The SDK version\n * @throws {Error} If the SDK version number cannot be determined\n */\nasync function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n const sdkVersion = stdout.trim();\n if (isNaN(parseFloat(sdkVersion))) {\n throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);\n }\n return sdkVersion;\n}\n\n/**\n * Retrieves the maximum version of tvOS SDK supported by the installed Xcode\n *\n * @throws {Error} If the SDK version number cannot be determined\n */\nconst getMaxTVOSSDK = _.memoize(\n /**\n * @param {number} timeout Timeout of milliseconds to wait for terminal commands\n * @param {number} retries The maximum number of retries\n * @returns {Promise<string>} The SDK version\n */\n async function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return /** @type {string} */(await retry(retries, getMaxTVOSSDKWithoutRetry, timeout));\n }\n);\n\nexport {\n getPath, getVersion, getMaxIOSSDK, getMaxIOSSDKWithoutRetry,\n getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry, getClangVersion,\n getPathFromDeveloperDir, getPathFromXcodeSelect,\n};\n"],"mappings":"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"}
|
package/lib/helpers.js
CHANGED
|
@@ -11,7 +11,7 @@ export const XCRUN_TIMEOUT = 15000;
|
|
|
11
11
|
*
|
|
12
12
|
* @param {string[]} args xcrun arguments
|
|
13
13
|
* @param {number} timeout [15000] The maximum number of milliseconds to wait until xcrun exists
|
|
14
|
-
* @returns {Promise<import("teen_process").
|
|
14
|
+
* @returns {Promise<import("teen_process").TeenProcessExecResult>} The result of xcrun execution
|
|
15
15
|
* @throws {Error} If xcrun returned non-zero exit code or timed out
|
|
16
16
|
*/
|
|
17
17
|
export async function runXcrunCommand (args, timeout = XCRUN_TIMEOUT) {
|
|
@@ -55,7 +55,7 @@ export async function findAppPaths (bundleId) {
|
|
|
55
55
|
return p;
|
|
56
56
|
}
|
|
57
57
|
})());
|
|
58
|
-
return (await B.all(results)).filter(Boolean);
|
|
58
|
+
return /** @type {string[]} */(await B.all(results)).filter(Boolean);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getMaxIOSSDK,
|
|
6
6
|
getMaxTVOSSDK,
|
|
7
7
|
getClangVersion,
|
|
8
|
-
} from './
|
|
8
|
+
} from './xcode';
|
|
9
9
|
|
|
10
10
|
const xcode = {
|
|
11
11
|
getPath,
|
|
@@ -23,3 +23,7 @@ export {
|
|
|
23
23
|
getClangVersion
|
|
24
24
|
};
|
|
25
25
|
export default xcode;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {import('./xcode').XcodeVersion} XcodeVersion
|
|
29
|
+
*/
|
package/lib/xcode.js
CHANGED
|
@@ -21,6 +21,10 @@ const log = logger.getLogger('Xcode');
|
|
|
21
21
|
* @throws {Error} If it is not possible to retrieve a proper path
|
|
22
22
|
*/
|
|
23
23
|
async function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {
|
|
24
|
+
/**
|
|
25
|
+
* @param {string} prefix
|
|
26
|
+
* @returns {Promise<string>}
|
|
27
|
+
*/
|
|
24
28
|
const generateErrorMessage = async (prefix) => {
|
|
25
29
|
const xcodePaths = await findAppPaths(XCODE_BUNDLE_ID);
|
|
26
30
|
if (_.isEmpty(xcodePaths)) {
|
|
@@ -36,13 +40,17 @@ async function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {
|
|
|
36
40
|
try {
|
|
37
41
|
({stdout} = await exec('xcode-select', ['--print-path'], {timeout}));
|
|
38
42
|
} catch (e) {
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
const msg = `Cannot determine the path to Xcode by running 'xcode-select -p' command. ` +
|
|
44
|
+
`Original error: ${e.stderr || e.message}`;
|
|
45
|
+
log.error(msg);
|
|
46
|
+
throw new Error(msg);
|
|
41
47
|
}
|
|
42
48
|
// trim and remove trailing slash
|
|
43
|
-
const developerRoot = stdout.replace(/\/$/, '').trim();
|
|
49
|
+
const developerRoot = String(stdout).replace(/\/$/, '').trim();
|
|
44
50
|
if (!developerRoot) {
|
|
45
|
-
|
|
51
|
+
const msg = await generateErrorMessage(`'xcode-select -p' returned an empty string`);
|
|
52
|
+
log.error(msg);
|
|
53
|
+
throw new Error(msg);
|
|
46
54
|
}
|
|
47
55
|
// xcode-select might also return a path to command line tools
|
|
48
56
|
const {CFBundleIdentifier} = await readXcodePlist(developerRoot);
|
|
@@ -50,37 +58,44 @@ async function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {
|
|
|
50
58
|
return developerRoot;
|
|
51
59
|
}
|
|
52
60
|
|
|
53
|
-
|
|
61
|
+
const msg = await generateErrorMessage(`'${developerRoot}' is not a valid Xcode path`);
|
|
62
|
+
log.error(msg);
|
|
63
|
+
throw msg;
|
|
54
64
|
}
|
|
55
65
|
|
|
56
66
|
/**
|
|
57
|
-
* Retrieves the full path to Xcode Developer subfolder via DEVELOPER_DIR environment variable
|
|
67
|
+
* Retrieves the full path to Xcode Developer subfolder via `DEVELOPER_DIR` environment variable
|
|
58
68
|
*
|
|
59
69
|
* @returns {Promise<string>} Full path to Xcode Developer subfolder
|
|
60
70
|
* @throws {Error} If it is not possible to retrieve a proper path
|
|
71
|
+
* @privateRemarks This method assumes `DEVELOPER_DIR` is defined.
|
|
61
72
|
*/
|
|
62
73
|
async function getPathFromDeveloperDir () {
|
|
63
|
-
const developerRoot = process.env.DEVELOPER_DIR;
|
|
74
|
+
const developerRoot = /** @type {string} */(process.env.DEVELOPER_DIR);
|
|
64
75
|
const {CFBundleIdentifier} = await readXcodePlist(developerRoot);
|
|
65
76
|
if (CFBundleIdentifier === XCODE_BUNDLE_ID) {
|
|
66
77
|
return developerRoot;
|
|
67
78
|
}
|
|
68
79
|
|
|
69
|
-
|
|
70
|
-
|
|
80
|
+
const msg = `The path to Xcode Developer dir '${developerRoot}' provided in DEVELOPER_DIR ` +
|
|
81
|
+
`environment variable is not a valid path`;
|
|
82
|
+
log.error(msg);
|
|
83
|
+
throw new Error(msg);
|
|
71
84
|
}
|
|
72
85
|
|
|
73
86
|
/**
|
|
74
87
|
* Retrieves the full path to Xcode Developer subfolder.
|
|
75
|
-
* If DEVELOPER_DIR environment variable is provided then its value has a priority.
|
|
76
|
-
*
|
|
77
|
-
* @
|
|
78
|
-
* @returns {string} Full path to Xcode Developer subfolder
|
|
88
|
+
* If `DEVELOPER_DIR` environment variable is provided then its value has a priority.
|
|
89
|
+
* @param {number} timeout The maximum timeout for xcode-select execution
|
|
90
|
+
* @returns {Promise<string>} Full path to Xcode Developer subfolder timeout
|
|
79
91
|
* @throws {Error} If there was an error while retrieving the path.
|
|
80
92
|
*/
|
|
81
|
-
const getPath = _.memoize(
|
|
82
|
-
|
|
83
|
-
}
|
|
93
|
+
const getPath = _.memoize(
|
|
94
|
+
/**
|
|
95
|
+
* @param {number} timeout
|
|
96
|
+
* @returns {Promise<string>}
|
|
97
|
+
*/
|
|
98
|
+
(timeout = XCRUN_TIMEOUT) => process.env.DEVELOPER_DIR ? getPathFromDeveloperDir() : getPathFromXcodeSelect(timeout));
|
|
84
99
|
|
|
85
100
|
/**
|
|
86
101
|
* Retrieves Xcode version
|
|
@@ -99,8 +114,8 @@ async function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
99
114
|
/**
|
|
100
115
|
* Retrieves Xcode version or the cached one if called more than once
|
|
101
116
|
*
|
|
102
|
-
* @param {number} retries
|
|
103
|
-
* @param {number} timeout
|
|
117
|
+
* @param {number} retries How many retries to apply for version retrieval
|
|
118
|
+
* @param {number} timeout Timeout of milliseconds to wait for terminal commands
|
|
104
119
|
* @returns {Promise<import("semver").SemVer | null>} Xcode version
|
|
105
120
|
* @throws {Error} If there was a failure while retrieving the version
|
|
106
121
|
*/
|
|
@@ -116,7 +131,8 @@ const getVersionMemoized = _.memoize(
|
|
|
116
131
|
* @property {number} versionFloat Xcode version as a float number
|
|
117
132
|
* @property {number} major Major number of Xcode version
|
|
118
133
|
* @property {number} minor Minor number of Xcode version
|
|
119
|
-
* @property {number
|
|
134
|
+
* @property {number} [patch] Patch number of Xcode version (if exists)
|
|
135
|
+
* @property {() => string} toString Returns Xcode version as a string
|
|
120
136
|
*/
|
|
121
137
|
|
|
122
138
|
/**
|
|
@@ -129,7 +145,7 @@ const getVersionMemoized = _.memoize(
|
|
|
129
145
|
* @throws {Error} If there was a failure while retrieving the version
|
|
130
146
|
*/
|
|
131
147
|
async function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
132
|
-
const version = await getVersionMemoized(retries, timeout);
|
|
148
|
+
const version = /** @type {import('semver').SemVer} */(await getVersionMemoized(retries, timeout));
|
|
133
149
|
// xcode version strings are not exactly semver string: patch versions of 0
|
|
134
150
|
// are removed (e.g., '10.0.0' => '10.0')
|
|
135
151
|
const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
|
|
@@ -153,7 +169,7 @@ async function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, t
|
|
|
153
169
|
* Check https://trac.macports.org/wiki/XcodeVersionInfo
|
|
154
170
|
* to see the actual mapping between clang and other components.
|
|
155
171
|
*
|
|
156
|
-
* @returns {Promise<string
|
|
172
|
+
* @returns {Promise<string|null>} The actual Clang version in x.x.x.x or x.x.x format,
|
|
157
173
|
* which is supplied with Command Line Tools. `null` is returned
|
|
158
174
|
* if CLT are not installed.
|
|
159
175
|
*/
|
|
@@ -178,7 +194,7 @@ async function getClangVersion () {
|
|
|
178
194
|
* Retrieves the maximum version of iOS SDK supported by the installed Xcode
|
|
179
195
|
*
|
|
180
196
|
* @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands
|
|
181
|
-
* @returns {string} The SDK version
|
|
197
|
+
* @returns {Promise<string>} The SDK version
|
|
182
198
|
* @throws {Error} If the SDK version number cannot be determined
|
|
183
199
|
*/
|
|
184
200
|
async function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
@@ -195,8 +211,8 @@ async function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
195
211
|
/**
|
|
196
212
|
* Retrieves the maximum version of iOS SDK supported by the installed Xcode
|
|
197
213
|
*
|
|
198
|
-
* @param {number} timeout
|
|
199
|
-
* @param {number} retries
|
|
214
|
+
* @param {number} timeout Timeout of milliseconds to wait for terminal commands
|
|
215
|
+
* @param {number} retries The maximum number of retries
|
|
200
216
|
* @returns {string} The SDK version
|
|
201
217
|
* @throws {Error} If the SDK version number cannot be determined
|
|
202
218
|
*/
|
|
@@ -209,8 +225,8 @@ const getMaxIOSSDK = _.memoize(
|
|
|
209
225
|
/**
|
|
210
226
|
* Retrieves the maximum version of tvOS SDK supported by the installed Xcode
|
|
211
227
|
*
|
|
212
|
-
* @param {number} timeout
|
|
213
|
-
* @returns {string} The SDK version
|
|
228
|
+
* @param {number} timeout Timeout of milliseconds to wait for terminal commands
|
|
229
|
+
* @returns {Promise<string>} The SDK version
|
|
214
230
|
* @throws {Error} If the SDK version number cannot be determined
|
|
215
231
|
*/
|
|
216
232
|
async function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
@@ -226,14 +242,16 @@ async function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {
|
|
|
226
242
|
/**
|
|
227
243
|
* Retrieves the maximum version of tvOS SDK supported by the installed Xcode
|
|
228
244
|
*
|
|
229
|
-
* @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands
|
|
230
|
-
* @param {number} retries [2] The maximum number of retries
|
|
231
|
-
* @returns {string} The SDK version
|
|
232
245
|
* @throws {Error} If the SDK version number cannot be determined
|
|
233
246
|
*/
|
|
234
247
|
const getMaxTVOSSDK = _.memoize(
|
|
235
|
-
|
|
236
|
-
|
|
248
|
+
/**
|
|
249
|
+
* @param {number} timeout Timeout of milliseconds to wait for terminal commands
|
|
250
|
+
* @param {number} retries The maximum number of retries
|
|
251
|
+
* @returns {Promise<string>} The SDK version
|
|
252
|
+
*/
|
|
253
|
+
async function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
|
|
254
|
+
return /** @type {string} */(await retry(retries, getMaxTVOSSDKWithoutRetry, timeout));
|
|
237
255
|
}
|
|
238
256
|
);
|
|
239
257
|
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"ios",
|
|
7
7
|
"xcode"
|
|
8
8
|
],
|
|
9
|
-
"version": "5.0
|
|
9
|
+
"version": "5.1.0",
|
|
10
10
|
"author": "Appium Contributors",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"repository": {
|
|
@@ -20,21 +20,21 @@
|
|
|
20
20
|
"node": ">=14",
|
|
21
21
|
"npm": ">=8"
|
|
22
22
|
},
|
|
23
|
-
"main": "./build/index.js",
|
|
24
|
-
"bin": {},
|
|
23
|
+
"main": "./build/lib/index.js",
|
|
25
24
|
"directories": {
|
|
26
25
|
"lib": "lib"
|
|
27
26
|
},
|
|
28
27
|
"files": [
|
|
29
28
|
"index.js",
|
|
30
29
|
"lib",
|
|
31
|
-
"build/index.js",
|
|
32
30
|
"build/lib",
|
|
33
31
|
"CHANGELOG.md"
|
|
34
32
|
],
|
|
35
33
|
"dependencies": {
|
|
36
34
|
"@appium/support": "^3.0.0",
|
|
37
35
|
"@babel/runtime": "^7.0.0",
|
|
36
|
+
"@types/lodash": "^4.14.192",
|
|
37
|
+
"@types/teen_process": "^2.0.0",
|
|
38
38
|
"asyncbox": "^2.3.0",
|
|
39
39
|
"lodash": "^4.17.4",
|
|
40
40
|
"plist": "^3.0.1",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"teen_process": "^2.0.0"
|
|
44
44
|
},
|
|
45
45
|
"scripts": {
|
|
46
|
-
"build": "rm -rf build && babel --out-dir=build/lib lib &&
|
|
46
|
+
"build": "rm -rf build && babel --out-dir=build/lib lib && tsc -b",
|
|
47
47
|
"dev": "npm run build -- --watch",
|
|
48
48
|
"lint": "eslint .",
|
|
49
49
|
"lint:fix": "npm run lint -- --fix",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@appium/eslint-config-appium": "^6.0.0",
|
|
72
|
+
"@appium/tsconfig": "^0.2.4",
|
|
72
73
|
"@babel/cli": "^7.18.10",
|
|
73
74
|
"@babel/core": "^7.18.10",
|
|
74
75
|
"@babel/eslint-parser": "^7.18.9",
|
|
@@ -77,6 +78,10 @@
|
|
|
77
78
|
"@babel/register": "^7.18.9",
|
|
78
79
|
"@semantic-release/changelog": "^6.0.1",
|
|
79
80
|
"@semantic-release/git": "^10.0.1",
|
|
81
|
+
"@types/chai": "^4.3.4",
|
|
82
|
+
"@types/chai-as-promised": "^7.1.5",
|
|
83
|
+
"@types/mocha": "^10.0.1",
|
|
84
|
+
"@types/semver": "^7.3.13",
|
|
80
85
|
"babel-plugin-source-map-support": "^2.2.0",
|
|
81
86
|
"chai": "^4.1.2",
|
|
82
87
|
"chai-as-promised": "^7.1.1",
|
|
@@ -90,6 +95,8 @@
|
|
|
90
95
|
"mocha": "^10.0.0",
|
|
91
96
|
"pre-commit": "^1.1.3",
|
|
92
97
|
"prettier": "^2.7.1",
|
|
93
|
-
"semantic-release": "^20.0.2"
|
|
94
|
-
|
|
98
|
+
"semantic-release": "^20.0.2",
|
|
99
|
+
"typescript": "^5.0.2"
|
|
100
|
+
},
|
|
101
|
+
"types": "./build/lib/index.d.ts"
|
|
95
102
|
}
|