appium-xcode 5.0.1 → 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 CHANGED
@@ -1,3 +1,17 @@
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
+
8
+ ## [5.0.2](https://github.com/appium/appium-xcode/compare/v5.0.1...v5.0.2) (2023-03-27)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Join array items properly ([#80](https://github.com/appium/appium-xcode/issues/80)) ([02f7bbf](https://github.com/appium/appium-xcode/commit/02f7bbfe7a16386094f3ec34a516a2b39a4e2fae))
14
+
1
15
  ## [5.0.1](https://github.com/appium/appium-xcode/compare/v5.0.0...v5.0.1) (2023-01-17)
2
16
 
3
17
 
@@ -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"}
@@ -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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJYQ1JVTl9USU1FT1VUIiwicnVuWGNydW5Db21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJleGVjIiwiZXJyIiwic3RkZXJyIiwibWVzc2FnZSIsImZpbmRBcHBQYXRocyIsImJ1bmRsZUlkIiwic3Rkb3V0IiwiZSIsIm1hdGNoZWRQYXRocyIsIl8iLCJ0cmltIiwic3BsaXQiLCJtYXAiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaXNFbXB0eSIsInJlc3VsdHMiLCJwIiwiZnMiLCJleGlzdHMiLCJCIiwiYWxsIiwicmVhZFhjb2RlUGxpc3QiLCJkZXZlbG9wZXJSb290IiwicGxpc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuXG4vKipcbiAqIEV4ZWN1dGVzICd4Y3J1bicgY29tbWFuZCBsaW5lIHV0aWxpdHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIHhjcnVuIGFyZ3VtZW50c1xuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgeGNydW4gZXhpc3RzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJ0ZWVuX3Byb2Nlc3NcIikuRXhlY1Jlc3VsdD59IFRoZSByZXN1bHQgb2YgeGNydW4gZXhlY3V0aW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgeGNydW4gcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBjb2RlIG9yIHRpbWVkIG91dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjKCd4Y3J1bicsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIHRoZSB0cnVlIGVycm9yIGNhbiBiZSBoaWRkZW4gd2l0aGluIHRoZSBzdGRlcnJcbiAgICBpZiAoZXJyLnN0ZGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtlcnIubWVzc2FnZX06ICR7ZXJyLnN0ZGVycn1gO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxufVxuXG4vKipcbiAqIFVzZXMgbWFjT1MgU3BvdGxpZ2h0IHNlcnZpY2UgdG8gZGV0ZWN0IHdoZXJlIHRoZSBnaXZlbiBhcHAgaXMgaW5zdGFsbGVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkIEJ1bmRsZSBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgYXBwXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IEZ1bGwgcGF0aHMgdG8gd2hlcmUgdGhlIGFwcCB3aXRoIHRoZSBnaXZlbiBidW5kbGUgaWQgaXMgcHJlc2VudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBcHBQYXRocyAoYnVuZGxlSWQpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCcvdXNyL2Jpbi9tZGZpbmQnLCBbXG4gICAgICBga01ESXRlbUNGQnVuZGxlSWRlbnRpZmllcj0ke2J1bmRsZUlkfWBcbiAgICBdKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtYXRjaGVkUGF0aHMgPSBfLnRyaW0oc3Rkb3V0KVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKF8udHJpbSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAoXy5pc0VtcHR5KG1hdGNoZWRQYXRocykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IG1hdGNoZWRQYXRocy5tYXAoKHApID0+IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhwKSkge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICB9KSgpKTtcbiAgcmV0dXJuIChhd2FpdCBCLmFsbChyZXN1bHRzKSkuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG4vKipcbiAqIEZpbmRzIGFuZCByZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIFhjb2RlJ3MgSW5mby5wbGlzdCBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRldmVsb3BlclJvb3QgRnVsbCBwYXRoIHRvIHRoZSBDb250ZW50cy9EZXZlbG9wZXIgZm9sZGVyIHVuZGVyIFhjb2RlLmFwcCByb290XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBBbGwgcGxpc3QgZW50cmllcyBhcyBhbiBvYmplY3Qgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIG5vIHBsaXN0IHdhcyBmb3VuZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFhjb2RlUGxpc3QgKGRldmVsb3BlclJvb3QpIHtcbiAgY29uc3QgcGxpc3RQYXRoID0gcGF0aC5yZXNvbHZlKGRldmVsb3BlclJvb3QsICcuLicsICdJbmZvLnBsaXN0Jyk7XG4gIHJldHVybiBhd2FpdCBmcy5leGlzdHMocGxpc3RQYXRoKVxuICAgID8gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKVxuICAgIDoge307XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVPLE1BQU1BLGFBQWEsR0FBRyxLQUFLO0FBQUM7QUFVNUIsZUFBZUMsZUFBZSxDQUFFQyxJQUFJLEVBQUVDLE9BQU8sR0FBR0gsYUFBYSxFQUFFO0VBQ3BFLElBQUk7SUFDRixPQUFPLE1BQU0sSUFBQUksa0JBQUksRUFBQyxPQUFPLEVBQUVGLElBQUksRUFBRTtNQUFDQztJQUFPLENBQUMsQ0FBQztFQUM3QyxDQUFDLENBQUMsT0FBT0UsR0FBRyxFQUFFO0lBRVosSUFBSUEsR0FBRyxDQUFDQyxNQUFNLEVBQUU7TUFDZEQsR0FBRyxDQUFDRSxPQUFPLEdBQUksR0FBRUYsR0FBRyxDQUFDRSxPQUFRLEtBQUlGLEdBQUcsQ0FBQ0MsTUFBTyxFQUFDO0lBQy9DO0lBRUEsTUFBTUQsR0FBRztFQUNYO0FBQ0Y7QUFRTyxlQUFlRyxZQUFZLENBQUVDLFFBQVEsRUFBRTtFQUM1QyxJQUFJQyxNQUFNO0VBQ1YsSUFBSTtJQUNGLENBQUM7TUFBQ0E7SUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFBTixrQkFBSSxFQUFDLGlCQUFpQixFQUFFLENBQ3ZDLDZCQUE0QkssUUFBUyxFQUFDLENBQ3hDLENBQUM7RUFDSixDQUFDLENBQUMsT0FBT0UsQ0FBQyxFQUFFO0lBQ1YsT0FBTyxFQUFFO0VBQ1g7RUFFQSxNQUFNQyxZQUFZLEdBQUdDLGVBQUMsQ0FBQ0MsSUFBSSxDQUFDSixNQUFNLENBQUMsQ0FDaENLLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWEMsR0FBRyxDQUFDSCxlQUFDLENBQUNDLElBQUksQ0FBQyxDQUNYRyxNQUFNLENBQUNDLE9BQU8sQ0FBQztFQUNsQixJQUFJTCxlQUFDLENBQUNNLE9BQU8sQ0FBQ1AsWUFBWSxDQUFDLEVBQUU7SUFDM0IsT0FBTyxFQUFFO0VBQ1g7RUFDQSxNQUFNUSxPQUFPLEdBQUdSLFlBQVksQ0FBQ0ksR0FBRyxDQUFFSyxDQUFDLElBQUssQ0FBQyxZQUFZO0lBQ25ELElBQUksTUFBTUMsV0FBRSxDQUFDQyxNQUFNLENBQUNGLENBQUMsQ0FBQyxFQUFFO01BQ3RCLE9BQU9BLENBQUM7SUFDVjtFQUNGLENBQUMsR0FBRyxDQUFDO0VBQ0wsT0FBTyxDQUFDLE1BQU1HLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ0wsT0FBTyxDQUFDLEVBQUVILE1BQU0sQ0FBQ0MsT0FBTyxDQUFDO0FBQy9DO0FBUU8sZUFBZVEsY0FBYyxDQUFFQyxhQUFhLEVBQUU7RUFDbkQsTUFBTUMsU0FBUyxHQUFHQyxhQUFJLENBQUNDLE9BQU8sQ0FBQ0gsYUFBYSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUM7RUFDakUsT0FBTyxPQUFNTCxXQUFFLENBQUNDLE1BQU0sQ0FBQ0ssU0FBUyxDQUFDLElBQzdCLE1BQU1HLGNBQUssQ0FBQ0MsY0FBYyxDQUFDSixTQUFTLENBQUMsR0FDckMsQ0FBQyxDQUFDO0FBQ1IifQ==
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYmx1ZWJpcmQiLCJfdGVlbl9wcm9jZXNzIiwiX3N1cHBvcnQiLCJfcGF0aCIsIlhDUlVOX1RJTUVPVVQiLCJleHBvcnRzIiwicnVuWGNydW5Db21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJleGVjIiwiZXJyIiwic3RkZXJyIiwibWVzc2FnZSIsImZpbmRBcHBQYXRocyIsImJ1bmRsZUlkIiwic3Rkb3V0IiwiZSIsIm1hdGNoZWRQYXRocyIsIl8iLCJ0cmltIiwic3BsaXQiLCJtYXAiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaXNFbXB0eSIsInJlc3VsdHMiLCJwIiwiZnMiLCJleGlzdHMiLCJCIiwiYWxsIiwicmVhZFhjb2RlUGxpc3QiLCJkZXZlbG9wZXJSb290IiwicGxpc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIHBsaXN0IH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuXG4vKipcbiAqIEV4ZWN1dGVzICd4Y3J1bicgY29tbWFuZCBsaW5lIHV0aWxpdHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIHhjcnVuIGFyZ3VtZW50c1xuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgeGNydW4gZXhpc3RzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJ0ZWVuX3Byb2Nlc3NcIikuVGVlblByb2Nlc3NFeGVjUmVzdWx0Pn0gVGhlIHJlc3VsdCBvZiB4Y3J1biBleGVjdXRpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB4Y3J1biByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgb3IgdGltZWQgb3V0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5YY3J1bkNvbW1hbmQgKGFyZ3MsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWMoJ3hjcnVuJywgYXJncywge3RpbWVvdXR9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIHRydWUgZXJyb3IgY2FuIGJlIGhpZGRlbiB3aXRoaW4gdGhlIHN0ZGVyclxuICAgIGlmIChlcnIuc3RkZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2Vyci5tZXNzYWdlfTogJHtlcnIuc3RkZXJyfWA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogVXNlcyBtYWNPUyBTcG90bGlnaHQgc2VydmljZSB0byBkZXRlY3Qgd2hlcmUgdGhlIGdpdmVuIGFwcCBpcyBpbnN0YWxsZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWQgQnVuZGxlIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBhcHBcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gRnVsbCBwYXRocyB0byB3aGVyZSB0aGUgYXBwIHdpdGggdGhlIGdpdmVuIGJ1bmRsZSBpZCBpcyBwcmVzZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEFwcFBhdGhzIChidW5kbGVJZCkge1xuICBsZXQgc3Rkb3V0O1xuICB0cnkge1xuICAgICh7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJy91c3IvYmluL21kZmluZCcsIFtcbiAgICAgIGBrTURJdGVtQ0ZCdW5kbGVJZGVudGlmaWVyPSR7YnVuZGxlSWR9YFxuICAgIF0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZWRQYXRocyA9IF8udHJpbShzdGRvdXQpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoXy50cmltKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChfLmlzRW1wdHkobWF0Y2hlZFBhdGhzKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCByZXN1bHRzID0gbWF0Y2hlZFBhdGhzLm1hcCgocCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHApKSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gIH0pKCkpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8oYXdhaXQgQi5hbGwocmVzdWx0cykpLmZpbHRlcihCb29sZWFuKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhbmQgcmV0cmlldmVzIHRoZSBjb250ZW50IG9mIHRoZSBYY29kZSdzIEluZm8ucGxpc3QgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZlbG9wZXJSb290IEZ1bGwgcGF0aCB0byB0aGUgQ29udGVudHMvRGV2ZWxvcGVyIGZvbGRlciB1bmRlciBYY29kZS5hcHAgcm9vdFxuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn0gQWxsIHBsaXN0IGVudHJpZXMgYXMgYW4gb2JqZWN0IG9yIGFuIGVtcHR5IG9iamVjdCBpZiBubyBwbGlzdCB3YXMgZm91bmRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRYY29kZVBsaXN0IChkZXZlbG9wZXJSb290KSB7XG4gIGNvbnN0IHBsaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShkZXZlbG9wZXJSb290LCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuICByZXR1cm4gYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aClcbiAgICA/IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3RGaWxlKHBsaXN0UGF0aClcbiAgICA6IHt9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUVPLE1BQU1LLGFBQWEsR0FBRyxLQUFLO0FBQUNDLE9BQUEsQ0FBQUQsYUFBQSxHQUFBQSxhQUFBO0FBVTVCLGVBQWVFLGVBQWVBLENBQUVDLElBQUksRUFBRUMsT0FBTyxHQUFHSixhQUFhLEVBQUU7RUFDcEUsSUFBSTtJQUNGLE9BQU8sTUFBTSxJQUFBSyxrQkFBSSxFQUFDLE9BQU8sRUFBRUYsSUFBSSxFQUFFO01BQUNDO0lBQU8sQ0FBQyxDQUFDO0VBQzdDLENBQUMsQ0FBQyxPQUFPRSxHQUFHLEVBQUU7SUFFWixJQUFJQSxHQUFHLENBQUNDLE1BQU0sRUFBRTtNQUNkRCxHQUFHLENBQUNFLE9BQU8sR0FBSSxHQUFFRixHQUFHLENBQUNFLE9BQVEsS0FBSUYsR0FBRyxDQUFDQyxNQUFPLEVBQUM7SUFDL0M7SUFFQSxNQUFNRCxHQUFHO0VBQ1g7QUFDRjtBQVFPLGVBQWVHLFlBQVlBLENBQUVDLFFBQVEsRUFBRTtFQUM1QyxJQUFJQyxNQUFNO0VBQ1YsSUFBSTtJQUNGLENBQUM7TUFBQ0E7SUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFBTixrQkFBSSxFQUFDLGlCQUFpQixFQUFFLENBQ3ZDLDZCQUE0QkssUUFBUyxFQUFDLENBQ3hDLENBQUM7RUFDSixDQUFDLENBQUMsT0FBT0UsQ0FBQyxFQUFFO0lBQ1YsT0FBTyxFQUFFO0VBQ1g7RUFFQSxNQUFNQyxZQUFZLEdBQUdDLGVBQUMsQ0FBQ0MsSUFBSSxDQUFDSixNQUFNLENBQUMsQ0FDaENLLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDWEMsR0FBRyxDQUFDSCxlQUFDLENBQUNDLElBQUksQ0FBQyxDQUNYRyxNQUFNLENBQUNDLE9BQU8sQ0FBQztFQUNsQixJQUFJTCxlQUFDLENBQUNNLE9BQU8sQ0FBQ1AsWUFBWSxDQUFDLEVBQUU7SUFDM0IsT0FBTyxFQUFFO0VBQ1g7RUFDQSxNQUFNUSxPQUFPLEdBQUdSLFlBQVksQ0FBQ0ksR0FBRyxDQUFFSyxDQUFDLElBQUssQ0FBQyxZQUFZO0lBQ25ELElBQUksTUFBTUMsV0FBRSxDQUFDQyxNQUFNLENBQUNGLENBQUMsQ0FBQyxFQUFFO01BQ3RCLE9BQU9BLENBQUM7SUFDVjtFQUNGLENBQUMsR0FBRyxDQUFDO0VBQ0wsT0FBOEIsQ0FBQyxNQUFNRyxpQkFBQyxDQUFDQyxHQUFHLENBQUNMLE9BQU8sQ0FBQyxFQUFFSCxNQUFNLENBQUNDLE9BQU8sQ0FBQztBQUN0RTtBQVFPLGVBQWVRLGNBQWNBLENBQUVDLGFBQWEsRUFBRTtFQUNuRCxNQUFNQyxTQUFTLEdBQUdDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDSCxhQUFhLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQztFQUNqRSxPQUFPLE9BQU1MLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDSyxTQUFTLENBQUMsSUFDN0IsTUFBTUcsY0FBSyxDQUFDQyxjQUFjLENBQUNKLFNBQVMsQ0FBQyxHQUNyQyxDQUFDLENBQUM7QUFDUiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":["XCRUN_TIMEOUT","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\").ExecResult>} 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 (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;AACA;AACA;AACA;AACA;AAEO,MAAMA,aAAa,GAAG,KAAK;AAAC;AAU5B,eAAeC,eAAe,CAAEC,IAAI,EAAEC,OAAO,GAAGH,aAAa,EAAE;EACpE,IAAI;IACF,OAAO,MAAM,IAAAI,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,YAAY,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,OAAO,CAAC,MAAMG,iBAAC,CAACC,GAAG,CAACL,OAAO,CAAC,EAAEH,MAAM,CAACC,OAAO,CAAC;AAC/C;AAQO,eAAeQ,cAAc,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"}
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"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ Object.defineProperty(exports, "getClangVersion", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _xcode.getClangVersion;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "getMaxIOSSDK", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _xcode.getMaxIOSSDK;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "getMaxTVOSSDK", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _xcode.getMaxTVOSSDK;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "getPath", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _xcode.getPath;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "getVersion", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _xcode.getVersion;
35
+ }
36
+ });
37
+ require("source-map-support/register");
38
+ var _xcode = require("./xcode");
39
+ const xcode = {
40
+ getPath: _xcode.getPath,
41
+ getVersion: _xcode.getVersion,
42
+ getMaxIOSSDK: _xcode.getMaxIOSSDK,
43
+ getMaxTVOSSDK: _xcode.getMaxTVOSSDK,
44
+ getClangVersion: _xcode.getClangVersion
45
+ };
46
+ var _default = xcode;
47
+ exports.default = _default;
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"}
@@ -31,7 +31,7 @@ async function getPathFromXcodeSelect(timeout = _helpers.XCRUN_TIMEOUT) {
31
31
  return `${prefix}. Consider installing Xcode to address this issue.`;
32
32
  }
33
33
  const proposals = xcodePaths.map(p => ` sudo xcode-select -s "${_path.default.join(p, 'Contents', 'Developer')}"`);
34
- return `${prefix}. ` + `Consider running${proposals.length > 1 ? ' any of' : ''}:\n${'\n'.join(proposals)}\nto address this issue.`;
34
+ return `${prefix}. ` + `Consider running${proposals.length > 1 ? ' any of' : ''}:\n${proposals.join('\n')}\nto address this issue.`;
35
35
  };
36
36
  let stdout;
37
37
  try {
@@ -41,11 +41,15 @@ async function getPathFromXcodeSelect(timeout = _helpers.XCRUN_TIMEOUT) {
41
41
  timeout
42
42
  }));
43
43
  } catch (e) {
44
- log.errorAndThrow(`Cannot determine the path to Xcode by running 'xcode-select -p' command. ` + `Original error: ${e.stderr || e.message}`);
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
- log.errorAndThrow(await generateErrorMessage(`'xcode-select -p' returned an empty string`));
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
- log.errorAndThrow(await generateErrorMessage(`'${developerRoot}' is not a valid Xcode path`));
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
- log.errorAndThrow(`The path to Xcode Developer dir '${developerRoot}' provided in DEVELOPER_DIR ` + `environment variable is not a valid path`);
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(function getPath(timeout = _helpers.XCRUN_TIMEOUT) {
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTIiwiWENPREVfQlVORExFX0lEIiwibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiZ2V0UGF0aEZyb21YY29kZVNlbGVjdCIsInRpbWVvdXQiLCJYQ1JVTl9USU1FT1VUIiwiZ2VuZXJhdGVFcnJvck1lc3NhZ2UiLCJwcmVmaXgiLCJ4Y29kZVBhdGhzIiwiZmluZEFwcFBhdGhzIiwiXyIsImlzRW1wdHkiLCJwcm9wb3NhbHMiLCJtYXAiLCJwIiwicGF0aCIsImpvaW4iLCJsZW5ndGgiLCJzdGRvdXQiLCJleGVjIiwiZSIsImVycm9yQW5kVGhyb3ciLCJzdGRlcnIiLCJtZXNzYWdlIiwiZGV2ZWxvcGVyUm9vdCIsInJlcGxhY2UiLCJ0cmltIiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwicmVhZFhjb2RlUGxpc3QiLCJnZXRQYXRoRnJvbURldmVsb3BlckRpciIsInByb2Nlc3MiLCJlbnYiLCJERVZFTE9QRVJfRElSIiwiZ2V0UGF0aCIsIm1lbW9pemUiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwiZGV2ZWxvcGVyUGF0aCIsIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIiwic2VtdmVyIiwiY29lcmNlIiwiZ2V0VmVyc2lvbk1lbW9pemVkIiwicmV0cmllcyIsInJldHJ5IiwiZ2V0VmVyc2lvbiIsInBhcnNlIiwidmVyc2lvbiIsInZlcnNpb25TdHJpbmciLCJwYXRjaCIsIm1ham9yIiwibWlub3IiLCJ2ZXJzaW9uRmxvYXQiLCJwYXJzZUZsb2F0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJnZXRDbGFuZ1ZlcnNpb24iLCJmcyIsIndoaWNoIiwiaW5mbyIsIm1hdGNoIiwiZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5IiwiYXJncyIsInJ1blhjcnVuQ29tbWFuZCIsInNka1ZlcnNpb24iLCJFcnJvciIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiXSwic291cmNlcyI6WyIuLi8uLi9saWIveGNvZGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnMsIGxvZ2dlciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5IH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgcnVuWGNydW5Db21tYW5kLCBmaW5kQXBwUGF0aHMsIFhDUlVOX1RJTUVPVVQsIHJlYWRYY29kZVBsaXN0XG59IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMgPSAyO1xuY29uc3QgWENPREVfQlVORExFX0lEID0gJ2NvbS5hcHBsZS5kdC5YY29kZSc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmdWxsIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIHN1YmZvbGRlciB2aWEgeGNvZGUtc2VsZWN0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIG1heGltdW0gdGltZW91dCBmb3IgeGNvZGUtc2VsZWN0IGV4ZWN1dGlvblxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gRnVsbCBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBzdWJmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcm9wZXIgcGF0aFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBnZW5lcmF0ZUVycm9yTWVzc2FnZSA9IGFzeW5jIChwcmVmaXgpID0+IHtcbiAgICBjb25zdCB4Y29kZVBhdGhzID0gYXdhaXQgZmluZEFwcFBhdGhzKFhDT0RFX0JVTkRMRV9JRCk7XG4gICAgaWYgKF8uaXNFbXB0eSh4Y29kZVBhdGhzKSkge1xuICAgICAgcmV0dXJuIGAke3ByZWZpeH0uIENvbnNpZGVyIGluc3RhbGxpbmcgWGNvZGUgdG8gYWRkcmVzcyB0aGlzIGlzc3VlLmA7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcG9zYWxzID0geGNvZGVQYXRocy5tYXAoKHApID0+IGAgICAgc3VkbyB4Y29kZS1zZWxlY3QgLXMgXCIke3BhdGguam9pbihwLCAnQ29udGVudHMnLCAnRGV2ZWxvcGVyJyl9XCJgKTtcbiAgICByZXR1cm4gYCR7cHJlZml4fS4gYCArXG4gICAgICBgQ29uc2lkZXIgcnVubmluZyR7cHJvcG9zYWxzLmxlbmd0aCA+IDEgPyAnIGFueSBvZicgOiAnJ306XFxuJHsnXFxuJy5qb2luKHByb3Bvc2Fscyl9XFxudG8gYWRkcmVzcyB0aGlzIGlzc3VlLmA7XG4gIH07XG5cbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZGV0ZXJtaW5lIHRoZSBwYXRoIHRvIFhjb2RlIGJ5IHJ1bm5pbmcgJ3hjb2RlLXNlbGVjdCAtcCcgY29tbWFuZC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCBkZXZlbG9wZXJSb290ID0gc3Rkb3V0LnJlcGxhY2UoL1xcLyQvLCAnJykudHJpbSgpO1xuICBpZiAoIWRldmVsb3BlclJvb3QpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhhd2FpdCBnZW5lcmF0ZUVycm9yTWVzc2FnZShgJ3hjb2RlLXNlbGVjdCAtcCcgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nYCkpO1xuICB9XG4gIC8vIHhjb2RlLXNlbGVjdCBtaWdodCBhbHNvIHJldHVybiBhIHBhdGggdG8gY29tbWFuZCBsaW5lIHRvb2xzXG4gIGNvbnN0IHtDRkJ1bmRsZUlkZW50aWZpZXJ9ID0gYXdhaXQgcmVhZFhjb2RlUGxpc3QoZGV2ZWxvcGVyUm9vdCk7XG4gIGlmIChDRkJ1bmRsZUlkZW50aWZpZXIgPT09IFhDT0RFX0JVTkRMRV9JRCkge1xuICAgIHJldHVybiBkZXZlbG9wZXJSb290O1xuICB9XG5cbiAgbG9nLmVycm9yQW5kVGhyb3coYXdhaXQgZ2VuZXJhdGVFcnJvck1lc3NhZ2UoYCcke2RldmVsb3BlclJvb3R9JyBpcyBub3QgYSB2YWxpZCBYY29kZSBwYXRoYCkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBzdWJmb2xkZXIgdmlhIERFVkVMT1BFUl9ESVIgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBGdWxsIHBhdGggdG8gWGNvZGUgRGV2ZWxvcGVyIHN1YmZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByb3BlciBwYXRoXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyICgpIHtcbiAgY29uc3QgZGV2ZWxvcGVyUm9vdCA9IHByb2Nlc3MuZW52LkRFVkVMT1BFUl9ESVI7XG4gIGNvbnN0IHtDRkJ1bmRsZUlkZW50aWZpZXJ9ID0gYXdhaXQgcmVhZFhjb2RlUGxpc3QoZGV2ZWxvcGVyUm9vdCk7XG4gIGlmIChDRkJ1bmRsZUlkZW50aWZpZXIgPT09IFhDT0RFX0JVTkRMRV9JRCkge1xuICAgIHJldHVybiBkZXZlbG9wZXJSb290O1xuICB9XG5cbiAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBwYXRoIHRvIFhjb2RlIERldmVsb3BlciBkaXIgJyR7ZGV2ZWxvcGVyUm9vdH0nIHByb3ZpZGVkIGluIERFVkVMT1BFUl9ESVIgYCArXG4gICAgYGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBhIHZhbGlkIHBhdGhgKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZ1bGwgcGF0aCB0byBYY29kZSBEZXZlbG9wZXIgc3ViZm9sZGVyLlxuICogSWYgREVWRUxPUEVSX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwcm92aWRlZCB0aGVuIGl0cyB2YWx1ZSBoYXMgYSBwcmlvcml0eS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRoZSBtYXhpbXVtIHRpbWVvdXQgZm9yIHhjb2RlLXNlbGVjdCBleGVjdXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgcGF0aCB0byBYY29kZSBEZXZlbG9wZXIgc3ViZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHBhdGguXG4gKi9cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0UGF0aCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkRFVkVMT1BFUl9ESVIgPyBnZXRQYXRoRnJvbURldmVsb3BlckRpcigpIDogZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KTtcbn0pO1xuXG4vKipcbiAqIFJldHJpZXZlcyBYY29kZSB2ZXJzaW9uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbXZlclwiKS5TZW1WZXIgfCBudWxsPn0gWGNvZGUgdmVyc2lvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgdmVyc2lvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBkZXZlbG9wZXJQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcbiAgLy8gd2Ugd2FudCB0byByZWFkIHRoZSBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyBmcm9tIFhjb2RlJ3MgcGxpc3QuXG4gIGNvbnN0IHtDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZ30gPSBhd2FpdCByZWFkWGNvZGVQbGlzdChkZXZlbG9wZXJQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UoQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmcpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBYY29kZSB2ZXJzaW9uIG9yIHRoZSBjYWNoZWQgb25lIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFsyXSBIb3cgbWFueSByZXRyaWVzIHRvIGFwcGx5IGZvciB2ZXJzaW9uIHJldHJpZXZhbFxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VtdmVyXCIpLlNlbVZlciB8IG51bGw+fSBYY29kZSB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSB2ZXJzaW9uXG4gKi9cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gWGNvZGVWZXJzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvblN0cmluZyBYY29kZSB2ZXJzaW9uIGFzIGEgc3RyaW5nXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkZsb2F0IFhjb2RlIHZlcnNpb24gYXMgYSBmbG9hdCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYWpvciBNYWpvciBudW1iZXIgb2YgWGNvZGUgdmVyc2lvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pbm9yIE1pbm9yIG51bWJlciBvZiBYY29kZSB2ZXJzaW9uXG4gKiBAcHJvcGVydHkge251bWJlcj99IHBhdGNoIFBhdGNoIG51bWJlciBvZiBYY29kZSB2ZXJzaW9uIChpZiBleGlzdHMpXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgWGNvZGUgdmVyc2lvblxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyc2UgW2ZhbHNlXSBXaGV0aGVyIHRvIHBhcnNlIHRoZSB2ZXJzaW9uIHRvIGEgWGNvZGVWZXJzaW9uIHZlcnNpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFsyXSBIb3cgbWFueSByZXRyaWVzIHRvIGFwcGx5IGZvciBnZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlclxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8WGNvZGVWZXJzaW9uIHwgc3RyaW5nPn0gWGNvZGUgdmVyc2lvbiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGBwYXJzZWAgZmxhZ1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgdmVyc2lvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uIChwYXJzZSA9IGZhbHNlLCByZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb25NZW1vaXplZChyZXRyaWVzLCB0aW1lb3V0KTtcbiAgLy8geGNvZGUgdmVyc2lvbiBzdHJpbmdzIGFyZSBub3QgZXhhY3RseSBzZW12ZXIgc3RyaW5nOiBwYXRjaCB2ZXJzaW9ucyBvZiAwXG4gIC8vIGFyZSByZW1vdmVkIChlLmcuLCAnMTAuMC4wJyA9PiAnMTAuMCcpXG4gIGNvbnN0IHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uLnBhdGNoID4gMCA/IHZlcnNpb24udmVyc2lvbiA6IGAke3ZlcnNpb24ubWFqb3J9LiR7dmVyc2lvbi5taW5vcn1gO1xuICBpZiAoIXBhcnNlKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZlcnNpb25TdHJpbmcsXG4gICAgdmVyc2lvbkZsb2F0OiBwYXJzZUZsb2F0KHZlcnNpb25TdHJpbmcpLFxuICAgIG1ham9yOiB2ZXJzaW9uLm1ham9yLFxuICAgIG1pbm9yOiB2ZXJzaW9uLm1pbm9yLFxuICAgIHBhdGNoOiB2ZXJzaW9uLnBhdGNoID4gMCA/IHZlcnNpb24ucGF0Y2ggOiB1bmRlZmluZWQsXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBodHRwczovL3RyYWMubWFjcG9ydHMub3JnL3dpa2kvWGNvZGVWZXJzaW9uSW5mb1xuICogdG8gc2VlIHRoZSBhY3R1YWwgbWFwcGluZyBiZXR3ZWVuIGNsYW5nIGFuZCBvdGhlciBjb21wb25lbnRzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz8+fSBUaGUgYWN0dWFsIENsYW5nIHZlcnNpb24gaW4geC54LngueCBvciB4LngueCBmb3JtYXQsXG4gKiB3aGljaCBpcyBzdXBwbGllZCB3aXRoIENvbW1hbmQgTGluZSBUb29scy4gYG51bGxgIGlzIHJldHVybmVkXG4gKiBpZiBDTFQgYXJlIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENsYW5nVmVyc2lvbiAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goJ2NsYW5nJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuaW5mbygnQ2Fubm90IGZpbmQgY2xhbmcgZXhlY3V0YWJsZSBvbiB0aGUgbG9jYWwgc3lzdGVtLiAnICtcbiAgICAgICdBcmUgWGNvZGUgQ29tbWFuZCBMaW5lIFRvb2xzIGluc3RhbGxlZD8nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2NsYW5nJywgWyctLXZlcnNpb24nXSk7XG4gIGNvbnN0IG1hdGNoID0gL2NsYW5nLShbMC05Ll0rKS8uZXhlYyhzdGRvdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgbG9nLmluZm8oYENhbm5vdCBwYXJzZSBjbGFuZyB2ZXJzaW9uIGZyb20gJHtzdGRvdXR9YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG1hdGNoWzFdO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIGlPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRpbWVvdXQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRlcm1pbmFsIGNvbW1hbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgU0RLIHZlcnNpb25cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgU0RLIHZlcnNpb24gbnVtYmVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gL1xcZC5cXGQvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyBpT1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIGlPUyBTREsgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0YWxsZWQgWGNvZGVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBbMTUwMDBdIFRpbWVvdXQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRlcm1pbmFsIGNvbW1hbmRzXG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllcyBbMl0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBTREsgdmVyc2lvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBTREsgdmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksIHRpbWVvdXQpO1xuICB9XG4pO1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbWF4aW11bSB2ZXJzaW9uIG9mIHR2T1MgU0RLIHN1cHBvcnRlZCBieSB0aGUgaW5zdGFsbGVkIFhjb2RlXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgWzE1MDAwXSBUaW1lb3V0IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0ZXJtaW5hbCBjb21tYW5kc1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIFNESyB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIFNESyB2ZXJzaW9uIG51bWJlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCBhcmdzID0gWyctLXNkaycsICdhcHBsZXR2c2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG4gIGlmIChpc05hTihwYXJzZUZsb2F0KHNka1ZlcnNpb24pKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgeGNydW4gcmV0dXJuZWQgYSBub24tbnVtZXJpYyB0dk9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuICByZXR1cm4gc2RrVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG1heGltdW0gdmVyc2lvbiBvZiB0dk9TIFNESyBzdXBwb3J0ZWQgYnkgdGhlIGluc3RhbGxlZCBYY29kZVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFsxNTAwMF0gVGltZW91dCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGVybWluYWwgY29tbWFuZHNcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFsyXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllc1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIFNESyB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIFNESyB2ZXJzaW9uIG51bWJlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNYXhUVk9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhUVk9TU0RLIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldE1heElPU1NESywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCBnZXRDbGFuZ1ZlcnNpb24sXG4gIGdldFBhdGhGcm9tRGV2ZWxvcGVyRGlyLCBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUEsTUFBTUEseUJBQXlCLEdBQUcsQ0FBQztBQUNuQyxNQUFNQyxlQUFlLEdBQUcsb0JBQW9CO0FBRTVDLE1BQU1DLEdBQUcsR0FBR0MsZUFBTSxDQUFDQyxTQUFTLENBQUMsT0FBTyxDQUFDO0FBU3JDLGVBQWVDLHNCQUFzQixDQUFFQyxPQUFPLEdBQUdDLHNCQUFhLEVBQUU7RUFDOUQsTUFBTUMsb0JBQW9CLEdBQUcsTUFBT0MsTUFBTSxJQUFLO0lBQzdDLE1BQU1DLFVBQVUsR0FBRyxNQUFNLElBQUFDLHFCQUFZLEVB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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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
@@ -1 +1 @@
1
- {"version":3,"file":"xcode.js","names":["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","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${'\\n'.join(proposals)}\\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").ExecResult>} The result of xcrun execution
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 './lib/xcode';
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)) {
@@ -29,20 +33,24 @@ async function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {
29
33
 
30
34
  const proposals = xcodePaths.map((p) => ` sudo xcode-select -s "${path.join(p, 'Contents', 'Developer')}"`);
31
35
  return `${prefix}. ` +
32
- `Consider running${proposals.length > 1 ? ' any of' : ''}:\n${'\n'.join(proposals)}\nto address this issue.`;
36
+ `Consider running${proposals.length > 1 ? ' any of' : ''}:\n${proposals.join('\n')}\nto address this issue.`;
33
37
  };
34
38
 
35
39
  let stdout;
36
40
  try {
37
41
  ({stdout} = await exec('xcode-select', ['--print-path'], {timeout}));
38
42
  } catch (e) {
39
- log.errorAndThrow(`Cannot determine the path to Xcode by running 'xcode-select -p' command. ` +
40
- `Original error: ${e.stderr || e.message}`);
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
- log.errorAndThrow(await generateErrorMessage(`'xcode-select -p' returned an empty string`));
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
- log.errorAndThrow(await generateErrorMessage(`'${developerRoot}' is not a valid Xcode path`));
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
- log.errorAndThrow(`The path to Xcode Developer dir '${developerRoot}' provided in DEVELOPER_DIR ` +
70
- `environment variable is not a valid path`);
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
- * @property {number} timeout [15000] The maximum timeout for xcode-select execution
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(function getPath (timeout = XCRUN_TIMEOUT) {
82
- return process.env.DEVELOPER_DIR ? getPathFromDeveloperDir() : getPathFromXcodeSelect(timeout);
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 [2] How many retries to apply for version retrieval
103
- * @param {number} timeout [15000] Timeout of milliseconds to wait for terminal commands
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?} patch Patch number of Xcode version (if exists)
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?>} The actual Clang version in x.x.x.x or x.x.x format,
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 [15000] Timeout of milliseconds to wait for terminal commands
199
- * @param {number} retries [2] The maximum number of 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 [15000] Timeout of milliseconds to wait for terminal commands
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
- function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
236
- return retry(retries, getMaxTVOSSDKWithoutRetry, timeout);
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.1",
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 && babel --out-dir=build index.js",
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
  }
package/build/index.js DELETED
@@ -1,48 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- Object.defineProperty(exports, "getClangVersion", {
8
- enumerable: true,
9
- get: function () {
10
- return _xcode.getClangVersion;
11
- }
12
- });
13
- Object.defineProperty(exports, "getMaxIOSSDK", {
14
- enumerable: true,
15
- get: function () {
16
- return _xcode.getMaxIOSSDK;
17
- }
18
- });
19
- Object.defineProperty(exports, "getMaxTVOSSDK", {
20
- enumerable: true,
21
- get: function () {
22
- return _xcode.getMaxTVOSSDK;
23
- }
24
- });
25
- Object.defineProperty(exports, "getPath", {
26
- enumerable: true,
27
- get: function () {
28
- return _xcode.getPath;
29
- }
30
- });
31
- Object.defineProperty(exports, "getVersion", {
32
- enumerable: true,
33
- get: function () {
34
- return _xcode.getVersion;
35
- }
36
- });
37
- require("source-map-support/register");
38
- var _xcode = require("./lib/xcode");
39
- const xcode = {
40
- getPath: _xcode.getPath,
41
- getVersion: _xcode.getVersion,
42
- getMaxIOSSDK: _xcode.getMaxIOSSDK,
43
- getMaxTVOSSDK: _xcode.getMaxTVOSSDK,
44
- getClangVersion: _xcode.getClangVersion
45
- };
46
- var _default = xcode;
47
- exports.default = _default;
48
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ4Y29kZSIsImdldFBhdGgiLCJnZXRWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLIiwiZ2V0TWF4VFZPU1NESyIsImdldENsYW5nVmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptYWluXG5pbXBvcnQge1xuICBnZXRQYXRoLFxuICBnZXRWZXJzaW9uLFxuICBnZXRNYXhJT1NTREssXG4gIGdldE1heFRWT1NTREssXG4gIGdldENsYW5nVmVyc2lvbixcbn0gZnJvbSAnLi9saWIveGNvZGUnO1xuXG5jb25zdCB4Y29kZSA9IHtcbiAgZ2V0UGF0aCxcbiAgZ2V0VmVyc2lvbixcbiAgZ2V0TWF4SU9TU0RLLFxuICBnZXRNYXhUVk9TU0RLLFxuICBnZXRDbGFuZ1ZlcnNpb25cbn07XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsXG4gIGdldFZlcnNpb24sXG4gIGdldE1heElPU1NESyxcbiAgZ2V0TWF4VFZPU1NESyxcbiAgZ2V0Q2xhbmdWZXJzaW9uXG59O1xuZXhwb3J0IGRlZmF1bHQgeGNvZGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTtBQVFBLE1BQU1BLEtBQUssR0FBRztFQUNaQyxPQUFPLEVBQVBBLGNBQU87RUFDUEMsVUFBVSxFQUFWQSxpQkFBVTtFQUNWQyxZQUFZLEVBQVpBLG1CQUFZO0VBQ1pDLGFBQWEsRUFBYkEsb0JBQWE7RUFDYkMsZUFBZSxFQUFmQTtBQUNGLENBQUM7QUFBQyxlQVNhTCxLQUFLO0FBQUEifQ==