diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..c3c5275 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,7 @@ +{ + "rules": { + "max-depth": "off", + "quote-props": "off", + "security/detect-non-literal-regexp": "off" + } +} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 03da80c..9c5bc7d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,7 +1,7 @@ name: Publish on: release: - types: [ published ] + types: [ created ] jobs: publish: @@ -10,12 +10,14 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 + with: + fetch-depth: 0 - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v2 with: - node-version: 20 + node-version: '16' registry-url: 'https://registry.npmjs.org' - name: Install dependencies @@ -24,5 +26,6 @@ jobs: - name: Publish to npm env: + GH_TOKEN: ${{ github.token }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: npm publish --tag ${{ github.event.release.prerelease && 'next' || 'latest' }} + run: npm publish diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml deleted file mode 100644 index 3244fa0..0000000 --- a/.github/workflows/test.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Test -on: - - pull_request - - push - -jobs: - test: - runs-on: macos-latest - name: Test - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: 'https://registry.npmjs.org' - - - name: Install dependencies - run: npm ci - if: steps.node-cache.outputs.cache-hit != 'true' - - - name: Run tests - run: npm test diff --git a/.gitignore b/.gitignore index 64b14f6..a48f85c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,10 @@ ._* -.DS_Store -dist -npm-debug.log +.DS_Store* +.nyc_output +/coverage +/dist +/docs +junit.xml node_modules -env.properties -junit_report.xml - -test/TestApp/info.plist -test/TestApp/build -test/TestApp/index -test/TestApp/Logs -test/TestApp/ModuleCache -test/TestApp/ModuleCache.noindex -test/TestApp/TestApp.xcodeproj/xcuserdata -test/TestApp/TestApp.xcodeproj/project.xcworkspace - -test/TestWatchApp/info.plist -test/TestWatchApp/build -test/TestWatchApp/index -test/TestWatchApp/Logs -test/TestWatchApp/ModuleCache -test/TestWatchApp/ModuleCache.noindex -test/TestWatchApp/TestWatchApp.xcodeproj/xcuserdata -test/TestWatchApp/TestWatchApp.xcodeproj/project.xcworkspace - -test/TestWatchApp2/info.plist -test/TestWatchApp2/build -test/TestWatchApp2/index -test/TestWatchApp2/Logs -test/TestWatchApp2/ModuleCache -test/TestWatchApp2/ModuleCache.noindex -test/TestWatchApp2/TestWatchApp2.xcodeproj/xcuserdata -test/TestWatchApp2/TestWatchApp2.xcodeproj/project.xcworkspace +npm-debug.log +yarn-error.log diff --git a/.npmignore b/.npmignore index 19dc191..02f0988 100644 --- a/.npmignore +++ b/.npmignore @@ -1,31 +1,18 @@ ._* +.babelrc .DS_Store +.eslintrc .git* -/dist -/node_modules -/npm-debug.log -/env.properties - -test/TestApp/info.plist -test/TestApp/build -test/TestApp/Build -test/TestApp/Logs -test/TestApp/ModuleCache -test/TestApp/TestApp.xcodeproj/xcuserdata -test/TestApp/TestApp.xcodeproj/project.xcworkspace - -test/TestWatchApp/info.plist -test/TestWatchApp/build -test/TestWatchApp/Build -test/TestWatchApp/Logs -test/TestWatchApp/ModuleCache -test/TestWatchApp/TestWatchApp.xcodeproj/xcuserdata -test/TestWatchApp/TestWatchApp.xcodeproj/project.xcworkspace - -test/TestWatchApp2/info.plist -test/TestWatchApp2/build -test/TestWatchApp2/Build -test/TestWatchApp2/Logs -test/TestWatchApp2/ModuleCache -test/TestWatchApp2/TestWatchApp2.xcodeproj/xcuserdata -test/TestWatchApp2/TestWatchApp2.xcodeproj/project.xcworkspace +.nyc_output +.travis.yml +/coverage +/docs +gulpfile.js +Jenkinsfile +junit.xml +node_modules +npm-debug.log +yarn.lock +yarn-error.log +/src +/test diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8dd2c72 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +os: osx +osx_image: xcode11.6 +xcode_sdk: iphonesimulator13.6 +language: node_js +node_js: + - "10" + - "12" + - "14" +sudo: false +before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash + - export PATH=$HOME/.yarn/bin:$PATH +cache: + yarn: true +install: yarn +before_script: sh -c "git log | head -12" +script: yarn run coverage diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f48a334 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,177 @@ +# v4.2.2 (Jan 5, 2021) + + * chore: Updated dependencies. + +# v4.2.1 (Dec 2, 2020) + + * fix: Fixed yarn lockfile. + +# v4.2.0 (Dec 2, 2020) + + * chore: Updated dependencies. + +# v4.1.0 (Aug 25, 2020) + + * feat(xcode): Added `userLicenseFile` path. + * chore: Updated dependencies. + +# v4.0.0 (Jun 23, 2020) + + * BREAKING CHANGE: Dropped support for Node.js 10.12 and older. Please use Node.js 10.13.0 LTS or + newer. + * feat: Added Xcode 12 and iOS 14 to the device pair compatibility table. + * feat: Lazy load `node-ios-device` when listing or watching for devices. + * chore: Updated dependencies. + +# v3.2.5 (Jan 8, 2020) + + * chore: Updated dependencies. + +# v3.2.4 (Nov 19, 2019) + + * fix(xcode): Fixed bug where compatible iOS runtime filtering was also being applied to watchOS + runtimes causing them to not be listed. + [(DAEMON-306)](https://jira.appcelerator.org/browse/DAEMON-306) + +# v3.2.3 (Nov 7, 2019) + + * fix(simulator): Fixed watchOS sim semver ranges for device pair compatibility lookup and added a + truthiness check in case we ever need to blacklist a version. + * fix(simulator): Added `simctl` and `simualator` executables to simulator info handles. + * fix(cli): Fixed simulator info to display generated data instead of just the unsorted sims. + * fix(xcode): Fix Xcode sim runtime compatiblity lookup. + [(TIMOB-27463)](https://jira.appcelerator.org/browse/TIMOB-27463) + * chore: Updated dependencies. + +# v3.2.2 (Aug 29, 2019) + + * fix: Added support for Apple developer certificates. + [(TIMOB-27358)](https://jira.appcelerator.org/browse/TIMOB-27358) + * chore: Updated dependencies. + +# v3.2.1 (Aug 14, 2019) + + * feat: Registered `ioslib` bin in `package.json`. + * chore: Updated dependencies. + +# v3.2.0 (Aug 12, 2019) + + * feat: Added `teamId` to certificate info. + * chore: Updated dependencies. + +# v3.1.1 (Jul 8, 2019) + + * fix: Removed global simulator profiles directory from Xcode `coreSimulatorProfilesPaths`. + +# v3.1.0 (Jul 8, 2019) + + * fix: Added new Xcode 11 simulator runtime and device types search paths. + * feat: Added `info` and `reset-sims` commands to `ioslib` CLI. + * feat: Added `coreSimulatorProfilesPaths` to Xcode info object. + [(DAEMON-250)](https://jira.appcelerator.org/browse/DAEMON-250) + +# v3.0.0 (Jul 2, 2019) + + * BREAKING CHANGE: Dropped support for Node.js versions before v8.12.0. + * BREAKING CHANGE(dep): Upgraded to node-ios-device v2 which dropped support for Node.js 7.x and + older. + * BREAKING CHANGE(simulator): iOS Simulator watch companion lookup map changed to only have + compatible watch simulator UDIDs instead of full descriptor to save on memory. + * fix(simulator): Added check for the existence of the simulator device directory before walking. + * feat(simulator): Added support for Xcode 11. + * chore: Updated dependencies. + +# v2.5.1 (Aug 29, 2019) + + * fix: Added support for Apple developer certificates. + [(TIMOB-27358)](https://jira.appcelerator.org/browse/TIMOB-27358) + +# v2.5.0 (Aug 14, 2019) + + * feat: Added teamId to certificate info. + * feat: Added info and reset-sims commands to ioslib CLI. + * feat: Added coreSimulatorProfilesPaths to Xcode info object. (DAEMON-250) + * feat(simulator): Added support for Xcode 11. + * fix: Removed global simulator profiles directory from Xcode coreSimulatorProfilesPaths. + * fix: Added new Xcode 11 simulator runtime and device types search paths. + * fix(simulator): Added check for the existence of the simulator device directory before walking. + +# v2.4.0 (Mar 29, 2019) + + * chore: Updated dependencies. + +# v2.3.1 (Jan 25, 2019) + + * chore: Updated dependencies. + +# v2.3.0 (Jan 16, 2019) + + * refactor: Upgraded to Gulp 4. + * refactor: Refactored promises to use async/await. + * fix: Added pluralize dependency since it was removed from snooplogg 2. + * chore: Updated dependencies. + +# v2.2.3 (Aug 6, 2018) + + * fix: Workaround for sim runtimes that have a bad version number in the runtime's + `profile.plist`. [(DAEMON-259)](https://jira.appcelerator.org/browse/DAEMON-259) + * refactor: Moved simctl path into executables under xcode info. + +# v2.2.2 (Aug 6, 2018) + + * fix: Added path to global Xcode license file. + * chore: Updated dependencies. + +# v2.2.1 (Jun 11, 2018) + + * feat: Added the `ioslib detect-device-pairs` command. + * chore: Updated the device pair compatibility table. + * chore: Updated dependencies. + +# v2.2.0 (Jun 5, 2018) + + * chore: Added Xcode 10 to device pair lookup. + [(TIMOB-26089)](https://jira.appcelerator.org/browse/TIMOB-26089) + +# v2.1.0 (May 30, 2018) + + * chore: Updated `ioslib` bin to use `cli-kit`'s help, version, and aliases. + * chore: Updated dependencies. + +# v2.0.7 (Apr 9, 2018) + + * chore: Updated dependencies. + +# v2.0.6 (Dec 14, 2017) + + * fix: Fixed bug where extract teams from provisioning profiles would fail if any provisioning + profiles didn't have any associated teams. + [(DAEMON-209)](https://jira.appcelerator.org/browse/DAEMON-209) + +# v2.0.5 (Dec 12, 2017) + + * chore: Updated dependencies. + +# v2.0.4 (Dec 11, 2017) + + * fix: Fixed bug where a failure to parse a cert name would cause no certs to be found and an + error to be thrown. + +# v2.0.3 (Dec 6, 2017) + + * chore: Updated dependencies. + +# v2.0.2 (Nov 22, 2017) + + * chore: Updated dependencies. + +# v2.0.1 (Nov 17, 2017) + + * chore: Removed hard coded path that was used for debugging. + +# v2.0.0 (Nov 17, 2017) + + * Initial release of the v2 rewrite. + * Updated code to ES2015. + * Support for detecting Xcode, iOS SDKs, simulators, devices, keychains, certs, provisioning + profiles, and teams. diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..b3f24a5 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,7 @@ +#! groovy +library 'pipeline-library' + +runNPMPackage { + nodeVersions = [ '10.19.0', '12.18.0', '14.4.0' ] + platforms = [ 'osx' ] +} diff --git a/LICENSE b/LICENSE index 904d84b..83175f5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,4 @@ -Copyright TiDev, Inc. 4/7/2022-Present -Copyright 2014-2020 by Appcelerator, Inc. +Copyright 2014-2021 by Axway, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12,34 +11,3 @@ Copyright 2014-2020 by Appcelerator, Inc. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -------------------------------------------------------------------------------- - -lib/certs.js contains code from the "forge" project. -https://github.com/digitalbazaar/forge - -New BSD License (3-clause) -Copyright (c) 2010, Digital Bazaar, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Digital Bazaar, Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL DIGITAL BAZAAR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 1ebe74a..cdd190d 100644 --- a/README.md +++ b/README.md @@ -1,225 +1,11 @@ # iOS Utility Library -> This is a library of utilities for dealing programmatically with iOS applications, -used namely for tools like [Hyperloop](https://github.com/tidev/hyperloop) -and [Titanium SDK](https://github.com/tidev/titanium-sdk). - -ioslib supports Xcode 6 and newer. - -## Installation - -From NPM: - - npm install ioslib - -## Examples - -### Detect all the connected iOS devices: - -```javascript -var ioslib = require('ioslib'); - -ioslib.device.detect(function (err, devices) { - if (err) { - console.error(err); - } else { - console.log(devices); - } -}); -``` - -### Install an application on device - -```javascript -var deviceUDID = null; // string or null to pick first device - -ioslib.device.install(deviceUDID, '/path/to/name.app', 'com.company.appname') - .on('installed', function () { - console.log('App successfully installed on device'); - }) - .on('appStarted', function () { - console.log('App has started'); - }) - .on('log', function (msg) { - console.log('[LOG] ' + msg); - }) - .on('appQuit', function () { - console.log('App has quit'); - }) - .on('error', function (err) { - console.error(err); - }); -``` - -### Launch the iOS Simulator - -```javascript -ioslib.simulator.launch(null, function (err, simHandle) { - console.log('Simulator launched'); - ioslib.simulator.stop(simHandle, function () { - console.log('Simulator stopped'); - }); -}); -``` - -### Launch, install, and run an application on simulator - -```javascript -var simUDID = null; // string or null to pick a simulator - -ioslib.simulator.launch(simUDID, { - appPath: '/path/to/name.app' - }) - .on('launched', function (msg) { - console.log('Simulator has launched'); - }) - .on('appStarted', function (msg) { - console.log('App has started'); - }) - .on('log', function (msg) { - console.log('[LOG] ' + msg); - }) - .on('error', function (err) { - console.error(err); - }); -``` - -### Force stop an application running on simulator - -```javascript -ioslib.simulator.launch(simUDID, { - appPath: '/path/to/name.app' - }) - .on('launched', function (simHandle) { - console.log('Simulator launched'); - ioslib.simulator.stop(simHandle).on('stopped', function () { - console.log('Simulator stopped'); - }); - }); -``` - -### Find a valid device/cert/provisioning profile combination - -```javascript -ioslib.findValidDeviceCertProfileCombos({ - appId: 'com.company.appname' -}, function (err, results) { - if (err) { - console.error(err); - } else { - console.log(results); - } -}); -``` - -### Detect everything - -```javascript -ioslib.detect(function (err, info) { - if (err) { - console.error(err); - } else { - console.log(info); - } -}); -``` - -### Detect iOS certificates - -```javascript -ioslib.certs.detect(function (err, certs) { - if (err) { - console.error(err); - } else { - console.log(certs); - } -}); -``` - -### Detect provisioning profiles - -```javascript -ioslib.provisioning.detect(function (err, profiles) { - if (err) { - console.error(err); - } else { - console.log(profiles); - } -}); -``` - -### Detect Xcode installations - -```javascript -ioslib.xcode.detect(function (err, xcodeInfo) { - if (err) { - console.error(err); - } else { - console.log(xcodeInfo); - } -}); -``` - -## Running Tests - -For best results, connect an iOS device. - -To run all tests: - -``` -npm test -``` - -To see debug logging, set the `DEBUG` environment variable: - -``` -DEBUG=1 npm test -``` - -To run a specific test suite: - -``` -npm run-script test-certs - -npm run-script test-device - -npm run-script test-env - -npm run-script test-ioslib - -npm run-script test-provisioning - -npm run-script test-simulator - -npm run-script test-xcode -``` - -## Contributing - -Interested in contributing? There are several ways you can help contribute to this project. - -### New Features, Improvements, Bug Fixes, & Documentation - -Source code contributions are always welcome! Before we can accept your pull request, you must sign a Contributor License Agreement (CLA). Please visit https://tidev.io/contribute for more information. - -### Donations - -Please consider supporting this project by making a charitable [donation](https://tidev.io/donate). The money you donate goes to compensate the skilled engineeers and maintainers that keep this project going. - -### Code of Conduct - -TiDev wants to provide a safe and welcoming community for everyone to participate. Please see our [Code of Conduct](https://tidev.io/code-of-conduct) that applies to all contributors. - -## Security - -If you find a security related issue, please send an email to [security@tidev.io](mailto:security@tidev.io) instead of publicly creating a ticket. - -## Stay Connected - -For the latest information, please find us on Twitter: [Titanium SDK](https://twitter.com/titaniumsdk) and [TiDev](https://twitter.com/tidevio). - -Join our growing Slack community by visiting https://slack.tidev.io! +A suite of iOS development-related functions. ## Legal -Titanium is a registered trademark of TiDev Inc. All Titanium trademark and patent rights were transferred and assigned to TiDev Inc. on 4/7/2022. Please see the LEGAL information about using our trademarks, privacy policy, terms of usage and other legal information at https://tidev.io/legal. \ No newline at end of file +This project is open source under the [Apache Public License v2][1] and is developed by +[Axway, Inc](http://www.axway.com/) and the community. Please read the [`LICENSE`][1] file included +in this distribution for more information. + +[1]: https://github.com/appcelerator/ioslib/blob/master/LICENSE diff --git a/bin/ioslib b/bin/ioslib new file mode 100755 index 0000000..cf081bc --- /dev/null +++ b/bin/ioslib @@ -0,0 +1,316 @@ +#!/usr/bin/env node + +const CLI = require('cli-kit').CLI; +const ioslib = require('../dist/index'); +const pkgJson = require('../package.json'); +const { spawnSync } = require('child_process'); + +new CLI({ + banner: `${pkgJson.name}, version ${pkgJson.version}`, + commands: { + 'detect-device-pairs': { + action: detectDevicePairs, + args: [ + { + name: 'xcode-path', + desc: 'The path to Xcode to use' + } + ], + desc: 'Detects all valid iOS and watchOS simulator pairs' + }, + devices: { + async action() { + const devices = await ioslib.devices.list(); + console.log(JSON.stringify(devices, null, ' ')); + }, + desc: 'Lists connected devices' + }, + info: { + async action({ argv }) { + const info = {}; + const types = argv.types + ? Array.from(new Set(argv.types.split(','))).filter(Boolean) + : [ 'certs', 'keychains', 'provisioning', 'simulator', 'teams', 'xcode' ]; + for (const type of types) { + switch (type) { + case 'certs': info.certs = await ioslib.certs.getCerts(); break; + case 'keychains': info.keychains = await ioslib.keychains.getKeychains(); break; + case 'provisioning': info.provisioning = await ioslib.provisioning.getProvisioningProfiles(); break; + case 'simulator': + info.simulator = await ioslib.simulator.generateSimulatorRegistry({ + simulators: await ioslib.simulator.getSimulators(), + xcodes: info.xcode || (info.xcode = (await ioslib.xcode.getXcodes())) + }); + break; + case 'teams': info.teams = await ioslib.teams.getTeams(); break; + case 'xcode': info.xcode = info.xcode || (await ioslib.xcode.getXcodes()); break; + } + } + console.log(JSON.stringify(info, null, ' ')); + }, + aliases: '!detect', + args: [ + { + name: 'types', + desc: 'Comma-separated list of types to detect' + } + ], + desc: 'Detects installed Xcode and iOS information' + }, + 'reset-sims': { + action: resetSims, + args: [ + { + name: 'xcode-path', + desc: 'The path to Xcode to use' + } + ], + desc: 'Removes all simulators and recreates them' + }, + track: { + async action() { + const handle = ioslib.devices.trackDevices(); + handle.on('devices', devices => { + console.log(JSON.stringify(devices, null, ' ')); + console.log(); + }); + }, + aliases: [ '!trackdevices', '!track-devices' ], + desc: 'Listens for devices to be connected/disconnected' + } + }, + help: true, + name: pkgJson.name, + version: pkgJson.version +}).exec() + .catch(err => { + console.error(err.message); + process.exit(err.exitCode || 1); + }); + +function getSimCtl(xcodePath) { + const path = require('path'); + const { existsSync } = require('fs'); + let last; + + if (xcodePath) { + xcodePath = path.join(xcodePath, 'Contents'); + } else { + xcodePath = spawnSync('xcode-select', [ '-p' ]).stdout.toString(); + } + + while (last !== xcodePath) { + if (existsSync(path.join(xcodePath, 'version.plist'))) { + simctl = path.join(xcodePath, 'Developer', 'usr', 'bin', 'simctl'); + break; + } + last = xcodePath; + xcodePath = path.dirname(xcodePath); + } + + if (!simctl) { + throw new Error('Unable to locate simctl'); + } + + return simctl; +} + +function detectDevicePairs({ argv }) { + const startTime = Date.now(); + const simctl = getSimCtl(argv.xcodePath); + const testSimName = "ioslib_test_sim"; + + const getInfo = () => { + return JSON.parse(spawnSync(simctl, [ 'list', '--json' ]).stdout.toString()); + }; + + const createSim = (name, deviceTypeId, runtimeId) => { + console.log(`Creating ${name} (${deviceTypeId} - ${runtimeId})`); + const child = spawnSync(simctl, [ 'create', name, deviceTypeId, runtimeId ]); + return child.status === 0 ? child.stdout.toString().trim() : null; + }; + + const deleteSim = udid => { + console.log(`Deleting ${udid}`); + return spawnSync(simctl, [ 'delete', udid ]).status === 0; + }; + + const pair = (watchUdid, phoneUdid) => { + process.stdout.write(`Pairing ${watchUdid} -> ${phoneUdid}... `); + const child = spawnSync(simctl, [ 'pair', watchUdid, phoneUdid ]); + if (child.status === 0) { + process.stdout.write('success\n'); + return child.stdout.toString().trim(); + } + process.stdout.write('failed\n'); + return null; + }; + + const unpair = (pairUdid) => { + console.log(`Unpairing ${pairUdid}`); + return spawnSync(simctl, [ 'unpair', pairUdid ]).status === 0; + }; + + const cleanup = info => { + let deleteCount = 0; + for (const ver of Object.keys(info.devices)) { + for (const device of info.devices[ver]) { + if (device.name.startsWith(testSimName) && deleteSim(device.udid)) { + deleteCount++; + } + } + } + deleteCount && console.log(); + }; + + const info = getInfo(); + cleanup(info); + + const iPhoneDeviceTypeRegExp = /\.iPhone-.+$/; + const iosSimRuntimeRegExp = /\.iOS-.+$/; + const watchDeviceTypeRegExp = /Apple-Watch.+42mm/; + const watchSimRuntimeRegExp = /\.watchOS-.+$/; + + const iphoneDeviceTypes = info.devicetypes.filter(s => iPhoneDeviceTypeRegExp.test(s.identifier)); + const iosRuntimes = info.runtimes.filter(r => iosSimRuntimeRegExp.test(r.identifier)); + const watchDeviceTypes = info.devicetypes.filter(s => watchDeviceTypeRegExp.test(s.identifier)); + const watchRuntimes = info.runtimes.filter(r => watchSimRuntimeRegExp.test(r.identifier)); + + const watchDevices = []; + let results = {}; + + const stats = { + iPhoneSimsCreated: 0, + watchSimsCreated: 0, + pairings: 0, + pairSuccess: 0 + }; + + // create the watch sims + for (const deviceType of watchDeviceTypes) { + for (const runtime of watchRuntimes) { + const udid = createSim(`${testSimName}_${stats.watchSimsCreated++}`, deviceType.identifier, runtime.identifier); + if (udid) { + console.log(`Created watch sim ${deviceType.name} + ${runtime.name} (${udid})`); + watchDevices.push({ + udid, + deviceType, + runtime + }); + } + } + } + + watchDevices.length && console.log(); + + for (const iPhoneDeviceType of iphoneDeviceTypes) { + for (const iosRuntime of iosRuntimes) { + stats.iPhoneSimsCreated++; + const udid = createSim(testSimName, iPhoneDeviceType.identifier, iosRuntime.identifier); + + if (udid) { + for (const watch of watchDevices) { + stats.pairings++; + const pairUdid = pair(watch.udid, udid); + + if (pairUdid) { + stats.pairSuccess++; + unpair(pairUdid); + + // console.log({ + // iPhoneDeviceType, + // iosRuntime, + // watchDeviceType: watch.deviceType, + // watchRuntime: watch.runtime + // }); + + if (!results[iosRuntime.version]) { + results[iosRuntime.version] = []; + } + if (!results[iosRuntime.version].includes(watch.runtime.version)) { + results[iosRuntime.version].push(watch.runtime.version); + } + } + } + + deleteSim(udid); + } + } + } + + console.log(); + cleanup(getInfo()); + + // sort the results + results = (function (src) { + const dest = {}; + for (const key of Object.keys(src).sort()) { + dest[key] = src[key].sort(); + } + return dest; + })(results); + + const delta = Date.now() - startTime; + const minutes = Math.floor(delta / 60000); + const seconds = (delta % 60000) / 1000; + console.log(`Completed in ${minutes}m ${seconds}s\n`); + console.log(`iPhone Sims Created: ${stats.iPhoneSimsCreated}`); + console.log(`Watch Sims Created: ${stats.watchSimsCreated}`); + console.log(`Pairings: ${stats.pairings}`); + console.log(`Successful Pairings: ${stats.pairSuccess}`); + console.log(); + console.log(results); +} + +function resetSims({ argv }) { + const startTime = Date.now(); + const simctl = getSimCtl(argv.xcodePath); + const json = JSON.parse(spawnSync(simctl, [ 'list', '--json' ]).stdout.toString()); + const stats = { + simsRemoved: 0, + iPhoneSimsCreated: 0, + tvSimsCreated: 0, + watchSimsCreated: 0 + }; + const runtimeRegExp = /(iOS|tvOS|watchOS)/; + + for (const runtime of Object.keys(json.devices)) { + for (const device of json.devices[runtime]) { + console.log(`Removing ${device.name} (${device.udid})`); + spawnSync(simctl, [ 'delete', device.udid ]); + stats.simsRemoved++; + } + } + console.log(); + + for (const deviceType of json.devicetypes) { + for (const runtime of json.runtimes) { + if (runtime.isAvailable || runtime.availability === '(available)') { + process.stdout.write(`Creating ${deviceType.name} with ${runtime.name}... `); + try { + spawnSync(simctl, [ 'create', `${deviceType.name} ${runtime.name}`, deviceType.identifier, runtime.identifier ]); + console.log('SUCCESS!'); + + const m = runtime.identifier.match(runtimeRegExp); + switch (m && m[0]) { + case 'iOS': stats.iPhoneSimsCreated++; break; + case 'tvOS': stats.tvSimsCreated++; break; + case 'watchOS': stats.watchSimsCreated++; break; + } + } catch (e) { + console.log(`FAILED! ${e.toString()}`); + } + } + } + } + console.log(); + + const delta = Date.now() - startTime; + const minutes = Math.floor(delta / 60000); + const seconds = (delta % 60000) / 1000; + console.log(`Completed in ${minutes}m ${seconds}s\n`); + console.log(`Sims Removed: ${stats.simsRemoved}`); + console.log(`iPhone Sims Created: ${stats.iPhoneSimsCreated}`); + console.log(`TV Sims Created: ${stats.tvSimsCreated}`); + console.log(`Watch Sims Created: ${stats.watchSimsCreated}`); +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..797c461 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,8 @@ +'use strict'; + +require('appcd-gulp')({ + exports, + pkgJson: require('./package.json'), + template: 'standard', + babel: 'node10' +}); diff --git a/index.js b/index.js deleted file mode 100644 index c66b04c..0000000 --- a/index.js +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Main namespace for the ioslib. - * - * @copyright - * Copyright (c) 2014-2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - async = require('async'), - - certs = exports.certs = require('./lib/certs'), - device = exports.device = require('./lib/device'), - env = exports.env = require('./lib/env'), - magik = exports.magik = require('./lib/utilities').magik, - provisioning = exports.provisioning = require('./lib/provisioning'), - simulator = exports.simulator = require('./lib/simulator'), - teams = exports.teams = require('./lib/teams'), - utilities = exports.utilities = require('./lib/utilities'), - xcode = exports.xcode = require('./lib/xcode'); - -var cache; - -exports.detect = detect; -exports.findValidDeviceCertProfileCombos = findValidDeviceCertProfileCombos; - -/** - * Detects the entire iOS environment information. - * - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects the all iOS information. - * @param {String} [options.minIosVersion] - The minimum iOS SDK to detect. - * @param {String} [options.minWatchosVersion] - The minimum WatchOS SDK to detect. - * @param {String} [options.profileDir=~/Library/Developer/Xcode/UserData/Provisioning Profiles] - The path to search for provisioning profiles. - * @param {String} [options.security] - Path to the security executable - * @param {String} [options.supportedVersions] - A string with a version number or range to check if an Xcode install is supported. - * @param {String} [options.type] - The type of emulators to return. Can be either "iphone" or "ipad". Defaults to all types. - * @param {Boolean} [options.validOnly=true] - When true, only returns non-expired, valid certificates. - * @param {String} [options.xcodeSelect] - Path to the xcode-select executable - * @param {Function} [callback(err, info)] - A function to call when all detection tasks have completed. - */ -function detect(options, callback) { - return magik(options, callback, function (emitter, options, callback) { - if (cache && !options.bypassCache) { - emitter.emit('detected', cache); - return callback(null, cache); - } - - var results = { - detectVersion: '5.0', - issues: [] - }; - - function mix(src, dest) { - Object.keys(src).forEach(function (name) { - if (Array.isArray(src[name])) { - if (Array.isArray(dest[name])) { - dest[name] = dest[name].concat(src[name]); - } else { - dest[name] = src[name]; - } - } else if (src[name] !== null && typeof src[name] === 'object') { - dest[name] || (dest[name] = {}); - Object.keys(src[name]).forEach(function (key) { - dest[name][key] = src[name][key]; - }); - } else { - dest[name] = src[name]; - } - }); - } - - async.parallel([ - function detectCertificates(done) { - certs.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - }, - function detectDevices(done) { - device.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - }, - function detectEnvironment(done) { - env.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - }, - function detectProvisioning(done) { - provisioning.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - }, - function detectSimulator(done) { - simulator.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - }, - function detectTeams(done) { - teams.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - }, - function detectXcode(done) { - xcode.detect(options, function (err, result) { - err || mix(result, results); - done(err); - }); - } - ], function (err) { - if (err) { - emitter.emit('error', err); - return callback(err); - } else { - cache = results; - emitter.emit('detected', results); - return callback(null, results); - } - }); - }); -}; - -/** - * Finds all valid device/cert/provisioning profile combinations. This is handy for quickly - * finding valid parameters for building an app for an iOS device. - * - * @param {Object} [options] - An object containing various settings. - * @param {String} [options.appId] - The app identifier (com.domain.app) to filter provisioning profiles by. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects the all iOS information. - * @param {Boolean} [options.unmanagedProvisioningProfile] - When true, selects an unmanaged provisioning profile. - * @param {Function} [callback(err, info)] - A function to call when the simulator has launched. - */ -function findValidDeviceCertProfileCombos(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } else if (!options) { - options = {}; - } - typeof callback === 'function' || (callback = function () {}); - - // find us a device - device.detect(function (err, deviceResults) { - if (!deviceResults.devices.length) { - // no devices connected - return callback(new Error('No iOS devices connected')); - } - - // next find us some certs - certs.detect(function (err, certResults) { - var certs = []; - Object.keys(certResults.certs.keychains).forEach(function (keychain) { - var types = certResults.certs.keychains[keychain]; - Object.keys(types).forEach(function (type) { - certs = certs.concat(types[type]); - }); - }); - - if (!certs.length) { - return callback(new Error('No iOS certificates')); - } - - // find us a provisioning profile - provisioning.find({ - appId: options.appId, - certs: certs, - devicesUDIDs: deviceResults.devices.map(function (device) { return device.udid; }), - unmanaged: options.unmanagedProvisioningProfile - }, function (err, profiles) { - if (!profiles.length) { - return callback(new Error('No provisioning profiles found')); - - } - - var combos = []; - profiles.forEach(function (profile) { - deviceResults.devices.forEach(function (device) { - if (profile.devices && profile.devices.indexOf(device.udid) !== -1) { - certs.forEach(function (cert) { - var prefix = cert.pem.replace(/^-----BEGIN CERTIFICATE-----\n/, '').substring(0, 60); - profile.certs.forEach(function (pcert) { - if (pcert.indexOf(prefix) === 0) { - combos.push({ - ppUUID: profile.uuid, - certName: cert.name, - deviceUDID: device.udid - }); - } - }); - }); - } - }); - }); - - callback(null, combos); - }); - }); - }); -} diff --git a/lib/certs.js b/lib/certs.js deleted file mode 100644 index 6c0f514..0000000 --- a/lib/certs.js +++ /dev/null @@ -1,1456 +0,0 @@ -/** - * Detects iOS developer and distribution certificates and the WWDC certificate. - * - * @module certs - * - * @copyright - * Copyright (c) 2014-2016 by Appcelerator, Inc. All Rights Reserved. - * - * Copyright (c) 2010-2014 Digital Bazaar, Inc. - * {@link https://github.com/digitalbazaar/forge} - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - appc = require('node-appc'), - async = require('async'), - env = require('./env'), - magik = require('./utilities').magik, - __ = appc.i18n(__dirname).__; - -const certRegExp = /^(?:((?:Apple|iOS) Development)|((?:iOS|Apple|iPhone) Distribution)): (.+)$/; - -var cache = null, - watchers = {}, - watchResults = null, - watchInterval = 60000, - watchTimer = null; - -exports.detect = detect; -exports.watch = watch; -exports.unwatch = unwatch; - -/** - * Detects installed certificates. - * - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects all certificates. - * @param {Boolean} [options.validOnly=true] - When true, only returns non-expired, valid certificates. - * @param {Function} [callback(err, results)] - A function to call with the certificate information. - * - * @emits module:certs#detected - * @emits module:certs#error - * - * @returns {Handle} - */ -function detect(options, callback) { - return magik(options, callback, function (emitter, options, callback) { - var validOnly = options.validOnly === undefined || options.validOnly === true; - - if (cache && !options.bypassCache) { - emitter.emit('detected', cache); - return callback(null, cache); - } - - function getCerts(cb) { - // detect the development environment - env.detect(options, function (err, env) { - var results = { - certs: { - keychains: {}, - wwdr: false - }, - issues: [] - }; - - // if we don't have the security executable, we cannot detect certs - if (!env.executables.security) { - return cb(null, results); - } - - appc.subprocess.run(env.executables.security, 'list-keychains', function (code, out, err) { - if (code) { - return cb(results); - } - - function parseCerts(src, dest, prefix) { - var p = 0, - q = src.indexOf('-----END'), - pem, cert, validity, expired, invalid, commonName; - - while (p !== -1 && q !== -1) { - pem = src.substring(p, q + 25); - cert = pem2cert(pem); - expired = cert.validity.notAfter < now, - invalid = expired || cert.validity.notBefore > now; - commonName = cert.subject.getField('CN').value; - let certName; - - if (!prefix) { - const fullname = appc.encoding.decodeOctalUTF8(commonName); - if (fullname === 'Apple Worldwide Developer Relations Certification Authority') { - certName = commonName; - } else { - const match = fullname.match(certRegExp); - if (match) { - certName = match[3] - } - } - } else { - certName = appc.encoding.decodeOctalUTF8(commonName.substring(prefix.length)).trim(); - } - - if (!validOnly || !invalid) { - const teamId = cert.subject.attributes.find(attr => attr.name === 'organizationalUnitName'); - dest.push({ - name: certName, - fullname: appc.encoding.decodeOctalUTF8(commonName).trim(), - pem: pem, - before: cert.validity.notBefore, - after: cert.validity.notAfter, - expired: expired, - invalid: invalid, - teamId: teamId && teamId.value - }); - } - - p = src.indexOf('-----BEGIN', q + 25); - q = src.indexOf('-----END', p); - } - } - - var now = new Date, - tasks = []; - - // parse out the keychains and add tasks to find certs for each keychain - out.split('\n').forEach(function (line) { - var m = line.match(/[^"]*"([^"]*)"/); - if (!m) return; - - var keychain = m[1].trim(), - dest = results.certs.keychains[keychain] = { - developer: [], - distribution: [] - }; - - // find all the developer certificates in this keychain - tasks.push(function (next) { - appc.subprocess.run(env.executables.security, ['find-certificate', '-c', 'iPhone Developer:', '-a', '-p', keychain], function (code, out, err) { - if (!code) { - parseCerts(out, dest.developer, 'iPhone Developer:'); - } - next(); - }); - }); - - // find all the developer certificates in this keychain - tasks.push(function (next) { - appc.subprocess.run(env.executables.security, ['find-certificate', '-c', 'Development:', '-a', '-p', keychain], function (code, out, err) { - if (!code) { - parseCerts(out, dest.developer); - } - next(); - }); - }); - - // find all the distribution certificates in this keychain - tasks.push(function (next) { - appc.subprocess.run(env.executables.security, ['find-certificate', '-c', 'Distribution:', '-a', '-p', keychain], function (code, out, err) { - if (!code) { - parseCerts(out, dest.distribution); - } - next(); - }); - }); - - // find all the wwdr certificates in this keychain - tasks.push(function (next) { - // if we already found it, then skip the remaining keychains - if (results.certs.wwdr) return next(); - - appc.subprocess.run(env.executables.security, ['find-certificate', '-c', 'Apple Worldwide Developer Relations Certification Authority', '-a', '-p', keychain], function (code, out, err) { - if (!code) { - var tmp = []; - parseCerts(out, tmp); - results.certs.wwdr = results.certs.wwdr || (tmp.length && tmp[0].invalid === false); - } - next(); - }); - }); - }); - - // process all cert tasks - async.parallel(tasks, function () { - cb(results); - }); - }); - }); - } - - // get all keychains and certs - getCerts(function (results) { - detectIssues(results); - cache = results; - emitter.emit('detected', results); - callback(null, results); - }); - }); -}; - -function detectIssues(dest) { - dest.issues = []; - - if (!dest.certs.wwdr) { - dest.issues.push({ - id: 'IOS_NO_WWDR_CERT_FOUND', - type: 'error', - message: __('Apple’s World Wide Developer Relations (WWDR) intermediate certificate is not installed.') + '\n' + - __('This will prevent you from building apps for iOS devices or package for distribution.') - }); - } - - if (!Object.keys(dest.certs.keychains).length) { - // I don't think this is even possible - dest.issues.push({ - id: 'IOS_NO_KEYCHAINS_FOUND', - type: 'warning', - message: __('Unable to find any keychains found.') - }); - } - - var validDevCerts = 0, - validDistCerts = 0; - - Object.keys(dest.certs.keychains).forEach(function (keychain) { - validDevCerts += (dest.certs.keychains[keychain].developer || []).filter(function (c) { - return !c.invalid; - }).length; - - validDistCerts += (dest.certs.keychains[keychain].distribution || []).filter(function (c) { - return !c.invalid; - }).length; - }); - - if (!validDevCerts) { - dest.issues.push({ - id: 'IOS_NO_VALID_DEV_CERTS_FOUND', - type: 'warning', - message: __('Unable to find any valid iOS developer certificates.') + '\n' + - __('This will prevent you from building apps for iOS devices.') - }); - } - - if (!validDistCerts) { - dest.issues.push({ - id: 'IOS_NO_VALID_DIST_CERTS_FOUND', - type: 'warning', - message: __('Unable to find any valid iOS production distribution certificates.') + '\n' + - __('This will prevent you from packaging apps for distribution.') - }); - } -} - -/** - * Watches for new and changed certificates. - * - * @param {Object} [options] - An object containing various settings - * @param {Boolean} [options.watchInterval=60000] - The number of milliseconds to wait before checking for cert updates - * @param {Function} [callback(err, results)] - A function to call with the certificate information - * - * @returns {Function} A function that unwatches changes. - */ -function watch(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } else if (!options) { - options = {}; - } - - watchers[callback] = (watchers[callback] || 0) + 1; - watchInterval = ~~options.watchInterval || 60000; - - // check if already watching or already watching - if (watchers[callback] === 1 && !watchTimer) { - options.bypassCache = true; - - function check() { - detect(options, function (err, results) { - if (!err && (!watchResults || JSON.stringify(watchResults) !== JSON.stringify(results))) { - watchResults = results; - return callback(null, results); - } - watchTimer = setTimeout(check, watchInterval); - }); - } - - watchTimer = setTimeout(check, watchInterval); - } - - return function () { - unwatch(callback); - }; -}; - -/** - * Stops watching for certificate changes. - */ -function unwatch(callback) { - if (!watchers[callback]) return; - - if (--watchers[callback] <= 0) { - delete watchers[callback]; - } - - if (!Object.keys(watchers).length) { - clearTimeout(watchTimer); - watchTimer = null; - } -}; - -/* - * Everything from this point onward is from the forge project (aka node-forge). - * https://github.com/digitalbazaar/forge - * - * New BSD License (3-clause) - * Copyright (c) 2010, Digital Bazaar, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Digital Bazaar, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL DIGITAL BAZAAR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -var typeRegExp = /^(?:X509 |TRUSTED )?CERTIFICATE$/, - rMessage = /\s*-----BEGIN ([A-Z0-9- ]+)-----\r?\n?([\x21-\x7e\s]+?(?:\r?\n\r?\n))?([:A-Za-z0-9+\/=\s]+?)-----END \1-----/g, - rHeader = /([\x21-\x7e]+):\s*([\x21-\x7e\s^:]+)/, - rCRLF = /\r?\n/, - whitespaceRegExp = /\s/, - leadingSpaceRegExp = /^\s+/, - asn1Class = { - UNIVERSAL: 0x00, - APPLICATION: 0x40, - CONTEXT_SPECIFIC: 0x80, - PRIVATE: 0xC0 - }, - asn1Type = { - NONE: 0, - BOOLEAN: 1, - INTEGER: 2, - BITSTRING: 3, - OCTETSTRING: 4, - NULL: 5, - OID: 6, - ODESC: 7, - EXTERNAL: 8, - REAL: 9, - ENUMERATED: 10, - EMBEDDED: 11, - UTF8: 12, - ROID: 13, - SEQUENCE: 16, - SET: 17, - PRINTABLESTRING: 19, - IA5STRING: 22, - UTCTIME: 23, - GENERALIZEDTIME: 24, - BMPSTRING: 30 - }, - x509CertificateValidator = { - name: 'Certificate', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - value: [ { - name: 'Certificate.TBSCertificate', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - captureAsn1: 'tbsCertificate', - value: [ { - name: 'Certificate.TBSCertificate.version', - tagClass: asn1Class.CONTEXT_SPECIFIC, - type: 0, - constructed: true, - optional: true, - value: [ { - name: 'Certificate.TBSCertificate.version.integer', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.INTEGER, - constructed: false, - capture: 'certVersion' - } ] - }, { - name: 'Certificate.TBSCertificate.serialNumber', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.INTEGER, - constructed: false, - capture: 'certSerialNumber' - }, { - name: 'Certificate.TBSCertificate.signature', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - value: [ { - name: 'Certificate.TBSCertificate.signature.algorithm', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.OID, - constructed: false, - capture: 'certinfoSignatureOid' - }, { - name: 'Certificate.TBSCertificate.signature.parameters', - tagClass: asn1Class.UNIVERSAL, - optional: true, - captureAsn1: 'certinfoSignatureParams' - } ] - }, { - name: 'Certificate.TBSCertificate.issuer', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - captureAsn1: 'certIssuer' - }, { - name: 'Certificate.TBSCertificate.validity', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - // Note: UTC and generalized times may both appear so the capture - // names are based on their detected order, the names used below - // are only for the common case, which validity time really means - // "notBefore" and which means "notAfter" will be determined by order - value: [ { - // notBefore (Time) (UTC time case) - name: 'Certificate.TBSCertificate.validity.notBefore (utc)', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.UTCTIME, - constructed: false, - optional: true, - capture: 'certValidity1UTCTime' - }, { - // notBefore (Time) (generalized time case) - name: 'Certificate.TBSCertificate.validity.notBefore (generalized)', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.GENERALIZEDTIME, - constructed: false, - optional: true, - capture: 'certValidity2GeneralizedTime' - }, { - // notAfter (Time) (only UTC time is supported) - name: 'Certificate.TBSCertificate.validity.notAfter (utc)', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.UTCTIME, - constructed: false, - optional: true, - capture: 'certValidity3UTCTime' - }, { - // notAfter (Time) (only UTC time is supported) - name: 'Certificate.TBSCertificate.validity.notAfter (generalized)', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.GENERALIZEDTIME, - constructed: false, - optional: true, - capture: 'certValidity4GeneralizedTime' - } ] - }, { - // Name (subject) (RDNSequence) - name: 'Certificate.TBSCertificate.subject', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - captureAsn1: 'certSubject' - }, { - name: 'SubjectPublicKeyInfo', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - captureAsn1: 'subjectPublicKeyInfo', - value: [ { - name: 'SubjectPublicKeyInfo.AlgorithmIdentifier', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - value: [ { - name: 'AlgorithmIdentifier.algorithm', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.OID, - constructed: false, - capture: 'publicKeyOid' - } ] - }, { - // subjectPublicKey - name: 'SubjectPublicKeyInfo.subjectPublicKey', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.BITSTRING, - constructed: false, - value: [ { - // RSAPublicKey - name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - optional: true, - captureAsn1: 'rsaPublicKey' - } ] - } ] - }, { - // issuerUniqueID (optional) - name: 'Certificate.TBSCertificate.issuerUniqueID', - tagClass: asn1Class.CONTEXT_SPECIFIC, - type: 1, - constructed: true, - optional: true, - value: [ { - name: 'Certificate.TBSCertificate.issuerUniqueID.id', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.BITSTRING, - constructed: false, - capture: 'certIssuerUniqueId' - } ] - }, { - // subjectUniqueID (optional) - name: 'Certificate.TBSCertificate.subjectUniqueID', - tagClass: asn1Class.CONTEXT_SPECIFIC, - type: 2, - constructed: true, - optional: true, - value: [ { - name: 'Certificate.TBSCertificate.subjectUniqueID.id', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.BITSTRING, - constructed: false, - capture: 'certSubjectUniqueId' - } ] - }, { - // Extensions (optional) - name: 'Certificate.TBSCertificate.extensions', - tagClass: asn1Class.CONTEXT_SPECIFIC, - type: 3, - constructed: true, - captureAsn1: 'certExtensions', - optional: true - } ] - }, { - // AlgorithmIdentifier (signature algorithm) - name: 'Certificate.signatureAlgorithm', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.SEQUENCE, - constructed: true, - value: [ { - // algorithm - name: 'Certificate.signatureAlgorithm.algorithm', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.OID, - constructed: false, - capture: 'certSignatureOid' - }, { - name: 'Certificate.TBSCertificate.signature.parameters', - tagClass: asn1Class.UNIVERSAL, - optional: true, - captureAsn1: 'certSignatureParams' - } ] - }, { - // SignatureValue - name: 'Certificate.signatureValue', - tagClass: asn1Class.UNIVERSAL, - type: asn1Type.BITSTRING, - constructed: false, - capture: 'certSignature' - } ] - }, - oids = { - // algorithm OIDs - '1.2.840.113549.1.1.1': 'rsaEncryption', - 'rsaEncryption': '1.2.840.113549.1.1.1', - // Note: md2 & md4 not implemented - //'1.2.840.113549.1.1.2': 'md2WithRSAEncryption', - //'md2WithRSAEncryption': '1.2.840.113549.1.1.2', - //'1.2.840.113549.1.1.3': 'md4WithRSAEncryption', - //'md4WithRSAEncryption': '1.2.840.113549.1.1.3', - '1.2.840.113549.1.1.4': 'md5WithRSAEncryption', - 'md5WithRSAEncryption': '1.2.840.113549.1.1.4', - '1.2.840.113549.1.1.5': 'sha1WithRSAEncryption', - 'sha1WithRSAEncryption': '1.2.840.113549.1.1.5', - '1.2.840.113549.1.1.7': 'RSAES-OAEP', - 'RSAES-OAEP': '1.2.840.113549.1.1.7', - '1.2.840.113549.1.1.8': 'mgf1', - 'mgf1': '1.2.840.113549.1.1.8', - '1.2.840.113549.1.1.9': 'pSpecified', - 'pSpecified': '1.2.840.113549.1.1.9', - '1.2.840.113549.1.1.10': 'RSASSA-PSS', - 'RSASSA-PSS': '1.2.840.113549.1.1.10', - '1.2.840.113549.1.1.11': 'sha256WithRSAEncryption', - 'sha256WithRSAEncryption': '1.2.840.113549.1.1.11', - '1.2.840.113549.1.1.12': 'sha384WithRSAEncryption', - 'sha384WithRSAEncryption': '1.2.840.113549.1.1.12', - '1.2.840.113549.1.1.13': 'sha512WithRSAEncryption', - 'sha512WithRSAEncryption': '1.2.840.113549.1.1.13', - - '1.3.14.3.2.7': 'desCBC', - 'desCBC': '1.3.14.3.2.7', - - '1.3.14.3.2.26': 'sha1', - 'sha1': '1.3.14.3.2.26', - '2.16.840.1.101.3.4.2.1': 'sha256', - 'sha256': '2.16.840.1.101.3.4.2.1', - '2.16.840.1.101.3.4.2.2': 'sha384', - 'sha384': '2.16.840.1.101.3.4.2.2', - '2.16.840.1.101.3.4.2.3': 'sha512', - 'sha512': '2.16.840.1.101.3.4.2.3', - '1.2.840.113549.2.5': 'md5', - 'md5': '1.2.840.113549.2.5', - - // pkcs#7 content types - '1.2.840.113549.1.7.1': 'data', - 'data': '1.2.840.113549.1.7.1', - '1.2.840.113549.1.7.2': 'signedData', - 'signedData': '1.2.840.113549.1.7.2', - '1.2.840.113549.1.7.3': 'envelopedData', - 'envelopedData': '1.2.840.113549.1.7.3', - '1.2.840.113549.1.7.4': 'signedAndEnvelopedData', - 'signedAndEnvelopedData': '1.2.840.113549.1.7.4', - '1.2.840.113549.1.7.5': 'digestedData', - 'digestedData': '1.2.840.113549.1.7.5', - '1.2.840.113549.1.7.6': 'encryptedData', - 'encryptedData': '1.2.840.113549.1.7.6', - - // pkcs#9 oids - '1.2.840.113549.1.9.1': 'emailAddress', - 'emailAddress': '1.2.840.113549.1.9.1', - '1.2.840.113549.1.9.2': 'unstructuredName', - 'unstructuredName': '1.2.840.113549.1.9.2', - '1.2.840.113549.1.9.3': 'contentType', - 'contentType': '1.2.840.113549.1.9.3', - '1.2.840.113549.1.9.4': 'messageDigest', - 'messageDigest': '1.2.840.113549.1.9.4', - '1.2.840.113549.1.9.5': 'signingTime', - 'signingTime': '1.2.840.113549.1.9.5', - '1.2.840.113549.1.9.6': 'counterSignature', - 'counterSignature': '1.2.840.113549.1.9.6', - '1.2.840.113549.1.9.7': 'challengePassword', - 'challengePassword': '1.2.840.113549.1.9.7', - '1.2.840.113549.1.9.8': 'unstructuredAddress', - 'unstructuredAddress': '1.2.840.113549.1.9.8', - - '1.2.840.113549.1.9.20': 'friendlyName', - 'friendlyName': '1.2.840.113549.1.9.20', - '1.2.840.113549.1.9.21': 'localKeyId', - 'localKeyId': '1.2.840.113549.1.9.21', - '1.2.840.113549.1.9.22.1': 'x509Certificate', - 'x509Certificate': '1.2.840.113549.1.9.22.1', - - // pkcs#12 safe bags - '1.2.840.113549.1.12.10.1.1': 'keyBag', - 'keyBag': '1.2.840.113549.1.12.10.1.1', - '1.2.840.113549.1.12.10.1.2': 'pkcs8ShroudedKeyBag', - 'pkcs8ShroudedKeyBag': '1.2.840.113549.1.12.10.1.2', - '1.2.840.113549.1.12.10.1.3': 'certBag', - 'certBag': '1.2.840.113549.1.12.10.1.3', - '1.2.840.113549.1.12.10.1.4': 'crlBag', - 'crlBag': '1.2.840.113549.1.12.10.1.4', - '1.2.840.113549.1.12.10.1.5': 'secretBag', - 'secretBag': '1.2.840.113549.1.12.10.1.5', - '1.2.840.113549.1.12.10.1.6': 'safeContentsBag', - 'safeContentsBag': '1.2.840.113549.1.12.10.1.6', - - // password-based-encryption for pkcs#12 - '1.2.840.113549.1.5.13': 'pkcs5PBES2', - 'pkcs5PBES2': '1.2.840.113549.1.5.13', - '1.2.840.113549.1.5.12': 'pkcs5PBKDF2', - 'pkcs5PBKDF2': '1.2.840.113549.1.5.12', - - '1.2.840.113549.1.12.1.1': 'pbeWithSHAAnd128BitRC4', - 'pbeWithSHAAnd128BitRC4': '1.2.840.113549.1.12.1.1', - '1.2.840.113549.1.12.1.2': 'pbeWithSHAAnd40BitRC4', - 'pbeWithSHAAnd40BitRC4': '1.2.840.113549.1.12.1.2', - '1.2.840.113549.1.12.1.3': 'pbeWithSHAAnd3-KeyTripleDES-CBC', - 'pbeWithSHAAnd3-KeyTripleDES-CBC': '1.2.840.113549.1.12.1.3', - '1.2.840.113549.1.12.1.4': 'pbeWithSHAAnd2-KeyTripleDES-CBC', - 'pbeWithSHAAnd2-KeyTripleDES-CBC': '1.2.840.113549.1.12.1.4', - '1.2.840.113549.1.12.1.5': 'pbeWithSHAAnd128BitRC2-CBC', - 'pbeWithSHAAnd128BitRC2-CBC': '1.2.840.113549.1.12.1.5', - '1.2.840.113549.1.12.1.6': 'pbewithSHAAnd40BitRC2-CBC', - 'pbewithSHAAnd40BitRC2-CBC': '1.2.840.113549.1.12.1.6', - - // symmetric key algorithm oids - '1.2.840.113549.3.7': 'des-EDE3-CBC', - 'des-EDE3-CBC': '1.2.840.113549.3.7', - '2.16.840.1.101.3.4.1.2': 'aes128-CBC', - 'aes128-CBC': '2.16.840.1.101.3.4.1.2', - '2.16.840.1.101.3.4.1.22': 'aes192-CBC', - 'aes192-CBC': '2.16.840.1.101.3.4.1.22', - '2.16.840.1.101.3.4.1.42': 'aes256-CBC', - 'aes256-CBC': '2.16.840.1.101.3.4.1.42', - - // certificate issuer/subject OIDs - '2.5.4.3': 'commonName', - 'commonName': '2.5.4.3', - '2.5.4.5': 'serialName', - 'serialName': '2.5.4.5', - '2.5.4.6': 'countryName', - 'countryName': '2.5.4.6', - '2.5.4.7': 'localityName', - 'localityName': '2.5.4.7', - '2.5.4.8': 'stateOrProvinceName', - 'stateOrProvinceName': '2.5.4.8', - '2.5.4.10': 'organizationName', - 'organizationName': '2.5.4.10', - '2.5.4.11': 'organizationalUnitName', - 'organizationalUnitName': '2.5.4.11', - - // X.509 extension OIDs - '2.16.840.1.113730.1.1': 'nsCertType', - 'nsCertType': '2.16.840.1.113730.1.1', - '2.5.29.1': 'authorityKeyIdentifier', // deprecated, use .35 - '2.5.29.2': 'keyAttributes', // obsolete use .37 or .15 - '2.5.29.3': 'certificatePolicies', // deprecated, use .32 - '2.5.29.4': 'keyUsageRestriction', // obsolete use .37 or .15 - '2.5.29.5': 'policyMapping', // deprecated use .33 - '2.5.29.6': 'subtreesConstraint', // obsolete use .30 - '2.5.29.7': 'subjectAltName', // deprecated use .17 - '2.5.29.8': 'issuerAltName', // deprecated use .18 - '2.5.29.9': 'subjectDirectoryAttributes', - '2.5.29.10': 'basicConstraints', // deprecated use .19 - '2.5.29.11': 'nameConstraints', // deprecated use .30 - '2.5.29.12': 'policyConstraints', // deprecated use .36 - '2.5.29.13': 'basicConstraints', // deprecated use .19 - '2.5.29.14': 'subjectKeyIdentifier', - 'subjectKeyIdentifier': '2.5.29.14', - '2.5.29.15': 'keyUsage', - 'keyUsage': '2.5.29.15', - '2.5.29.16': 'privateKeyUsagePeriod', - '2.5.29.17': 'subjectAltName', - 'subjectAltName': '2.5.29.17', - '2.5.29.18': 'issuerAltName', - 'issuerAltName': '2.5.29.18', - '2.5.29.19': 'basicConstraints', - 'basicConstraints': '2.5.29.19', - '2.5.29.20': 'cRLNumber', - '2.5.29.21': 'cRLReason', - '2.5.29.22': 'expirationDate', - '2.5.29.23': 'instructionCode', - '2.5.29.24': 'invalidityDate', - '2.5.29.25': 'cRLDistributionPoints', // deprecated use .31 - '2.5.29.26': 'issuingDistributionPoint', // deprecated use .28 - '2.5.29.27': 'deltaCRLIndicator', - '2.5.29.28': 'issuingDistributionPoint', - '2.5.29.29': 'certificateIssuer', - '2.5.29.30': 'nameConstraints', - '2.5.29.31': 'cRLDistributionPoints', - '2.5.29.32': 'certificatePolicies', - '2.5.29.33': 'policyMappings', - '2.5.29.34': 'policyConstraints', // deprecated use .36 - '2.5.29.35': 'authorityKeyIdentifier', - '2.5.29.36': 'policyConstraints', - '2.5.29.37': 'extKeyUsage', - 'extKeyUsage': '2.5.29.37', - '2.5.29.46': 'freshestCRL', - '2.5.29.54': 'inhibitAnyPolicy', - - // extKeyUsage purposes - '1.3.6.1.5.5.7.3.1': 'serverAuth', - 'serverAuth': '1.3.6.1.5.5.7.3.1', - '1.3.6.1.5.5.7.3.2': 'clientAuth', - 'clientAuth': '1.3.6.1.5.5.7.3.2', - '1.3.6.1.5.5.7.3.3': 'codeSigning', - 'codeSigning': '1.3.6.1.5.5.7.3.3', - '1.3.6.1.5.5.7.3.4': 'emailProtection', - 'emailProtection': '1.3.6.1.5.5.7.3.4', - '1.3.6.1.5.5.7.3.8': 'timeStamping', - 'timeStamping': '1.3.6.1.5.5.7.3.8' - }, - shortNames = { - 'CN': oids['commonName'], - 'commonName': 'CN', - 'C': oids['countryName'], - 'countryName': 'C', - 'L': oids['localityName'], - 'localityName': 'L', - 'ST': oids['stateOrProvinceName'], - 'stateOrProvinceName': 'ST', - 'O': oids['organizationName'], - 'organizationName': 'O', - 'OU': oids['organizationalUnitName'], - 'organizationalUnitName': 'OU', - 'E': oids['emailAddress'], - 'emailAddress': 'E' - }; - -function pem2cert(pem) { - var msg = decodePem(pem)[0]; - - if (msg.type !== 'CERTIFICATE' && msg.type !== 'X509 CERTIFICATE' && msg.type !== 'TRUSTED CERTIFICATE') { - throw new Error(__('Could not convert certificate from PEM; PEM header type is "%s", but must be "CERTIFICATE", "X509 CERTIFICATE", or "TRUSTED CERTIFICATE".', msg.type)); - } - - if (msg.procType && msg.procType.type === 'ENCRYPTED') { - throw new Error(__('Could not convert certificate from PEM; PEM is encrypted.')); - } - - return asn2cert(der2asn(new ByteStringBuffer(msg.body))); -} - -function decodePem(str) { - var rval = [], - match, msg, lines, li, line, nl, next, header, values, vi; - - while (true) { - match = rMessage.exec(str); - if (!match) { - break; - } - - rval.push(msg = { - type: match[1], - procType: null, - contentDomain: null, - dekInfo: null, - headers: [], - body: Buffer.from(match[3], 'base64').toString('binary') - }); - - // no headers - if (!match[2]) { - continue; - } - - // parse headers - lines = match[2].split(rCRLF); - for (li = 0; match && li < lines.length; ++li) { - // get line, trim any rhs whitespace - line = lines[li].replace(/\s+$/, ''); - - // RFC2822 unfold any following folded lines - for (nl = li + 1; nl < lines.length; ++nl) { - next = lines[nl]; - if (!whitespaceRegExp.test(next[0])) { - break; - } - line += next; - li = nl; - } - - // parse header - match = line.match(rHeader); - if (match) { - header = {name: match[1], values: []}; - values = match[2].split(','); - for (vi = 0; vi < values.length; ++vi) { - header.values.push(values[vi].replace(leadingSpaceRegExp, '')); - } - - // Proc-Type must be the first header - if (!msg.procType) { - if (header.name !== 'Proc-Type') { - throw new Error(__('Invalid PEM formatted message. The first encapsulated header must be "Proc-Type".')); - } else if (header.values.length !== 2) { - throw new Error(__('Invalid PEM formatted message. The "Proc-Type" header must have two subfields.')); - } - msg.procType = { version: values[0], type: values[1] }; - - // special-case Content-Domain - } else if (!msg.contentDomain && header.name === 'Content-Domain') { - msg.contentDomain = values[0] || ''; - - // special-case DEK-Info - } else if (!msg.dekInfo && header.name === 'DEK-Info') { - if (header.values.length === 0) { - throw new Error(__('Invalid PEM formatted message. The "DEK-Info" header must have at least one subfield.')); - } - msg.dekInfo = { algorithm: values[0], parameters: values[1] || null }; - } else { - msg.headers.push(header); - } - } - } - - if (msg.procType === 'ENCRYPTED' && !msg.dekInfo) { - throw new Error(__('Invalid PEM formatted message. The "DEK-Info" header must be present if "Proc-Type" is "ENCRYPTED".')); - } - } - - if (rval.length === 0) { - throw new Error(__('Invalid PEM formatted message.')); - } - - return rval; -} - -function ByteStringBuffer(str) { - this.data = str; - this.read = 0; -} - -ByteStringBuffer.prototype.length = function length() { - return this.data.length - this.read; -}; - -ByteStringBuffer.prototype.getByte = function getByte() { - return this.data.charCodeAt(this.read++); -}; - -ByteStringBuffer.prototype.getInt = function getInt(n) { - var rval = 0; - do { - rval = (rval << 8) + this.data.charCodeAt(this.read++); - n -= 8; - } while (n > 0); - return rval; -}; - -ByteStringBuffer.prototype.bytes = function bytes(count) { - return count === undefined ? - this.data.slice(this.read) : - this.data.slice(this.read, this.read + count); -}; - -ByteStringBuffer.prototype.getBytes = function getBytes(count) { - var rval; - if (count) { - // read count bytes - count = Math.min(this.length(), count); - rval = this.data.slice(this.read, this.read + count); - this.read += count; - } else if (count === 0) { - rval = ''; - } else { - // read all bytes, optimize to only copy when needed - rval = this.read === 0 ? this.data : this.data.slice(this.read); - this.clear(); - } - return rval; -}; - -ByteStringBuffer.prototype.getInt16 = function getInt16() { - var rval = (this.data.charCodeAt(this.read) << 8 ^ this.data.charCodeAt(this.read + 1)); - this.read += 2; - return rval; -}; - -ByteStringBuffer.prototype.clear = function clear() { - this.data = ''; - this.read = 0; - return this; -}; - -function der2asn(bytes) { - // minimum length for ASN.1 DER structure is 2 - if (bytes.length() < 2) { - throw new Error(__('Too few bytes to parse DER; expected at least 2, got %d', bytes.length())); - } - - // get the first byte - var b1 = bytes.getByte(), - // get the tag class - tagClass = (b1 & 0xC0), - // get the type (bits 1-5) - type = b1 & 0x1F, - - _getValueLength = function _getValueLength(b) { - var b2 = b.getByte(); - if (b2 === 0x80) { - return undefined; - } - - // see if the length is "short form" or "long form" (bit 8 set) - // if "long form", the number of bytes the length is specified in bits 7 through 1 - // and each length byte is in big-endian base-256 - return b2 & 0x80 ? b.getInt((b2 & 0x7F) << 3) : b2; - }, - - // get the value length - length = _getValueLength(bytes), - // prepare to get value - value, - // constructed flag is bit 6 (32 = 0x20) of the first byte - constructed = ((b1 & 0x20) === 0x20), - composed = constructed; - - // ensure there are enough bytes to get the value - if (bytes.length() < length) { - throw new Error(__('Too few bytes to read ASN.1 value. %d < %d', bytes.length(), length)); - } - - // determine if the value is composed of other ASN.1 objects (if its - // constructed it will be and if its a BITSTRING it may be) - if (!composed && tagClass === asn1Class.UNIVERSAL && type === asn1Type.BITSTRING && length > 1) { - /* The first octet gives the number of bits by which the length of the - bit string is less than the next multiple of eight (this is called - the "number of unused bits"). - - The second and following octets give the value of the bit string - converted to an octet string. */ - - // if there are no unused bits, maybe the bitstring holds ASN.1 objs - var read = bytes.read, - unused = bytes.getByte(); - - if (unused === 0) { - // if the first byte indicates UNIVERSAL or CONTEXT_SPECIFIC, - // and the length is valid, assume we've got an ASN.1 object - b1 = bytes.getByte(); - var tc = (b1 & 0xC0); - if (tc === asn1Class.UNIVERSAL || tc === asn1Class.CONTEXT_SPECIFIC) { - try { - var len = _getValueLength(bytes); - composed = (len === length - (bytes.read - read)); - if (composed) { - // adjust read/length to account for unused bits byte - ++read; - --length; - } - } catch(ex) {} - } - } - // restore read pointer - bytes.read = read; - } - - if (composed) { - // parse child asn1 objects from the value - value = []; - if (length === undefined) { - // asn1 object of indefinite length, read until end tag - for (;;) { - if (bytes.bytes(2) === String.fromCharCode(0, 0)) { - bytes.getBytes(2); - break; - } - value.push(der2asn(bytes)); - } - } else { - // parsing asn1 object of definite length - var start = bytes.length(); - while (length > 0) { - value.push(der2asn(bytes)); - length -= start - bytes.length(); - start = bytes.length(); - } - } - } else { - // asn1 not composed, get raw value - // TODO: do DER to OID conversion and vice-versa in .toDer? - - if (length === undefined) { - throw new Error(__('Non-constructed ASN.1 object of indefinite length.')); - } - - if (type === asn1Type.BMPSTRING) { - value = ''; - for (var i = 0; i < length; i += 2) { - value += String.fromCharCode(bytes.getInt16()); - } - } else { - value = bytes.getBytes(length); - } - } - - return { - tagClass: tagClass, - type: type, - constructed: constructed, - composed: constructed || Array.isArray(value), - value: Array.isArray(value) ? value.filter(function (v) { return v !== undefined; }) : value - }; -} - -function asn1validate(obj, v, capture, errors) { - var rval = false; - - // ensure tag class and type are the same if specified - if ((obj.tagClass === v.tagClass || v.tagClass === undefined) && (obj.type === v.type || v.type === undefined)) { - // ensure constructed flag is the same if specified - if (obj.constructed === v.constructed || v.constructed === undefined) { - rval = true; - - // handle sub values - if (v.value && Array.isArray(v.value)) { - var j = 0; - for (var i = 0; rval && i < v.value.length; ++i) { - rval = v.value[i].optional || false; - if (obj.value[j]) { - rval = asn1validate(obj.value[j], v.value[i], capture, errors); - if (rval) { - ++j; - } else if (v.value[i].optional) { - rval = true; - } - } - if (!rval && errors) { - errors.push('[' + v.name + '] Tag class "' + v.tagClass + '", type "' + v.type + '" expected value length "' + v.value.length + '", got "' + obj.value.length + '"'); - } - } - } - - if (rval && capture) { - if (v.capture) { - capture[v.capture] = obj.value; - } - if (v.captureAsn1) { - capture[v.captureAsn1] = obj; - } - } - } else if (errors) { - errors.push('[' + v.name + '] Expected constructed "' + v.constructed + '", got "' + obj.constructed + '"'); - } - } else if (errors) { - if (obj.tagClass !== v.tagClass) { - errors.push('[' + v.name + '] Expected tag class "' + v.tagClass + '", got "' + obj.tagClass + '"'); - } - if (obj.type !== v.type) { - errors.push('[' + v.name + '] Expected type "' + v.type + '", got "' + obj.type + '"'); - } - } - return rval; -} - -/** - * Converts a UTCTime value to a date. - * - * Note: GeneralizedTime has 4 digits for the year and is used for X.509 - * dates passed 2049. Parsing that structure hasn't been implemented yet. - * - * @param utc the UTCTime value to convert. - * - * @return the date. - */ -function asn1utcTimeToDate(utc) { - /* - The following formats can be used: - YYMMDDhhmmZ - YYMMDDhhmm+hh'mm' - YYMMDDhhmm-hh'mm' - YYMMDDhhmmssZ - YYMMDDhhmmss+hh'mm' - YYMMDDhhmmss-hh'mm' - - Where: - YY is the least significant two digits of the year - MM is the month (01 to 12) - DD is the day (01 to 31) - hh is the hour (00 to 23) - mm are the minutes (00 to 59) - ss are the seconds (00 to 59) - Z indicates that local time is GMT, + indicates that local time is - later than GMT, and - indicates that local time is earlier than GMT - hh' is the absolute value of the offset from GMT in hours - mm' is the absolute value of the offset from GMT in minutes - */ - - var date = new Date; - - // if YY >= 50 use 19xx, if YY < 50 use 20xx - var year = parseInt(utc.substr(0, 2), 10); - year = (year >= 50) ? 1900 + year : 2000 + year; - var MM = parseInt(utc.substr(2, 2), 10) - 1; // use 0-11 for month - var DD = parseInt(utc.substr(4, 2), 10); - var hh = parseInt(utc.substr(6, 2), 10); - var mm = parseInt(utc.substr(8, 2), 10); - var ss = 0; - - // not just YYMMDDhhmmZ - if (utc.length > 11) { - // get character after minutes - var c = utc.charAt(10); - var end = 10; - - // see if seconds are present - if (c !== '+' && c !== '-') { - // get seconds - ss = parseInt(utc.substr(10, 2), 10); - end += 2; - } - } - - // update date - date.setUTCFullYear(year, MM, DD); - date.setUTCHours(hh, mm, ss, 0); - - if (end) { - // get +/- after end of time - c = utc.charAt(end); - if (c === '+' || c === '-') { - // get hours+minutes offset - var hhoffset = parseInt(utc.substr(end + 1, 2), 10); - var mmoffset = parseInt(utc.substr(end + 4, 2), 10); - - // calculate offset in milliseconds - var offset = hhoffset * 60 + mmoffset; - offset *= 60000; - - // apply offset - if (c === '+') { - date.setTime(+date - offset); - } else { - date.setTime(+date + offset); - } - } - } - - return date; -} - -/** - * Converts a GeneralizedTime value to a date. - * - * @param gentime the GeneralizedTime value to convert. - * - * @return the date. - */ -function asn1generalizedTimeToDate(gentime) { - /* - The following formats can be used: - YYYYMMDDHHMMSS - YYYYMMDDHHMMSS.fff - YYYYMMDDHHMMSSZ - YYYYMMDDHHMMSS.fffZ - YYYYMMDDHHMMSS+hh'mm' - YYYYMMDDHHMMSS.fff+hh'mm' - YYYYMMDDHHMMSS-hh'mm' - YYYYMMDDHHMMSS.fff-hh'mm' - - Where: - YYYY is the year - MM is the month (01 to 12) - DD is the day (01 to 31) - hh is the hour (00 to 23) - mm are the minutes (00 to 59) - ss are the seconds (00 to 59) - .fff is the second fraction, accurate to three decimal places - Z indicates that local time is GMT, + indicates that local time is - later than GMT, and - indicates that local time is earlier than GMT - hh' is the absolute value of the offset from GMT in hours - mm' is the absolute value of the offset from GMT in minutes - */ - - var date = new Date, - YYYY = parseInt(gentime.substr(0, 4), 10), - MM = parseInt(gentime.substr(4, 2), 10) - 1, // use 0-11 for month - DD = parseInt(gentime.substr(6, 2), 10), - hh = parseInt(gentime.substr(8, 2), 10), - mm = parseInt(gentime.substr(10, 2), 10), - ss = parseInt(gentime.substr(12, 2), 10), - fff = 0, - offset = 0, - isUTC = false; - - if (gentime.charAt(gentime.length - 1) === 'Z') { - isUTC = true; - } - - var end = gentime.length - 5, - c = gentime.charAt(end); - - if (c === '+' || c === '-') { - // get hours+minutes offset - var hhoffset = parseInt(gentime.substr(end + 1, 2), 10); - var mmoffset = parseInt(gentime.substr(end + 4, 2), 10); - - // calculate offset in milliseconds - offset = hhoffset * 60 + mmoffset; - offset *= 60000; - - // apply offset - if(c === '+') { - offset *= -1; - } - - isUTC = true; - } - - // check for second fraction - if(gentime.charAt(14) === '.') { - fff = parseFloat(gentime.substr(14), 10) * 1000; - } - - if(isUTC) { - date.setUTCFullYear(YYYY, MM, DD); - date.setUTCHours(hh, mm, ss, fff); - - // apply offset - date.setTime(+date + offset); - } else { - date.setFullYear(YYYY, MM, DD); - date.setHours(hh, mm, ss, fff); - } - - return date; -} - -/** - * Converts a DER-encoded byte buffer to an OID dot-separated string. The - * byte buffer should contain only the DER-encoded value, not any tag or - * length bytes. - * - * @param bytes the byte buffer. - * - * @return the OID dot-separated string. - */ -function asn1derToOid(bytes) { - var oid; - - // wrap in buffer if needed - if (typeof bytes === 'string') { - bytes = new ByteStringBuffer(bytes); - } - - // first byte is 40 * value1 + value2 - var b = bytes.getByte(); - oid = Math.floor(b / 40) + '.' + (b % 40); - - // other bytes are each value in base 128 with 8th bit set except for - // the last byte for each value - var value = 0; - while (bytes.length() > 0) { - b = bytes.getByte(); - value = value << 7; - // not the last byte for the value - if (b & 0x80) { - value += b & 0x7F; - } else { - // last byte - oid += '.' + (value + b); - value = 0; - } - } - - return oid; -} - -/** - * Converts an RDNSequence of ASN.1 DER-encoded RelativeDistinguishedName - * sets into an array with objects that have type and value properties. - * - * @param rdn the RDNSequence to convert. - * @param md a message digest to append type and value to if provided. - */ -function pkiRDNAttributesAsArray(rdn, md) { - // each value in 'rdn' in is a SET of RelativeDistinguishedName - var rval = [], - si, i, set, attr, obj; - for (si = 0; si < rdn.value.length; ++si) { - // get the RelativeDistinguishedName set - set = rdn.value[si]; - - // each value in the SET is an AttributeTypeAndValue sequence - // containing first a type (an OID) and second a value (defined by - // the OID) - for (i = 0; i < set.value.length; ++i) { - obj = {}; - attr = set.value[i]; - obj.type = asn1derToOid(attr.value[0].value); - obj.value = attr.value[1].value; - obj.valueTagClass = attr.value[1].type; - // if the OID is known, get its name and short name - if (obj.type in oids) { - obj.name = oids[obj.type]; - if (obj.name in shortNames) { - obj.shortName = shortNames[obj.name]; - } - } - if (md) { - md.update(obj.type); - md.update(obj.value); - } - rval.push(obj); - } - } - - return rval; -} - -function asn2cert(obj) { - // validate certificate and capture data - var capture = {}, - errors = []; - - if (!asn1validate(obj, x509CertificateValidator, capture, errors)) { - var error = new Error(__('Cannot read X.509 certificate. ASN.1 object is not an X509v3 Certificate.')); - error.errors = errors; - throw error; - } - - function _getAttribute(obj, options) { - if (typeof options === 'string') { - options = { shortName: options }; - } - var rval = null, - attr; - for (var i = 0; rval === null && i < obj.attributes.length; ++i) { - attr = obj.attributes[i]; - if (options.type && options.type === attr.type) { - rval = attr; - } else if (options.name && options.name === attr.name) { - rval = attr; - } else if (options.shortName && options.shortName === attr.shortName) { - rval = attr; - } - } - return rval; - } - - var subject = { - attributes: pkiRDNAttributesAsArray(capture.certSubject), - getField: function (sn) { - return _getAttribute(subject, sn); - } - }, - validity = []; - - if (capture.certValidity1UTCTime !== undefined) { - validity.push(asn1utcTimeToDate(capture.certValidity1UTCTime)); - } - if (capture.certValidity2GeneralizedTime !== undefined) { - validity.push(asn1generalizedTimeToDate(capture.certValidity2GeneralizedTime)); - } - if (capture.certValidity3UTCTime !== undefined) { - validity.push(asn1utcTimeToDate(capture.certValidity3UTCTime)); - } - if (capture.certValidity4GeneralizedTime !== undefined) { - validity.push(asn1generalizedTimeToDate(capture.certValidity4GeneralizedTime)); - } - if (validity.length > 2) { - throw new Error(__('Cannot read notBefore/notAfter validity times; more than two times were provided in the certificate.')); - } - if (validity.length < 2) { - throw new Error(__('Cannot read notBefore/notAfter validity times; they were not provided as either UTCTime or GeneralizedTime.')); - } - - return { - validity: { - notBefore: validity[0], - notAfter: validity[1] - }, - subject: subject - }; -} - -/* - * If the app exits, close all filesystem watchers. - */ -process.on('exit', function () { - if (watchTimer) { - clearTimeout(watchTimer); - watchTimer = null; - } -}); diff --git a/lib/device.js b/lib/device.js deleted file mode 100644 index b45573c..0000000 --- a/lib/device.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Detects iOS developer and distribution certificates and the WWDC certificate. - * - * @module device - * - * @copyright - * Copyright (c) 2014-2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -'use strict'; - -const appc = require('node-appc'); -const async = require('async'); -const magik = require('./utilities').magik; -const fs = require('fs'); -const iosDevice = require('node-ios-device'); -const path = require('path'); -const __ = appc.i18n(__dirname).__; - -var cache; - -exports.detect = detect; -exports.install = install; - -/** - * Detects connected iOS devices. - * - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects all connected iOS devices. - * @param {Function} [callback(err, results)] - A function to call with the device information. - * - * @emits module:device#detected - * @emits module:device#error - * - * @returns {Handle} - */ -function detect(options, callback) { - return magik(options, callback, function (handle, options, callback) { - if (cache && !options.bypassCache) { - var dupe = JSON.parse(JSON.stringify(cache)); - handle.emit('detected', dupe); - return callback(null, dupe); - } - - iosDevice.devices(function (err, devices) { - if (err) { - handle.emit('error', err); - return callback(err); - } - - var results = { - devices: devices, - issues: [] - }; - - // the cache must be a clean copy that we'll clone for subsequent detect() calls - // because we can't allow the cache to be modified by reference - cache = JSON.parse(JSON.stringify(results)); - - handle.emit('detected', results); - return callback(null, results); - }); - }); -}; - -/** - * Installs the specified app to an iOS device. - * - * @param {String} udid - The UDID of the device to install the app to or null if you want ioslib to pick one. - * @param {String} appPath - The path to the iOS app to install after launching the iOS Simulator. - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects all iOS simulators. - * @param {Number} [options.logPort] - A port to connect to in the iOS app and relay log messages from. - * @param {Number} [options.timeout] - Number of milliseconds to wait before timing out. - * - * @emits module:device#app-quit - Only omitted when `options.logPort` is specified and app starts a TCP server. - * @emits module:device#app-started - Only omitted when `options.logPort` is specified and app starts a TCP server. - * @emits module:device#disconnect - Only omitted when `options.logPort` is specified and app starts a TCP server. - * @emits module:device#error - * @emits module:device#installed - * @emits module:device#log - Only omitted when `options.logPort` is specified and app starts a TCP server. - * - * @returns {Handle} - */ -function install(udid, appPath, options) { - return magik(options, null, function (handle, options) { - if (!appPath) { - return handle.emit('error', new Error(__('Missing app path argument'))); - } - - if (!fs.existsSync(appPath)) { - return handle.emit('error', new Error(__('App path does not exist: ' + appPath))); - } - - handle.stop = function () {}; // for stopping logging - - iosDevice.installApp(udid, appPath, function (err) { - if (err) { - return handle.emit('error', err); - } - - handle.emit('installed'); - - if (options.logPort) { - var logHandle = iosDevice - .log(udid, options.logPort) - .on('log', function (msg) { - handle.emit('log', msg); - }) - .on('app-started', function () { - handle.emit('app-started'); - }) - .on('app-quit', function () { - handle.emit('app-quit'); - }) - .on('disconnect', function () { - handle.emit('disconnect'); - }) - .on('error', function (err) { - handle.emit('log-error', err); - }); - - handle.stop = function () { - logHandle.stop(); - }; - } - }); - }); -} diff --git a/lib/env.js b/lib/env.js deleted file mode 100644 index b5e4df6..0000000 --- a/lib/env.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Detects the iOS development environment. - * - * @module env - * - * @copyright - * Copyright (c) 2014-2017 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - appc = require('node-appc'), - async = require('async'), - magik = require('./utilities').magik, - __ = appc.i18n(__dirname).__; - -var cache = null; - -/** - * Fired when the developer profiles have been updated. - * @event module:env#detected - * @type {Object} - */ - -/** - * Fired when there was an error retreiving the provisioning profiles. - * @event module:env#error - * @type {Error} - */ - -/** - * Detects the iOS development enviroment dependencies. - * - * @param {Object} [options] - An object containing various settings - * @param {Boolean} [options.bypassCache=false] - When true, re-detects the development environment dependencies - * @param {String} [options.security] - Path to the security executable - * @param {String} [options.xcodeSelect] - Path to the xcode-select executable - * @param {Function} [callback(err, results)] - A function to call with the development environment information - * - * @emits module:env#detected - * @emits module:env#error - * - * @returns {Handle} - */ -exports.detect = function detect(options, callback) { - return magik(options, callback, function (emitter, options, callback) { - if (cache && !options.bypassCache) { - return callback(null, cache); - } - - var results = { - executables: { - xcodeSelect: null, - security: null - }, - issues: [] - }; - - async.parallel({ - security: function (next) { - appc.subprocess.findExecutable([options.security, '/usr/bin/security', 'security'], function (err, result) { - if (err) { - results.issues.push({ - id: 'IOS_SECURITY_EXECUTABLE_NOT_FOUND', - type: 'error', - message: __("Unable to find the 'security' executable.") + '\n' - + __('Please verify your system path.') + '\n' - + __("This program is distributed with macOS and if it's missing, you'll have to restore it from a backup or another computer, or reinstall macOS.") - }); - } else { - results.executables.security = result; - } - next(); - }); - }, - - xcodeSelect: function (next) { - appc.subprocess.findExecutable([options.xcodeSelect, '/usr/bin/xcode-select', 'xcode-select'], function (err, result) { - if (err) { - results.issues.push({ - id: 'IOS_XCODE_SELECT_EXECUTABLE_NOT_FOUND', - type: 'error', - message: __("Unable to find the 'xcode-select' executable.") + '\n' - + __('Perhaps Xcode is not installed, your Xcode installation is corrupt, or your system path is incomplete.') - }); - } else { - results.executables.xcodeSelect = result; - } - next(); - }); - } - }, function () { - cache = results; - emitter.emit('detected', results); - callback(null, results); - }); - }); -}; diff --git a/lib/provisioning.js b/lib/provisioning.js deleted file mode 100644 index 41c0011..0000000 --- a/lib/provisioning.js +++ /dev/null @@ -1,413 +0,0 @@ -/** - * Detects provisioning profiles. - * - * @module provisioning - * - * @copyright - * Copyright (c) 2014-2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - * - * @requires certs - */ - -const - appc = require('node-appc'), - certs = require('./certs'), - magik = require('./utilities').magik, - fs = require('fs'), - path = require('path'), - __ = appc.i18n(__dirname).__, - provisioningProfilesDirectories = [ - '~/Library/Developer/Xcode/UserData/Provisioning Profiles', - '~/Library/MobileDevice/Provisioning Profiles' - ] - -var cache = null, - watchers = {}; - -/** - * Fired when the provisioning profiles have been detected or updated. - * @event module:provisioning#detected - * @type {Object} - */ - -/** - * Fired when there was an error retreiving the provisioning profiles. - * @event module:provisioning#error - * @type {Error} - */ - -exports.detect = detect; -exports.find = find; -exports.watch = watch; -exports.unwatch = unwatch; - -/** - * Detects installed provisioning profiles. - * - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects all provisioning profiles. - * @param {String} [options.profileDir=~/Library/Developer/Xcode/UserData/Provisioning Profiles] - The path to search for provisioning profiles. - * @param {Boolean} [options.unmanaged] - When true, excludes managed provisioning profiles. - * @param {Boolean} [options.validOnly=true] - When true, only returns non-expired, valid provisioning profiles. - * @param {Boolean} [options.watch=false] - If true, watches the specified provisioning profile directory for updates. - * @param {Function} [callback(err, results)] - A function to call with the provisioning profile information. - * - * @emits module:provisioning#detected - * @emits module:provisioning#error - * - * @returns {Handle} - */ -function detect(options, callback) { - return magik(options, callback, function (emitter, options, callback) { - var files = {}, - validOnly = options.validOnly === undefined || options.validOnly === true, - profileDirs = getExistingProvisioningProfileDirectories(options.profileDir), - results = { - provisioning: { - profileDir: profileDirs[0], - development: [], - adhoc: [], - enterprise: [], - distribution: [], - }, - issues: [] - }, - valid = { - development: 0, - adhoc: 0, - enterprise: 0, - distribution: 0 - }, - - ppRegExp = /.*\.(mobileprovision|provisionprofile)$/; - - - if (options.watch) { - var throttleTimer = null; - - for (const profileDir of profileDirs) { - if (!watchers[profileDir]) { - watchers[profileDir] = { - handle: fs.watch(profileDir, { persistent: false }, function (event, filename) { - if (!ppRegExp.test(filename)) { - // if it's not a provisioning profile, we don't care about it - return; - } - - var file = path.join(profileDir, filename); - - if (event === 'rename') { - if (files[file]) { - if (fs.existsSync(file)) { - // change, reload the provisioning profile - parseProfile(file); - } else { - // delete - removeProfile(file); - } - } else { - // add - parseProfile(file); - } - } else if (event === 'change') { - // updated - parseProfile(file); - } - - clearTimeout(throttleTimer); - - throttleTimer = setTimeout(function () { - detectIssues(); - emitter.emit('detected', results); - }, 250); - }), - count: 0 - }; - } - - watchers[profileDir].count++; - } - } - - if (cache && !options.bypassCache) { - emitter.emit('detected', cache); - return callback(null, cache); - } - - function detectIssues() { - results.issues = []; - - if (results.provisioning.development.length > 0 && !valid.development) { - results.issues.push({ - id: 'IOS_NO_VALID_DEVELOPMENT_PROVISIONING_PROFILES', - type: 'warning', - message: __('Unable to find any valid iOS development provisioning profiles.') + '\n' + - __('This will prevent you from building apps for testing on iOS devices.') - }); - } - - if (results.provisioning.adhoc.length > 0 && !valid.adhoc) { - results.issues.push({ - id: 'IOS_NO_VALID_ADHOC_PROVISIONING_PROFILES', - type: 'warning', - message: __('Unable to find any valid iOS adhoc provisioning profiles.') + '\n' + - __('This will prevent you from packaging apps for adhoc distribution.') - }); - } - - if (results.provisioning.distribution.length > 0 && !valid.distribution) { - results.issues.push({ - id: 'IOS_NO_VALID_DISTRIBUTION_PROVISIONING_PROFILES', - type: 'warning', - message: __('Unable to find any valid iOS distribution provisioning profiles.') + '\n' + - __('This will prevent you from packaging apps for AppStore distribution.') - }); - } - } - - function removeProfile(file) { - var r = results[files[file]], - i = 0, - l = r.length; - for (; i < l; i++) { - if (r[i].file === file) { - r.splice(i, 1); - break; - } - } - delete files[file]; - } - - function parseProfile(file) { - if (!fs.existsSync(file)) { - return; - } - - var contents = fs.readFileSync(file).toString(), - i = contents.indexOf(''); - - if (j === -1) return; - - var plist = new appc.plist().parse(contents.substring(i, j + 8)), - dest = 'development', // debug - appPrefix = (plist.ApplicationIdentifierPrefix || []).shift(), - entitlements = plist.Entitlements || {}, - expired = false; - - if (plist.ProvisionedDevices) { - if (!entitlements['get-task-allow']) { - dest = 'adhoc'; - } - } else if (plist.ProvisionsAllDevices) { - dest = 'enterprise'; - } else { - dest = 'distribution'; // app store - } - - try { - if (plist.ExpirationDate) { - expired = new Date(plist.ExpirationDate) < new Date; - } - } catch (e) {} - - if (!expired) { - valid[dest]++; - } - - // store which bucket the provisioning profile is in - files[file] && removeProfile(file); - files[file] = dest; - - var managed = plist.Name.indexOf('iOS Team Provisioning Profile') !== -1; - - if ((!validOnly || !expired) && (!options.unmanaged || !managed)) { - results.provisioning[dest].push({ - file: file, - uuid: plist.UUID, - name: plist.Name, - managed: managed, - appPrefix: appPrefix, - creationDate: plist.CreationDate, - expirationDate: plist.ExpirationDate, - expired: expired, - certs: Array.isArray(plist.DeveloperCertificates) - ? plist.DeveloperCertificates.map(function (cert) { return cert.value; }) - : null, - devices: plist.ProvisionedDevices || null, - team: plist.TeamIdentifier || null, - entitlements: entitlements, - // TODO: remove all of the entitlements below and just use the `entitlements` property - appId: (entitlements['application-identifier'] || entitlements['com.apple.application-identifier'] || '').replace(appPrefix + '.', ''), - getTaskAllow: !!entitlements['get-task-allow'], - apsEnvironment: entitlements['aps-environment'] || '' - }); - } - } - - for (const profileDir of profileDirs) { - fs.readdirSync(profileDir).forEach(function (name) { - ppRegExp.test(name) && parseProfile(path.join(profileDir, name)); - }); - } - - detectIssues(); - cache = results; - emitter.emit('detected', results); - return callback(null, results); - }); -}; - -/** - * Finds all provisioning profiles that match the specified developer cert name - * and iOS device UDID. - * - * @param {Object} [options] - An object containing various settings. - * @param {String} [options.appId] - The app identifier (com.domain.app) to filter by. - * @param {Object|Array} [options.certs] - One or more certificate descriptors to filter by. - * @param {String|Array} [options.deviceUDIDs] - One or more iOS device UDIDs to filter by. - * @param {Boolean} [options.unmanaged] - When true, excludes managed provisioning profiles. - * @param {Boolean} [options.validOnly=true] - When true, only returns valid profiles. - * @param {Function} callback(err, results) - A function to call with an array of matching provisioning profiles. - */ -function find(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } else if (!options) { - options = {}; - } - typeof callback === 'function' || (callback = function () {}); - - var deviceUDIDs = (Array.isArray(options.deviceUDIDs) ? options.deviceUDIDs : [ options.deviceUDIDs ]).filter(function (a) { return a; }), - certs = (Array.isArray(options.certs) ? options.certs : [ options.certs ]).filter(function (a) { return a; }); - - options.validOnly = options.validOnly === undefined || options.validOnly === true; - - exports.detect(options, function (err, results) { - if (err) { - return callback(err); - } else { - var profiles = []; - - function check(scope) { - scope.forEach(function (pp) { - // check app id - if (options.appId && !(new RegExp('^' + pp.appId.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$')).test(options.appId)) { - return; - } - - // check certs - if (certs.length) { - var match = false; - for (var i = 0, l = certs.length; i < l; i++) { - var prefix = certs[i].pem.replace(/^-----BEGIN CERTIFICATE-----\n/, '').substring(0, 60); - if (pp.certs.some(function (cert) { return cert.indexOf(prefix) === 0; })) { - match = true; - break; - } - } - if (!match) return; - } - - // check device uuids - if (deviceUDIDs.length && (pp.devices === null || !deviceUDIDs.some(function (d) { return pp.devices.indexOf(d) !== -1; }))) { - return; - } - - profiles.push(pp); - }); - } - - check(results.provisioning.development); - check(results.provisioning.distribution); - check(results.provisioning.adhoc); - - return callback(null, profiles); - } - }); -}; - -/** - * Watches a provisioning profile directory for file changes. - * - * @param {Object} [options] - An object containing various settings. - * @param {String} [options.profileDir=~/Library/Developer/Xcode/UserData/Provisioning Profiles] - The path to search for provisioning profiles. - * @param {Function} [callback(err, results)] - A function to call with the provisioning profile information. - * - * @returns {Function} A function that unwatches changes. - */ -function watch(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } else if (!options) { - options = {}; - } - - options.watch = true; - options.bypassCache = true; - - exports.detect(options, callback); - - return function () { - unwatch(options.profileDir); - }; -}; - -/** - * Stops watching the specified provisioning profile directory. - * - * @param {String} [profileDir=~/Library/Developer/Xcode/UserData/Provisioning Profiles] - The path to the provisioning profile directory. - */ -function unwatch(profileDir) { - var profileDirs = getExistingProvisioningProfileDirectories(profileDir); - - for (const profileDir of profileDirs) { - if (!watchers[profileDir]) continue; - - if (--watchers[profileDir].count <= 0) { - watchers[profileDir].handle.close(); - delete watchers[profileDir]; - } - } -}; - -/** - * Searches for existing provisioning profile directories. - * - * @throws - * @param {string | undefined} profileDir A custom directory set by the developer. - * @returns {string[]} The directories that exist on the filesystem. - */ -function getExistingProvisioningProfileDirectories(profileDir) { - const profileDirectories = []; - - for (const directory of [profileDir, ...provisioningProfilesDirectories]) { - if (!directory) { - continue; - } - - const resolvedDirectory = appc.fs.resolvePath(directory); - - if (fs.existsSync(resolvedDirectory)) { - profileDirectories.push(resolvedDirectory); - } - } - - return profileDirectories; -} - -/* - * If the app exits, close all filesystem watchers. - */ -process.on('exit', function () { - Object.keys(watchers).forEach(function (w) { - watchers[w].handle.close(); - delete watchers[w]; - }); -}); diff --git a/lib/sim_focus.scpt b/lib/sim_focus.scpt deleted file mode 100644 index 7ebb60b..0000000 Binary files a/lib/sim_focus.scpt and /dev/null differ diff --git a/lib/sim_hide.scpt b/lib/sim_hide.scpt deleted file mode 100644 index 835e02a..0000000 Binary files a/lib/sim_hide.scpt and /dev/null differ diff --git a/lib/simctl.js b/lib/simctl.js deleted file mode 100644 index 7cb193c..0000000 --- a/lib/simctl.js +++ /dev/null @@ -1,712 +0,0 @@ -/** - * A wrapper around Xcode's `simctl` command line program. - * - * @module simctl - * - * @copyright - * Copyright (c) 2016-2017 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -'use strict'; - -const appc = require('node-appc'); -const async = require('async'); -const debug = require('debug'); -const __ = appc.i18n(__dirname).__; - -exports.activatePair = activatePair; -exports.boot = boot; -exports.create = create; -exports.getSim = getSim; -exports.install = install; -exports.launch = launch; -exports.list = list; -exports.listDevices = listDevices; -exports.pair = pair; -exports.pairAndActivate = pairAndActivate; -exports.shutdown = shutdown; -exports.uninstall = uninstall; -exports.unpair = unpair; -exports.waitUntilBooted = waitUntilBooted; - -const log = debug('ioslib:simctl'); - -/** - * Activates an existing device pair. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.udid - The pair udid to activate. - * @param {Function} callback(err) - A function to call when finished. - */ -function activatePair(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - - trySimctl(params, ['pair_activate', params.udid], function (err) { - // code 37 means the pair is already active - callback(err && err.code !== 37 ? new Error(__('Failed to activate pair: %s', err.message)) : null); - }); -} - -/** - * Creates a new simulator. - * - * @param {Object} params - Various parameters. - * @param {String} params.deviceType - The device type to use such as - * `com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus`. - * @param {String} params.name - The name of the simulator. - * @param {String} params.runtime - The runtime to use such as - * `com.apple.CoreSimulator.SimRuntime.iOS-10-2`. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Function} callback(err, udid) - A function to call when finished. - */ -function create(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.name) { - return callback(new Error(__('Missing "name" param'))); - } - if (!params.deviceType) { - return callback(new Error(__('Missing "deviceType" param'))); - } - if (!params.runtime) { - return callback(new Error(__('Missing "runtime" param'))); - } - - trySimctl(params, ['create', params.name, params.deviceType, params.runtime], function (err, output) { - if (err) { - return callback(err); - } - callback(null, output.split('\n').shift().trim()); - }); -} - -/** - * Installs an app in the specified simulator. Simulator must be running. - * - * @param {Object} params - Various parameters. - * @param {String} params.appPath - The full path to the `.app` directory. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.udid - The simulator udid to install the app on. - * @param {Function} callback(err) - A function to call when finished. - */ -function install(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - if (!params.appPath) { - return callback(new Error(__('Missing "appPath" param'))); - } - - trySimctl(params, ['install', params.udid, params.appPath], callback); -} - -/** - * Launches an app in the specified simulator. Simulator must be running. - * - * @param {Object} params - Various parameters. - * @param {String} params.appId - The id of the app to launch. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.udid - The simulator udid to launch the app on. - * @param {Function} callback(err) - A function to call when finished. - */ -function launch(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - if (!params.appId) { - return callback(new Error(__('Missing "appId" param'))); - } - - trySimctl(params, ['launch', '--terminate-running-process', params.udid, params.appId], callback); -} - -/** - * Boots an simulator runtime. Simulator must be running. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.udid - The simulator udid to launch the app on. - * @param {Function} callback(err) - A function to call when finished. - */ -function boot(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - - trySimctl(params, ['boot', params.udid], callback); -} - -/** - * Returns a list of all devices, runtimes, device types, and pairs. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {Function} callback(err, info) - A function to call when finished. - */ -function list(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - - var done = false; - var tries = 0; - var maxTries = params.tries || 4; - - async.whilst( - function (cb) { - return cb(null, !done && tries++ < maxTries); - }, - function (cb) { - trySimctl(params, ['list', '--json'], function (err, output) { - if (err) { - return cb(err); - } - - output = output.trim(); - if (!output) { - log('simctl list output was empty!'); - return cb(); - } - - var json = null; - try { - json = JSON.parse(output.substring(output.indexOf('{'))); - } catch (e) { - return cb(e); - } - - if (!json) { - return cb(new Error(__('simctl list: json is null'))); - } - - // convert the pairs from -> (ios sim + watch sim) to -> -> - json.iosSimToWatchSimToPair = {}; - Object.keys(json.pairs).forEach(function (pairUdid) { - var pair = json.pairs[pairUdid]; - var m = pair.state.match(/^\(((?:in)?active),/); - if (m) { - json.iosSimToWatchSimToPair[pair.phone.udid] || (json.iosSimToWatchSimToPair[pair.phone.udid] = {}); - json.iosSimToWatchSimToPair[pair.phone.udid][pair.watch.udid] = { udid: pairUdid, active: m[1] === 'active' }; - } - }); - - done = true; - cb(null, json); - }); - }, - function (err, info) { - if (err) { - return callback(err); - } - - if (!done) { - return callback(new Error(__('simctl list failed after %s tries', maxTries))); - } - - callback(null, info); - } - ); -} - - -/** - * Returns a list of all devices. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {Function} callback(err, info) - A function to call when finished. - */ -function listDevices(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - - var done = false; - var tries = 0; - var maxTries = params.tries || 4; - - async.whilst( - function (cb) { - return cb(null, !done && tries++ < maxTries); - }, - function (cb) { - trySimctl(params, ['list', 'devices', '--json'], function (err, output) { - if (err) { - return cb(err); - } - - output = output.trim(); - if (!output) { - log('simctl list devices output was empty!'); - return cb(); - } - - var json = null; - try { - json = JSON.parse(output.substring(output.indexOf('{'))); - } catch (e) { - return cb(e); - } - - if (!json) { - return cb(new Error(__('simctl list devices: json is null'))); - } - - done = true; - cb(null, json); - }); - }, - function (err, info) { - if (err) { - return callback(err); - } - - if (!done) { - return callback(new Error(__('simctl list devices failed after %s tries', maxTries))); - } - - callback(null, info); - } - ); -} - -/** - * Pairs a iOS Simulator with a watchOS Simulator. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.simUdid - The udid of the iOS Simulator. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {String} params.watchSimUdid - The udid of the watchOS Simulator. - * @param {Function} callback(err, udid) - A function to call when finished. - */ -function pair(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.simUdid) { - return callback(new Error(__('Missing "simUdid" param'))); - } - if (!params.watchSimUdid) { - return callback(new Error(__('Missing "watchSimUdid" param'))); - } - - trySimctl(params, ['pair', params.watchSimUdid, params.simUdid], function (err, output) { - if (err) { - var alreadyPaired = err.message.indexOf('The selected devices are already paired with each other') !== -1; - if (err.code !== 161 || !alreadyPaired) { - return callback(err); - } - } else { - return callback(null, output.split('\n').shift().trim()); - } - - // already paired, get the udid - log('Already paired, getting pair id'); - list(params, function (err, info) { - if (err) { - return callback(err); - } - - if (!info.iosSimToWatchSimToPair[params.simUdid]) { - return callback(new Error(__('iOS Simulator %s doesn\'t have any paired watchOS Simulators!', params.simUdid))); - } - - var watchSim = info.iosSimToWatchSimToPair[params.simUdid][params.watchSimUdid]; - if (!watchSim) { - return callback(new Error(__('Failed to find device pair for iOS Simulator %s and watchOS Simulator %s.', params.simUdid, params.watchSimUdid))); - } - - var udid = watchSim.udid; - log('Found pair id: ' + udid); - callback(null, udid); - }); - }); -} - -/** - * Pairs a iOS Simulator with a watchOS Simulator, then activates it. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.simUdid - The udid of the iOS Simulator. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {String} params.watchSimUdid - The udid of the watchOS Simulator. - * @param {Function} callback(err) - A function to call when finished. - */ -function pairAndActivate(params, callback) { - pair(params, function (err, udid) { - if (err) { - return callback(err); - } - - params.udid = udid; - activatePair(params, callback); - }); -} - -/** - * Shuts down the simulator. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.udid - The udid of the simulator to shutdown. - * @param {Function} callback(err) - A function to call when finished. - */ -function shutdown(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - - getSim(params, function (err, sim) { - if (err) { - return callback(err); - } - - if (!sim) { - return callback(new Error(__('Unable to find Simulator %s', params.udid))); - } - - if (sim.isAvailable === false && sim.availability !== '(available)') { - return callback(new Error(__('Simulator is not available'))); - } - - log('Sim state: ' + sim.state); - if (/^shutdown|creating$/i.test(sim.state)) { - return callback(); - } - - trySimctl(params, ['shutdown', params.udid], callback); - }); -} - -/** - * Uninstalls an app from the specified simulator. Simulator must be running. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {String} params.udid - The udid of the simulator. - * @param {String} params.appId - The app id to uninstall. - * @param {Function} callback(err) - A function to call when finished. - */ -function uninstall(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - if (!params.appId) { - return callback(new Error(__('Missing "appId" param'))); - } - - trySimctl(params, ['uninstall', params.udid, params.appId], function (err) { - if (err && err.code === 1) { - // app wasn't installed - return callback(); - } - - if (err) { - return callback(new Error('Failed to uninstall app')); - } - - callback(); - }); -} - -/** - * Unpairs a iOS Simulator from a watchOS Simulator. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {String} params.udid - The pair udid. - * @param {Function} callback(err) - A function to call when finished. - */ -function unpair(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - - list(params, function (err, info) { - if (err) { - return callback(err); - } - - var pair = info.pairs[params.udid]; - if (!pair) { - // already unpaired... or invalid udid - return callback(); - } - - trySimctl(params, ['unpair', params.udid], function (err) { - if (err) { - return callback(err); - } - - // check if the unpair was successful - list(params, function (err, info) { - if (err) { - return callback(err); - } - - if (info.iosSimToWatchSimToPair[pair.phone.udid] && info.iosSimToWatchSimToPair[pair.phone.udid][pair.watch.udid]) { - log('Unpair failed'); - err = new Error('Unable to unpair'); - err.code = 666; - } - - callback(err); - }); - }); - }); -} - -/** - * Finds the specified simulator and returns it's state and availability. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {String} params.udid - The pair udid. - * @param {Function} callback(err, sim) - A function to call when finished. - */ -function getSim(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - - list(params, function (err, info) { - if (err) { - return callback(err); - } - - var found = null; - - Object.keys(info.devices).some(function (type) { - return info.devices[type].some(function (sim) { - if (sim.udid === params.udid) { - found = sim; - return true; - } - }); - }); - - callback(null, found); - }); -} - -/** - * Waits for the simulator to boot. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Number} [params.timeout] - A number of milliseconds to wait before - * timing out and aborting. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {String} params.udid - The pair udid. - * @param {Function} callback(err, booted) - A function to call when finished. - */ -function waitUntilBooted(params, callback) { - if (!params || typeof params !== 'object') { - return callback(new Error(__('Missing params'))); - } - if (!params.simctl) { - return callback(new Error(__('Missing "simctl" param'))); - } - if (!params.udid) { - return callback(new Error(__('Missing "udid" param'))); - } - - var booted = false; - var timedOut = false; - var tries = 0; - var maxTries = params.tries || 4; - var timer = null; - - log('Waiting for simulator ' + params.udid + ' to boot'); - - if (params.timeout) { - timer = setTimeout(function () { - timedOut = true; - log('Timed out waiting for the Simulator to boot'); - }, params.timeout); - } - - async.whilst( - function (cb) { - return cb(null, !booted && !timedOut); - }, - function (cb) { - getSim(params, function (err, sim) { - if (err) { - return cb(err); - } - - if (!sim) { - return cb(new Error(__('Unable to find Simulator %s', params.udid))); - } - - if (sim.isAvailable === false && sim.availability !== '(available)') { - return cb(new Error(__('Simulator is not available'))); - } - - log('Sim state: ' + sim.state); - if (/^booted$/i.test(sim.state)) { - booted = true; - clearTimeout(timer); - return cb(); - } - - setTimeout(function () { - cb(); - }, 500); - }); - }, - function (err) { - if (err) { - return callback(err); - } - if (timedOut) { - err = new Error(__('Timed out waiting for simulator to boot')); - err.code = 666; - return callback(err); - } - callback(null, booted); - } - ); -} - -/** - * Calls `simctl` in an async loop until it succeeds or hits the max number of - * tries. - * - * @param {Object} params - Various parameters. - * @param {String} params.simctl - The path to the `simctl` executable. - * @param {Number} [params.tries] - The max number of `simctl` tries. - * @param {Array} args - The args to pass directly into `simctl`. - * @param {Function} callback(err) - A function to call when finished. - */ -function trySimctl(params, args, callback) { - var done = false; - var tries = 0; - var maxTries = params.tries || 4; - var timeout = 100; - - async.whilst( - function (cb) { - return cb(null, !done && tries++ < maxTries); - }, - function (cb) { - log('Running: ' + params.simctl + (Array.isArray(args) ? ' ' + args.map(function (s) { return s.indexOf(' ') !== -1 ? '"' + s + '"' : s; }).join(' ') : '')); - appc.subprocess.run(params.simctl, args, function (code, out, err) { - if (!code) { - done = true; - return cb(null, out); - } - - err = new Error(err.trim()); - err.code = code; - - // check for pair error - if (code === 161 || (code === 37 && err.message.indexOf('This pair is already active') !== -1)) { - done = true; - return cb(err); - } - - if (code === 3 && err.message.indexOf('did not return a valid pid') !== -1) { - done = true; - return cb(err); - } - - if (err.message.indexOf('Failed to load CoreSimulatorService') !== -1) { - log('simctl needs to switch the CoreSimulatorService, waiting a couple seconds (code ' + code + ')'); - setTimeout(function () { - cb(); - }, 2000); - return; - } - - if (tries < maxTries) { - log('simctl failed: ' + err.message); - setTimeout(function () { - timeout *= 2; - log('Retrying...'); - cb(); - }, timeout); - } else { - log('Giving up'); - cb(err); - } - }); - }, - callback - ); -} diff --git a/lib/simulator.js b/lib/simulator.js deleted file mode 100644 index e4f41d5..0000000 --- a/lib/simulator.js +++ /dev/null @@ -1,2022 +0,0 @@ -/** - * Detects iOS developer and distribution certificates and the WWDR certificate. - * - * @module simulator - * - * @copyright - * Copyright (c) 2014-2018 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -'use strict'; - -const appc = require('node-appc'); -const async = require('async'); -const EventEmitter = require('events').EventEmitter; -const magik = require('./utilities').magik; -const fs = require('fs'); -const net = require('net'); -const path = require('path'); -const readPlist = require('./utilities').readPlist; -const simctl = require('./simctl'); -const spawn = require('child_process').spawn; -const Tail = require('always-tail'); -const xcode = require('./xcode'); -const __ = appc.i18n(__dirname).__; - -let cache; - -exports.detect = detect; -exports.findSimulators = findSimulators; -exports.launch = launch; -exports.stop = stop; -exports.SimHandle = SimHandle; -exports.SimulatorCrash = SimulatorCrash; - -/** - * @class - * @classdesc An exception for when an app crashes in the iOS Simulator. - * @constructor - * @param {Array|Object} [crashFiles] - The crash details. - */ -function SimulatorCrash(crashFiles) { - this.name = 'SimulatorCrash'; - this.message = __('App crashed in the iOS Simulator'); - this.crashFiles = Array.isArray(crashFiles) ? crashFiles : crashFiles ? [ crashFiles ] : null; -} -SimulatorCrash.prototype = Object.create(Error.prototype); -SimulatorCrash.prototype.constructor = SimulatorCrash; - -function SimHandle(obj) { - appc.util.mix(this, obj); -} - -exports.deviceState = { - DOES_NOT_EXIST: -1, - CREATING: 0, - SHUTDOWN: 1, - BOOTING: 2, - BOOTED: 3, - SHUTTING_DOWN: 4 -}; - -exports.deviceStateNames = { - 0: 'Creating', - 1: 'Shutdown', - 2: 'Booting', - 3: 'Booted', - 4: 'Shutting Down' -}; - -/** - * Helper function for comparing two simulators based on the model name. - * - * @param {Object} a - A simulator handle. - * @param {Object} b - Another simulator handle. - * - * @returns {Number} - Returns -1 if a < b, 1 if a > b, and 0 if they are equal. - */ -function compareSims(a, b) { - return a.model < b.model ? -1 : a.model > b.model ? 1 : 0; -} - -/** - * Detects iOS simulators. - * - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects all iOS simulators. - * @param {Function} [callback(err, results)] - A function to call with the simulator information. - * - * @emits module:simulator#detected - * @emits module:simulator#error - * - * @returns {Handle} - */ -function detect(options, callback) { - return magik(options, callback, function (emitter, options, callback) { - if (cache && !options.bypassCache) { - var dupe = JSON.parse(JSON.stringify(cache)); - emitter.emit('detected', dupe); - return callback(null, dupe); - } - - function fakeWatchSim(name, udid, model, xcodes) { - return { - udid: udid, - name: name, - version: '1.0', - type: 'watchos', - - simctl: null, - simulator: null, - - deviceType: null, - deviceName: name, - deviceDir: null, - model: model, - family: 'watch', - supportsXcode: xcodes, - supportsWatch: {}, - watchCompanion: {}, - - runtime: null, - runtimeName: 'watchOS 1.0', - - systemLog: null, - dataDir: null - }; - } - - var results = { - simulators: { - ios: {}, - watchos: {}, - crashDir: appc.fs.resolvePath('~/Library/Logs/DiagnosticReports'), - }, - issues: [] - }; - - xcode.detect(options, function (err, xcodeInfo) { - if (err) { - emitter.emit('error', err); - return callback(err); - } - - var xcodeIds = Object - .keys(xcodeInfo.xcode) - .filter(function (ver) { return xcodeInfo.xcode[ver].supported; }) - .sort(function (a, b) { - var v1 = xcodeInfo.xcode[a].version; - var v2 = xcodeInfo.xcode[b].version; - return xcodeInfo.xcode[a].selected || appc.version.lt(v1, v2) ? -1 : appc.version.eq(v1, v2) ? 0 : 1; - }); - - // if we have Xcode 6.2, 6.3, or 6.4, then inject some fake devices for WatchKit 1.x - xcodeIds.some(function (id) { - var xc = xcodeInfo.xcode[id]; - if (appc.version.satisfies(xc.version, '>=6.2 <7.0')) { - var xcodes = {}; - xcodeIds.forEach(function (id) { - if (appc.version.satisfies(xcodeInfo.xcode[id].version, '>=6.2 <7.0')) { - xcodes[id] = true; - } - }); - results.simulators.watchos['1.0'] = [ - fakeWatchSim('Apple Watch - 38mm', '58045222-F0C1-41F7-A4BD-E2EDCFBCF5B9', 'Watch0,1', xcodes), - fakeWatchSim('Apple Watch - 42mm', 'D5C1DA2F-7A74-49C8-809A-906E554021B0', 'Watch0,2', xcodes) - ]; - return true; - } - }); - - if (!xcodeInfo.selectedXcode || !xcodeInfo.selectedXcode.eulaAccepted) { - emitter.emit('detected', results); - return callback(null, results); - } - - const typeRE = /iOS|watchOS/i; - const deviceTypeLookup = {}; - const runtimeLookup = {}; - - xcodeIds.forEach(function (xcodeId) { - var xc = xcodeInfo.xcode[xcodeId]; - - Object.keys(xc.simDeviceTypes).forEach(function (id) { - if (!deviceTypeLookup[id]) { - deviceTypeLookup[id] = { - name: xc.simDeviceTypes[id].name, - model: xc.simDeviceTypes[id].model, - supportsWatch: xc.simDeviceTypes[id].supportsWatch - }; - } - }); - - Object.keys(xc.simRuntimes).forEach(function (id) { - if (typeRE.test(id)) { - if (!runtimeLookup[id]) { - runtimeLookup[id] = { - name: xc.simRuntimes[id].name, - version: xc.simRuntimes[id].version, - simctl: xc.executables.simctl, - simulator: xc.executables[/watch/i.test(xc.simRuntimes[id].name) ? 'watchsimulator' : 'simulator'], - xcodeIds: [] - }; - } - if (runtimeLookup[id].xcodeIds.indexOf(xcodeId) === -1) { - runtimeLookup[id].xcodeIds.push(xcodeId); - } - } - }); - }); - - list(options, function (err, info) { - if (err) { - return callback(err); - } - - // find the missing global devicetypes and runtimes from simctl - info.devicetypes.forEach(function (deviceType) { - if (!deviceTypeLookup[deviceType.identifier]) { - deviceTypeLookup[deviceType.identifier] = { - name: deviceType.name, - model: deviceType.model, - supportsWatch: deviceType.supportsWatch - }; - } - }); - - info.runtimes.forEach(function (runtime) { - if (typeRE.test(runtime.identifier)) { - var rt = runtimeLookup[runtime.identifier]; - - if (!rt) { - rt = runtimeLookup[runtime.identifier] = { - name: runtime.name, - version: runtime.version, - simctl: null, - simulator: null, - xcodeIds: [] - }; - } - - xcodeIds.forEach(function (xcodeId) { - var xc = xcodeInfo.xcode[xcodeId]; - if (xc.simRuntimes[runtime.version]) { - if (rt.xcodeIds.indexOf(xcodeId) === -1) { - rt.xcodeIds.push(xcodeId); - } - if (!rt.simctl) { - rt.simctl = xc.executables.simctl; - } - if (!rt.simulator) { - rt.simulator = xc.executables[/watch/i.test(xc.simRuntimes[runtime.version].name) ? 'watchsimulator' : 'simulator']; - } - } - }); - - // if we didn't find a valid Xcode for this runtime, then remove it - if (!rt.simctl || !rt.simulator) { - delete runtimeLookup[runtime.identifier]; - } - } - }); - - var coreSimDir = appc.fs.resolvePath('~/Library/Developer/CoreSimulator/Devices'); - var familyRE = /^(iphone|ipad|ios|watch|watchos)$/; - - Object.keys(info.devices).forEach(function (type) { - info.devices[type].forEach(function (device) { - var plist = readPlist(path.join(coreSimDir, device.udid, 'device.plist')); - if (!plist) { - return; - } - - var deviceType = deviceTypeLookup[plist.deviceType]; - var runtime = runtimeLookup[plist.runtime]; - - if (!deviceType || !runtime) { - // we have no idea what this simulator is nor are there any Xcodes - // capable of running it - return; - } - - var family = deviceType.model && deviceType.model.replace(/[\W0-9]/g, '').toLowerCase(); - if (!family || !familyRE.test(family)) { - // unsupported, could be an Apple TV device - return; - } - var simType = family === 'iphone' || family === 'ipad' ? 'ios' : 'watchos'; - - // This code finds the sim runtime and builds the list of associated - // iOS SDKs which may be different based which Xcode's simctl is run. - // For example, sim runtime 10.3 is associated with iOS 10.3 and 10.3.1. - // Because of this, we define the same simulator for each associated - // iOS SDK version. - runtime.versions = [ runtime.version ]; - if (runtimeLookup[plist.runtime]) { - var ver = runtimeLookup[plist.runtime].version; - if (ver !== runtime.version) { - runtime.versions.push(ver); - } - } - - // for each runtime iOS SDK version, define the simulator - runtime.versions.forEach(function (runtimeVersion) { - var sim; - - results.simulators[simType][runtimeVersion] || (results.simulators[simType][runtimeVersion] = []); - results.simulators[simType][runtimeVersion].some(function (s) { - if (s.udid === plist.UDID) { - sim = s; - return true; - } - }); - - if (!sim) { - results.simulators[simType][runtimeVersion].push(sim = { - udid: plist.UDID, - name: plist.name, - version: runtimeVersion, - type: simType, - simctl: runtime.simctl, - simulator: runtime.simulator, - - deviceType: plist.deviceType, - deviceName: deviceType.name, - deviceDir: path.join(coreSimDir, device.udid), - model: deviceType.model, - family: family, - supportsXcode: {}, - supportsWatch: {}, - watchCompanion: {}, - - runtime: plist.runtime, - runtimeName: runtime.name, - - systemLog: appc.fs.resolvePath('~/Library/Logs/CoreSimulator/' + device.udid + '/system.log'), - dataDir: path.join(coreSimDir, device.udid, 'data') - }); - } - - runtime.xcodeIds.forEach(function (xcodeId) { - sim.supportsXcode[xcodeId] = true; - if (simType === 'ios') { - sim.supportsWatch[xcodeId] = deviceType.supportsWatch; - } - }); - }); - }); - }); - - // this is pretty nasty, but necessary... - // basically this will populate the watchCompanion property for each iOS Simulator - // so that it makes choosing simulator pairs way easier - Object.keys(results.simulators.ios).forEach(function (iosSimVersion) { // 13.0 - results.simulators.ios[iosSimVersion].forEach(function (iosSim) { // sim handle - Object.keys(iosSim.supportsWatch).forEach(function (xcodeId) { // 11.0:11A419c - if (iosSim.supportsWatch[xcodeId]) { - var xc = xcodeInfo.xcode[xcodeId]; - Object.keys(xc.simDevicePairs).forEach(function (iOSRange) { // 13.x - if (appc.version.satisfies(iosSim.version, iOSRange)) { - Object.keys(xc.simDevicePairs[iOSRange]).forEach(function (watchOSRange) { // 6.x - if (xc.simDevicePairs[iOSRange][watchOSRange]) { - Object.keys(results.simulators.watchos).forEach(function (watchosSDK) { // 6.x - if (appc.version.satisfies(watchosSDK, watchOSRange)) { - results.simulators.watchos[watchosSDK].forEach(function (watchSim) { // watch sim handle - if (appc.version.satisfies(watchSim.version, watchOSRange)) { - iosSim.watchCompanion[xcodeId] || (iosSim.watchCompanion[xcodeId] = {}); - iosSim.watchCompanion[xcodeId][watchSim.udid] = watchSim; - } - }); - } - }); - } - }); - } - }); - } - }); - }); - }); - - // sort the simulators - ['ios', 'watchos'].forEach(function (type) { - Object.keys(results.simulators[type]).forEach(function (ver) { - results.simulators[type][ver].sort(compareSims); - }); - }); - - // the cache must be a clean copy that we'll clone for subsequent detect() calls - // because we can't allow the cache to be modified by reference - cache = JSON.parse(JSON.stringify(results)); - - emitter.emit('detected', results); - callback(null, results); - }); - }); - }); -}; - -/** - * Finds the specified app's bundle identifier. If a watch app name is specified, - * then it will attempt to find the watch app's bundle identifier. - * - * @param {String} appPath - The path to the compiled .app directory - * @param {String|Boolean} [watchAppName] - The name of the watch app to find. If value is true, then it will choose the first watch app. - * - * @returns {Object} An object containing the app's id and if `watchAppName` is specified, the watch app's id, OS version, and min OS version. - */ -function getAppInfo(appPath, watchAppName) { - // validate the specified appPath - if (!fs.existsSync(appPath)) { - throw new Error(__('App path does not exist: ' + appPath)); - } - - // get the app's id - var infoPlist = path.join(appPath, 'Info.plist'); - if (!fs.existsSync(infoPlist)) { - throw new Error(__('Unable to find Info.plist in root of specified app path: ' + infoPlist)); - } - - var plist = readPlist(infoPlist); - if (!plist || !plist.CFBundleIdentifier) { - throw new Error(__('Failed to parse app\'s Info.plist: ' + infoPlist)); - } - - var results = { - appId: plist.CFBundleIdentifier, - appName: path.basename(appPath).replace(/\.app$/, '') - }; - - if (watchAppName) { - // look for WatchKit v1 apps - var pluginsDir = path.join(appPath, 'PlugIns'); - fs.existsSync(pluginsDir) && fs.readdirSync(pluginsDir).some(function (name) { - var extDir = path.join(pluginsDir, name); - if (fs.existsSync(extDir) && fs.statSync(extDir).isDirectory() && /\.appex$/.test(name)) { - return fs.readdirSync(extDir).some(function (name) { - var appDir = path.join(extDir, name); - if (fs.existsSync(appDir) && fs.statSync(appDir).isDirectory() && /\.app$/.test(name)) { - var plist = readPlist(path.join(appDir, 'Info.plist')); - if (plist && plist.WKWatchKitApp && (typeof watchAppName !== 'string' || fs.existsSync(path.join(appDir, watchAppName)))) { - results.watchAppName = path.basename(appDir).replace(/\.app$/, ''); - results.watchAppId = plist.CFBundleIdentifier; - results.watchOSVersion = '1.0'; - results.watchMinOSVersion = '1.0'; - return true; - } - } - }); - } - }); - - if (!results.watchAppId) { - // look for WatchKit v2 apps - var watchDir = path.join(appPath, 'Watch'); - fs.existsSync(watchDir) && fs.readdirSync(watchDir).some(function (name) { - var plist = readPlist(path.join(watchDir, name, 'Info.plist')); - if (plist && (plist.DTPlatformName === 'watchos' || plist.WKWatchKitApp) && (typeof watchAppName !== 'string' || fs.existsSync(path.join(watchDir, watchAppName)))) { - results.watchAppName = name.replace(/\.app$/, ''); - results.watchAppId = plist.CFBundleIdentifier; - results.watchOSVersion = plist.DTPlatformVersion; - results.watchMinOSVersion = plist.MinimumOSVersion; - return true; - } - }); - } - - if (!results.watchAppId) { - if (typeof watchAppName === 'string') { - throw new Error(__('Unable to find a watch app named "%s".', watchAppName)); - } else { - throw new Error(__('The launch watch app flag was set, however unable to find a watch app.')); - } - } - } - - return results; -} - -/** - * Finds a iOS Simulator and/or Watch Simulator as well as the supported Xcode based on the specified options. - * - * @param {Object} [options] - An object containing various settings. - * @param {String} [options.appBeingInstalled] - The path to the iOS app to install after launching the iOS Simulator. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects Xcode and all simulators. - * @param {Function} [options.logger] - A function to log debug messages to. - * @param {String} [options.iosVersion] - The iOS version of the app so that ioslib picks the appropriate Xcode. - * @param {String} [options.minIosVersion] - The minimum iOS SDK to detect. - * @param {String} [options.minWatchosVersion] - The minimum watchOS SDK to detect. - * @param {String|Array} [options.searchPath] - One or more path to scan for Xcode installations. - * @param {String|SimHandle} simHandleOrUDID - A iOS sim handle or the UDID of the iOS Simulator to launch or null if you want ioslib to pick one. - * @param {String} [options.simType=iphone] - The type of simulator to launch. Must be either "iphone" or "ipad". Only applicable when udid is not specified. - * @param {String} [options.simVersion] - The iOS version to boot. Defaults to the most recent version. - * @param {String} [options.supportedVersions] - A string with a version number or range to check if an Xcode install is supported. - * @param {Boolean} [options.watchAppBeingInstalled] - The id of the watch app. Required in order to find a watch simulator. - * @param {String} [options.watchHandleOrUDID] - A watch sim handle or UDID of the Watch Simulator to launch or null if your app has a watch app and you want ioslib to pick one. - * @param {String} [options.watchMinOSVersion] - The min Watch OS version supported by the specified watch app id. - * @param {Function} callback(err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) - A function to call with the simulators found. - */ -function findSimulators(options, callback) { - if (typeof options === 'function') { - callback = options; - options = {}; - } else if (typeof options !== 'object') { - options = {}; - } - typeof callback === 'function' || (callback = function () {}); - - // detect xcodes - xcode.detect(options, function (err, xcodeInfo) { - if (err) { - return callback(err); - } - - function compareXcodes(a, b) { - var v1 = xcodeInfo.xcode[a].version; - var v2 = xcodeInfo.xcode[b].version; - if (options.iosVersion && appc.version.eq(options.iosVersion, v1)) { - return -1; - } - if (options.iosVersion && appc.version.eq(options.iosVersion, v2)) { - return 1; - } - if (xcodeInfo.xcode[a].selected) { - return -1; - } - if (xcodeInfo.xcode[b].selected) { - return 1; - } - return appc.version.gt(v1, v2) ? -1 : appc.version.eq(v1, v2) ? 0 : 1; - } - - // find an Xcode installation that matches the iOS SDK or fall back to the selected Xcode or the latest - var xcodeIds = Object - .keys(xcodeInfo.xcode) - .filter(function (id) { - if (!xcodeInfo.xcode[id].supported) { - return false; - } - if (options.iosVersion && !xcodeInfo.xcode[id].sdks.some(function (ver) { return appc.version.eq(ver, options.iosVersion); })) { - return false; - } - return true; - }) - .sort(compareXcodes); - if (!xcodeIds.length) { - if (options.iosVersion) { - return callback(new Error(__('Unable to find any Xcode installations that supports iOS SDK %s.', options.iosVersion))); - } else { - return callback(new Error(__('Unable to find any supported Xcode installations. Please install the latest Xcode.'))); - } - } - var xcodeId = xcodeIds[0]; - var selectedXcode = xcodeInfo.xcode[xcodeId]; - - if (!selectedXcode.eulaAccepted) { - var eulaErr = new Error(__(`Xcode ${selectedXcode.version} end-user license agreement has not been accepted. Please launch "${selectedXcode.xcodeapp}" or run "sudo xcodebuild -license" to accept the license`)); - return callback(eulaErr); - } - - // detect the simulators - detect(options, function (err, simInfo) { - if (err) { - return callback(err); - } - - var logger = typeof options.logger === 'function' ? options.logger : function () {}, - simHandle = options.simHandleOrUDID instanceof SimHandle ? options.simHandleOrUDID : null, - watchSimHandle = options.watchHandleOrUDID instanceof SimHandle ? options.watchHandleOrUDID : null; - - if (options.simHandleOrUDID) { - // validate the udid - if (!(options.simHandleOrUDID instanceof SimHandle)) { - var vers = Object.keys(simInfo.simulators.ios); - - logger(__('Validating iOS Simulator UDID %s', options.simHandleOrUDID)); - - for (var i = 0, l = vers.length; !simHandle && i < l; i++) { - var sims = simInfo.simulators.ios[vers[i]]; - for (var j = 0, k = sims.length; j < k; j++) { - if (sims[j].udid === options.simHandleOrUDID) { - logger(__('Found iOS Simulator UDID %s', options.simHandleOrUDID)); - simHandle = new SimHandle(sims[j]); - break; - } - } - } - - if (!simHandle) { - return callback(new Error(__('Unable to find an iOS Simulator with the UDID "%s".', options.simHandleOrUDID))); - } - } - - if (options.minIosVersion && appc.version.lt(simHandle.version, options.minIosVersion)) { - return callback(new Error(__('The selected iOS %s Simulator is less than the minimum iOS version %s.', simHandle.version, options.minIosVersion))); - } - - if (options.watchAppBeingInstalled) { - var watchXcodeId = Object - .keys(simHandle.watchCompanion) - .filter(function (xcodeId) { - return xcodeInfo.xcode[xcodeId].supported; - }) - .sort(compareXcodes) - .pop(); - - if (!watchXcodeId) { - return callback(new Error(__('Unable to find any Watch Simulators that can be paired with the specified iOS Simulator %s.', simHandle.udid))); - } - - if (!options.watchHandleOrUDID) { - logger(__('Watch app present, autoselecting a Watch Simulator')); - - var companions = simHandle.watchCompanion[watchXcodeId]; - var companionUDID = Object.keys(companions) - .sort(function (a, b) { - return companions[a].model.localeCompare(companions[b].model); - }) - .pop(); - - watchSimHandle = new SimHandle(companions[companionUDID]); - - if (!watchSimHandle) { - return callback(new Error(__('Specified iOS Simulator "%s" does not support Watch apps.', options.simHandleOrUDID))); - } - } else if (!(options.watchHandleOrUDID instanceof SimHandle)) { - logger(__('Watch app present, validating Watch Simulator UDID %s', options.watchHandleOrUDID)); - - Object.keys(simInfo.simulators.watchos).some(function (ver) { - return simInfo.simulators.watchos[ver].some(function (sim) { - if (sim.udid === options.watchHandleOrUDID) { - logger(__('Found Watch Simulator UDID %s', options.watchHandleOrUDID)); - watchSimHandle = new SimHandle(sim); - return true; - } - }); - }); - - if (!watchSimHandle) { - return callback(new Error(__('Unable to find a Watch Simulator with the UDID "%s".', options.watchHandleOrUDID))); - } - } - } - - // double check - if (watchSimHandle && !simHandle.watchCompanion[watchXcodeId][watchSimHandle.udid]) { - return callback(new Error(__('Specified Watch Simulator "%s" is not compatible with iOS Simulator "%s".', watchSimHandle.udid, simHandle.udid))); - } - - if (options.watchAppBeingInstalled && !options.watchHandleOrUDID && !watchSimHandle) { - if (options.watchMinOSVersion) { - return callback(new Error(__('Unable to find a Watch Simulator that supports watchOS %s.', options.watchMinOSVersion))); - } else { - return callback(new Error(__('Unable to find a Watch Simulator.'))); - } - } - - logger(__('Selected iOS Simulator: %s', simHandle.name)); - logger(__(' UDID = %s', simHandle.udid)); - logger(__(' iOS = %s', simHandle.version)); - if (watchSimHandle) { - if (options.watchAppBeingInstalled && options.watchHandleOrUDID) { - logger(__('Selected watchOS Simulator: %s', watchSimHandle.name)); - } else { - logger(__('Autoselected watchOS Simulator: %s', watchSimHandle.name)); - } - logger(__(' UDID = %s', watchSimHandle.udid)); - logger(__(' watchOS = %s', watchSimHandle.version)); - } - logger(__('Autoselected Xcode: %s', selectedXcode.version)); - } else { - logger(__('No iOS Simulator UDID specified, searching for best match')); - - if (options.watchAppBeingInstalled && options.watchHandleOrUDID) { - logger(__('Validating Watch Simulator UDID %s', options.watchHandleOrUDID)); - Object.keys(simInfo.simulators.watchos).some(function (ver) { - return simInfo.simulators.watchos[ver].some(function (sim) { - if (sim.udid === options.watchHandleOrUDID) { - watchSimHandle = new SimHandle(sim); - logger(__('Found Watch Simulator UDID %s', options.watchHandleOrUDID)); - return true; - } - }); - }); - - if (!watchSimHandle) { - return callback(new Error(__('Unable to find a Watch Simulator with the UDID "%s".', options.watchHandleOrUDID))); - } - } - - // pick one - logger(__('Scanning Xcodes: %s', xcodeIds.join(' '))); - - // loop through xcodes - for (var i = 0; !simHandle && i < xcodeIds.length; i++) { - var xc = xcodeInfo.xcode[xcodeIds[i]]; - - var simVersMap = {}; - Object.keys(simInfo.simulators.ios) - .forEach(function (ver) { - Object.keys(xc.simDevicePairs) - .some(function (iosRange) { - if (appc.version.satisfies(ver, iosRange)) { - simVersMap[ver] = xc.simDevicePairs[iosRange]; - return true; - } - }); - }); - var simVers = appc.version.sort(Object.keys(simVersMap)).reverse(); - - logger(__('Scanning Xcode %s sims: %s', xcodeIds[i], simVers.join(', '))); - - // loop through each xcode simulators - for (var j = 0; !simHandle && j < simVers.length; j++) { - if (!options.minIosVersion || appc.version.gte(simVers[j], options.minIosVersion)) { - var sims = simInfo.simulators.ios[simVers[j]]; - - sims.sort(compareSims).reverse(); - - // loop through each simulator - for (var k = 0; !simHandle && k < sims.length; k++) { - if (options.simType && sims[k].family !== options.simType) { - continue; - } - - // if we're installing a watch extension, make sure we pick a simulator that supports the watch - if (options.watchAppBeingInstalled) { - if (watchSimHandle) { - Object.keys(sims[k].supportsWatch).forEach(function (xcodeVer) { - if (watchSimHandle.supportsXcode[xcodeVer]) { - selectedXcode = xcodeInfo.xcode[xcodeVer]; - simHandle = new SimHandle(sims[k]); - return true; - } - }); - } else if (sims[k].supportsWatch[xcodeIds[i]]) { - // make sure this version of Xcode has a watch simulator that supports the watch app version - Object.keys(simInfo.simulators.watchos).some(function (watchosVer) { - return Object.keys(simVersMap[simVers[j]]) - .some(function (watchosRange) { // 4.x, 5.x, etc - if (appc.version.satisfies(watchosVer, watchosRange) && appc.version.gte(watchosVer, options.watchMinOSVersion)) { - simHandle = new SimHandle(sims[k]); - selectedXcode = xcodeInfo.xcode[xcodeIds[i]]; - const watchSim = simInfo.simulators.watchos[watchosVer].sort(compareSims).reverse()[0]; - watchSimHandle = new SimHandle(watchSim); - return true; - } - }); - }); - } - } else { - // no watch app - logger(__('No watch app being installed, so picking first Simulator')); - simHandle = new SimHandle(sims[k]); - - // fallback to the newest supported Xcode version - xcodeIds.some(function (id) { - if (simHandle.supportsXcode[id]) { - selectedXcode = xcodeInfo.xcode[id]; - return true; - } - }); - } - } - } - } - } - - if (!simHandle) { - const helpText = '\n\nPlease open Xcode, navigate to "Window > Devices and Simulators" and create a new Simulator with your preferred configuration.'; - - // user experience! - if (options.simVersion) { - return callback(new Error(__(`Unable to find an iOS Simulator running iOS %s. ${helpText}`, options.simVersion))); - } else { - return callback(new Error(__(`Unable to find an iOS Simulator. ${helpText}`))); - } - } else if (options.watchAppBeingInstalled && !watchSimHandle) { - return callback(new Error(__('Unable to find a watchOS Simulator that supports watchOS %s', options.watchMinOSVersion))); - } - - logger(__('Autoselected iOS Simulator: %s', simHandle.name)); - logger(__(' UDID = %s', simHandle.udid)); - logger(__(' iOS = %s', simHandle.version)); - if (watchSimHandle) { - if (options.watchAppBeingInstalled && options.watchHandleOrUDID) { - logger(__('Selected watchOS Simulator: %s', watchSimHandle.name)); - } else { - logger(__('Autoselected watchOS Simulator: %s', watchSimHandle.name)); - } - logger(__(' UDID = %s', watchSimHandle.udid)); - logger(__(' watchOS = %s', watchSimHandle.version)); - } - logger(__('Autoselected Xcode: %s', selectedXcode.version)); - } - - callback(null, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo); - }); - }); -} - -/** - * Launches the specified iOS Simulator or picks one automatically. - * - * @param {String|SimHandle} simHandleOrUDID - A iOS sim handle or the UDID of the iOS Simulator to launch or null if you want ioslib to pick one. - * @param {Object} [options] - An object containing various settings. - * @param {String} [options.appPath] - The path to the iOS app to install after launching the iOS Simulator. - * @param {Boolean} [options.autoExit=false] - When "appPath" has been specified, causes the iOS Simulator to exit when the autoExitToken has been emitted to the log output. - * @param {String} [options.autoExitToken=AUTO_EXIT] - A string to watch for to know when to quit the iOS simulator when "appPath" has been specified. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects Xcode and all simulators. - * @param {Boolean} [options.focus=true] - Focus the iOS Simulator after launching. Overrides the "hide" option. - * @param {Boolean} [options.hide=false] - Hide the iOS Simulator after launching. Useful for testing. Ignored if "focus" option is set to true. - * @param {String} [options.iosVersion] - The iOS version of the app so that ioslib picks the appropriate Xcode. - * @param {Boolean} [options.killIfRunning] - Kill the iOS Simulator if already running. - * @param {String} [options.launchBundleId] - Launches a specific app when the simulator loads. When installing an app, defaults to the app's id unless `launchWatchApp` is set to true. - * @param {Boolean} [options.launchWatchApp=false] - When true, launches the specified app's watch app on an external display and the main app. - * @param {Boolean} [options.launchWatchAppOnly=false] - When true, launches the specified app's watch app on an external display and not the main app. - * @param {String} [options.logFilename] - The name of the log file to search for in the iOS Simulator's "Documents" folder. This file is created after the app is started. - * @param {Number} [options.logServerPort] - The TCP port to connect to get log messages. - * @param {String} [options.minIosVersion] - The minimum iOS SDK to detect. - * @param {String} [options.minWatchosVersion] - The minimum watchOS SDK to detect. - * @param {String|Array} [options.searchPath] - One or more path to scan for Xcode installations. - * @param {String} [options.simType=iphone] - The type of simulator to launch. Must be either "iphone" or "ipad". Only applicable when udid is not specified. - * @param {String} [options.simVersion] - The iOS version to boot. Defaults to the most recent version. - * @param {String} [options.supportedVersions] - A string with a version number or range to check if an Xcode install is supported. - * @param {Boolean} [options.uninstallApp=false] - When true and `appPath` is specified, uninstalls the app before installing the new app. If app is not installed already, it continues. - * @param {String} [options.watchAppName] - The name of the watch app to install. If omitted, automatically picks the watch app. - * @param {String} [options.watchHandleOrUDID] - A watch sim handle or the UDID of the Watch Simulator to launch or null if your app has a watch app and you want ioslib to pick one. - * @param {Function} [callback(err, simHandle)] - A function to call when the simulator has launched. - * - * @emits module:simulator#app-quit - * @emits module:simulator#app-started - * @emits module:simulator#error - * @emits module:simulator#exit - * @emits module:simulator#launched - * @emits module:simulator#log - * @emits module:simulator#log-debug - * @emits module:simulator#log-error - * @emits module:simulator#log-file - * @emits module:simulator#log-raw - * - * @returns {Handle} - */ -function launch(simHandleOrUDID, options, callback) { - return magik(options, callback, function (emitter, options, callback) { - emitter.stop = function () {}; // for stopping logging - - if (!options.appPath && (options.launchWatchApp || options.launchWatchAppOnly)) { - var err = new Error( - options.launchWatchAppOnly - ? __('You must specify an appPath when launchWatchApp is true.') - : __('You must specify an appPath when launchWatchAppOnly is true.') - ); - emitter.emit('error', err); - return callback(err); - } - - if (options.logServerPort && (typeof options.logServerPort !== 'number' || options.logServerPort < 1 || options.logServerPort > 65535)) { - var err = new Error(__('Log server port must be a number between 1 and 65535')); - emitter.emit('error', err); - return callback(err); - } - - var appId, - watchAppId, - findSimOpts = appc.util.mix({ - simHandleOrUDID: simHandleOrUDID, - logger: function (msg) { - emitter.emit('log-debug', msg); - } - }, options); - - if (options.appPath) { - findSimOpts.appBeingInstalled = true; - try { - var ids = getAppInfo(options.appPath, options.watchAppName || !!options.launchWatchApp || !!options.launchWatchAppOnly); - if (!options.launchBundleId) { - appId = ids.appId; - } - if (ids.watchAppId) { - watchAppId = ids.watchAppId; - if (findSimOpts) { - findSimOpts.watchAppBeingInstalled = true; - findSimOpts.watchMinOSVersion = ids.watchMinOSVersion; - } - emitter.emit('log-debug', __('Found watchOS %s app: %s', ids.watchOSVersion, watchAppId)); - } - } catch (ex) { - emitter.emit('error', ex); - return callback(ex); - } - } else if (options.launchBundleId) { - appId = options.launchBundleId; - } - - findSimulators(findSimOpts, function (err, simHandle, watchSimHandle, selectedXcode, detectedSimInfo) { - if (err) { - emitter.emit('error', err); - return callback(err); - } - - if (!selectedXcode.eulaAccepted) { - var eulaErr = new Error(__('Xcode must be launched and the EULA must be accepted before a simulator can be launched.')); - emitter.emit('error', eulaErr); - return callback(eulaErr); - } - - var crashFileRegExp, - existingCrashes = getCrashes(), - findLogTimer = null, - logFileTail; - - if (options.appPath) { - crashFileRegExp = new RegExp('^' + ids.appName + '_\\d{4}\\-\\d{2}\\-\\d{2}\\-\\d{6}_.*\.crash$'), - simHandle.appName = ids.appName; - watchSimHandle && (watchSimHandle.appName = ids.watchAppName); - } - - // sometimes the simulator doesn't remove old log files in which case we get - // our logging jacked - we need to remove them before running the simulator - if (options.logFilename && simHandle.dataDir) { - (function walk(dir) { - var logFile = path.join(dir, 'Documents', options.logFilename); - if (fs.existsSync(logFile)) { - emitter.emit('log-debug', __('Removing old log file: %s', logFile)); - fs.unlinkSync(logFile); - return true; - } - - if (fs.existsSync(dir)) { - return fs.readdirSync(dir).some(function (name) { - var subdir = path.join(dir, name); - - if (!fs.existsSync(subdir)) { - return; - } - - var subdirStats = fs.lstatSync(subdir); - if (subdirStats.isDirectory() && !subdirStats.isSymbolicLink()) { - return walk(subdir); - } - }); - } - }(simHandle.dataDir)); - } - - var cleanupOnce = false; - function cleanupAndEmit(evt) { - if (!cleanupOnce) { - cleanupOnce = true; - } - - simHandle.systemLogTail && simHandle.systemLogTail.unwatch(); - simHandle.systemLogTail = null; - - if (watchSimHandle) { - watchSimHandle.systemLogTail && watchSimHandle.systemLogTail.unwatch(); - watchSimHandle.systemLogTail = null; - } - - emitter.emit.apply(emitter, arguments); - } - - function getCrashes() { - if (crashFileRegExp && fs.existsSync(detectedSimInfo.simulators.crashDir)) { - return fs.readdirSync(detectedSimInfo.simulators.crashDir).filter(function (n) { return crashFileRegExp.test(n); }); - } - return []; - } - - function checkIfCrashed() { - var crashes = getCrashes(), - diffCrashes = crashes - .filter(function (file) { - return existingCrashes.indexOf(file) === -1; - }) - .map(function (file) { - return path.join(detectedSimInfo.simulators.crashDir, file); - }) - .sort(); - - if (diffCrashes.length) { - // when a crash occurs, we need to provide the plist crash information as a result object - diffCrashes.forEach(function (crashFile) { - emitter.emit('log-debug', __('Detected crash file: %s', crashFile)); - }); - cleanupAndEmit('app-quit', new SimulatorCrash(diffCrashes)); - return true; - } - - return false; - } - - function startSimulator(handle) { - var booted = false, - simEmitter = new EventEmitter; - - function simExited(code, signal) { - if (code || code === 0) { - emitter.emit('log-debug', __('%s Simulator has exited with code %s', handle.name, code)); - } else { - emitter.emit('log-debug', __('%s Simulator has exited', handle.name)); - } - handle.systemLogTail && handle.systemLogTail.unwatch(); - handle.systemLogTail = null; - simEmitter.emit('stop', code); - } - - async.series([ - function checkIfRunningAndBooted(next) { - emitter.emit('log-debug', __('Checking if the simulator %s is already running', handle.simulator)); - - isSimulatorRunning(handle.simulator, function (err, pid, udid) { - if (err) { - emitter.emit('log-debug', __('Failed to check if the simulator is running: %s', err.message || err.toString())); - return next(err); - } - - if (!pid) { - emitter.emit('log-debug', __('Simulator is not running')); - return next(); - } - - emitter.emit('log-debug', __('Simulator is running (pid %s)', pid)); - - // if Xcode 8 or older and the udid doesn't match the running version, then we need to kill the simulator before continuing - if (appc.version.lt(selectedXcode.version, '9.0') && udid !== handle.udid) { - emitter.emit('log-debug', __('%s Simulator is running, but not the UDID we want, stopping simulator', handle.name)); - stop(handle, next); - return; - } - - simctl.getSim({ - simctl: handle.simctl, - udid: handle.udid - }, function (err, sim) { - if (err) { - return next(err); - } - - if (!sim) { - // this should never happen - return next(new Error(__('Unable to find simulator %s', handle.udid))); - } - - function waitToBoot() { - emitter.emit('log-debug', __('Waiting for simulator to boot...')); - simctl.waitUntilBooted({ simctl: handle.simctl, udid: handle.udid, timeout: 30000 }, function (err, _booted) { - if (err && err.code !== 666) { - emitter.emit('log-debug', __('Error while waiting for simulator to boot: %s', err.message || err.toString())); - return next(err); - } - - booted = _booted; - - emitter.emit('log-debug', booted ? __('Simulator is booted!') : __('Simulator is NOT booted!')); - - if (err || !booted) { - emitter.emit('log-debug', __('%s Simulator is running, but not in a booted state, stopping simulator', handle.name)); - stop(handle, next); - return; - } - - emitter.emit('log-debug', __('%s Simulator already running with the correct UDID', handle.name)); - - // because we didn't start the simulator, we have no child process to - // listen for when it exits, so we need to monitor it ourselves - setTimeout(function check() { - appc.subprocess.run('ps', ['-p', pid], function (code, out, err) { - if (code) { - simExited(); - } else { - setTimeout(check, 1000); - } - }); - }, 1000); - - next(); - }); - } - - if (appc.version.lt(selectedXcode.version, '9.0')) { - if (/^shutdown/i.test(sim.state)) { - // the udid that is supposed to be running isn't, kill the simulator - emitter.emit('log-debug', __('%s Simulator is running, but UDID %s is shut down, stopping simulator', handle.name, handle.udid)); - stop(handle, next); - return; - } - - return waitToBoot(); - } - - // Xcode 9+ path - - if (/^booted/i.test(sim.state)) { - return waitToBoot(); - } - - emitter.emit('log-debug', __('Getting all running simulator runtimes')); - getRunningSimulatorDevices(function (err, sims) { - if (err) { - return next(err); - } - - if (sims.some(function (s) { return s.udid === handle.udid; } )) { - return waitToBoot(); - } - - simctl.boot({ simctl: handle.simctl, udid: handle.udid }, function (err) { - if (err) { - return next(err); - } - waitToBoot(); - }); - }); - }); - }); - }, - - function tailSystemLog(next) { - if (!handle.systemLog) { - return next(); - } - - // make sure the system log exists - if (!fs.existsSync(handle.systemLog)) { - var dir = path.dirname(handle.systemLog); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - fs.writeFileSync(handle.systemLog, ''); - } - - var systemLogRegExp = new RegExp(' ' + handle.appName + '\\[(\\d+)\\]: (.*)'), - watchLogMsgRegExp = handle.type === 'ios' && watchAppId ? new RegExp('companionappd\\[(\\d+)\\]: \\((.+)\\) WatchKit: application \\(' + watchAppId + '\\),?\w*(.*)') : null, - xcode73WatchLogMsgRegExp = handle.type === 'ios' && watchAppId ? new RegExp('Installation of ' + watchAppId + ' (.*).') : null, - watchInstallRegExp = /install status: (\d+), message: (.*)$/, - successRegExp = /succeeded|success/i, - crash1RegExp = /^\*\*\* Terminating app/, // objective-c issue - crash2RegExp = new RegExp(' (SpringBoard|Carousel)\\[(\\d+)\\]: Application \'UIKitApplication:' + appId + '\\[(\\w+)\\]\' crashed'), // c++ issue - crash3RegExp = new RegExp('launchd_sim\\[(\\d+)\\] \\(UIKitApplication:' + appId + '\\[(\\w+)\\]'), // killed by ios or seg fault - autoExitToken = options.autoExitToken || 'AUTO_EXIT', - detectedCrash = false; - - emitter.emit('log-debug', __('Tailing %s Simulator system log: %s', handle.name, handle.systemLog)); - - // tail the simulator's system log. - // as we do this, we want to look for specific things like the watch being installed, - // and the app starting. - handle.systemLogTail = new Tail(handle.systemLog, '\n', { interval: 500 }, /* fromBeginning */ false ); - handle.systemLogTail.on('line', function (line) { - var m; - emitter.emit('log-raw', line, handle); - - if (!booted || !handle.installing) { - return; - } - - if (xcode73WatchLogMsgRegExp) { - if (m = line.match(xcode73WatchLogMsgRegExp)) { - if (m[1] === 'acknowledged') { - emitter.emit('log-debug', __('Watch App installed successfully!')); - handle.installed = true; - } else { - simEmitter.emit('error', new Error(__('Watch App installation failure'))); - } - return; - } - } - - if (watchLogMsgRegExp) { - if (m = line.match(watchLogMsgRegExp)) { - // refine our regex now that we have the pid - watchLogMsgRegExp = new RegExp('companionappd\\[(' + m[1] + ')\\]: \\((.+)\\) WatchKit: (.*)$'); - - var type = m[2].trim().toLowerCase(), - msg = m[3].trim(); - - if (type === 'note') { - // did the watch app install succeed? - if (!handle.installed && (m = msg.match(watchInstallRegExp)) && parseInt(m[1]) === 2 && successRegExp.test(m[2])) { - emitter.emit('log-debug', __('Watch App installed successfully!')); - handle.installed = true; - } - } else if (type === 'error') { - // did the watch app install fail? - simEmitter.emit('error', new Error(__('Watch App installation failure: %s', msg))); - } - - return; - } - } - - if (handle.appStarted) { - m = line.match(systemLogRegExp); - - if (m) { - if (handle.type === 'watchos' && m[2].indexOf('(Error) WatchKit:') !== -1) { - emitter.emit('log-error', m[2], handle); - return; - } - - // if we have a log server port and we're currently the iOS Simulator, - // then ignore all messages in the system.log in favor of the log server - if (!options.logServerPort || handle.type === 'watchos') { - emitter.emit('log', m[2], handle); - } - - if (options.autoExit && m[2].indexOf(autoExitToken) !== -1) { - emitter.emit('log-debug', __('Found "%s" token, stopping simulator', autoExitToken)); - // stopping the simulator will cause the "close" event to fire - stop(handle, function () { - cleanupAndEmit('app-quit'); - }); - return; - } - } - - // check for an iPhone app crash - if (!detectedCrash && handle.type === 'ios' && ((m && crash1RegExp.test(m[2])) || crash2RegExp.test(line) || crash3RegExp.test(line))) { - detectedCrash = true; - // wait 1 second for the potential crash log to be written - setTimeout(function () { - // did we crash? - if (!checkIfCrashed()) { - // well something happened, exit - emitter.emit('log-debug', __('Detected crash, but no crash file')); - cleanupAndEmit('app-quit'); - } - }, 1000); - } - } - }); - handle.systemLogTail.watch(); - - next(); - }, - - function shutdownJustInCase(next) { - if (booted) { - return next(); - } - simctl.shutdown({ simctl: handle.simctl, udid: handle.udid }, next); - }, - - function startTheSimulator(next) { - if (booted) { - return next(); - } - - if (!handle.simulator) { - emitter.emit('log-debug', __('Cannot run simulator %s because executable was not found', handle.udid)); - return next(); - } - - // not running, start the simulator - emitter.emit('log-debug', __('Running: %s', handle.simulator + ' -CurrentDeviceUDID ' + handle.udid)); - - var child = spawn(handle.simulator, ['-CurrentDeviceUDID', handle.udid], { detached: true, stdio: 'ignore' }); - child.on('close', simExited); - child.unref(); - - // wait for the simulator to boot - async.whilst( - function (cb) { return cb(null, !booted); }, - function (cb) { - list(options, function (err, info) { - Object.keys(info.devices).some(function (type) { - return info.devices[type].some(function (sim) { - if (sim.udid === handle.udid) { - if (/^booted$/i.test(sim.state)) { - booted = true; - } - return true; - } - }); - }); - - if (booted) { - emitter.emit('log-debug', __('Simulator is booted')); - return cb(); - } - - setTimeout(function () { - cb(); - }, 250); - }); - }, - function (err) { - if (!err) { - emitter.emit('log-debug', __('%s Simulator started', handle.name)); - } - next(err); - } - ); - } - ], function (err) { - simEmitter.emit('start', err); - }); - - return simEmitter; - } - - async.series([ - function stopIosSim(next) { - // check if we need to stop the iOS simulator - if (options.killIfRunning !== false) { - emitter.emit('log-debug', __('Stopping iOS Simulator, if running')); - stop(simHandle, next); - } else { - next(); - } - }, - - function stopWatchSim(next) { - // check if we need to stop the watchOS simulator - if (watchSimHandle && options.killIfRunning !== false && appc.version.gte(watchSimHandle.version, '2.0')) { - emitter.emit('log-debug', __('Stopping watchOS Simulator, if running')); - stop(watchSimHandle, next); - } else { - next(); - } - }, - - function pairIosAndWatchSims(next) { - // check if we need to pair devices - if (!watchSimHandle) { - // no need to pair - return next(); - } - - if (appc.version.lt(watchSimHandle.version, '2.0')) { - // no need to pair - emitter.emit('log-debug', __('No need to pair WatchKit 1.x app')); - return next(); - } - - list(options, function (err, info) { - if (err) { - return next(err); - } - - var found = info.iosSimToWatchSimToPair[simHandle.udid] && info.iosSimToWatchSimToPair[simHandle.udid][watchSimHandle.udid]; - if (found && found.active) { - emitter.emit('log-debug', __('iOS and watchOS simulators already paired and active')); - return next(); - } - - if (found) { - emitter.emit('log-debug', __('Activating iOS and watchOS simulator pair: %s', found.udid)); - return simctl.activatePair({ simctl: simHandle.simctl, udid: found.udid }, next); - } - - // not paired... check if our watch sim is paired with another ios sim - var unpairFromIosSimUdid = null; - Object.keys(info.iosSimToWatchSimToPair).some(function (iosSimUdid) { - if (iosSimUdid !== simHandle.udid && info.iosSimToWatchSimToPair[iosSimUdid][watchSimHandle.udid]) { - unpairFromIosSimUdid = iosSimUdid; - return true; - } - }); - - if (!unpairFromIosSimUdid) { - // not paired, try to pair - emitter.emit('log-debug', __('Pairing iOS and watchOS simulator pair: %s -> %s', watchSimHandle.udid, simHandle.udid)); - return simctl.pairAndActivate({ simctl: simHandle.simctl, simUdid: simHandle.udid, watchSimUdid: watchSimHandle.udid }, next); - } - - // try to unpair - found = info.iosSimToWatchSimToPair[unpairFromIosSimUdid][watchSimHandle.udid]; - emitter.emit('log-debug', __('Unpairing iOS and watchOS simulator pair: %s', found.udid)); - simctl.unpair({ simctl: simHandle.simctl, udid: found.udid }, function (err) { - if (err && err.code !== 666) { - return next(err); - } - - if (!err) { - // unpair succeeded - emitter.emit('log-debug', __('Pairing iOS and watchOS simulator pair: %s -> %s', watchSimHandle.udid, simHandle.udid)); - return simctl.pairAndActivate({ simctl: simHandle.simctl, simUdid: simHandle.udid, watchSimUdid: watchSimHandle.udid }, next); - } - - // at this point we have a watch sim that we can't unpair from the ios sim, - // so we are going to have to create a new watch sim that matches what we want - - var candidates = detectedSimInfo.simulators.watchos[watchSimHandle.version].filter(function (sim) { - if (sim.udid !== watchSimHandle.udid && - sim.model === watchSimHandle.model && - info.devices[watchSimHandle.runtimeName].some(function (s) { - return s.udid === sim.udid; - }) - ) { - return true; - } - }); - - emitter.emit('log-debug', __('Unpair failed, checking %s alternative watch simulators', candidates.length)); - - var newWatchSimHandle = null; - - async.whilst( - function (cb) { return cb(null, candidates.length); }, - function (cb) { - newWatchSimHandle = new SimHandle(candidates.shift()); - - emitter.emit('log-debug', __('Trying watch sim %s [%s]', newWatchSimHandle.name, newWatchSimHandle.udid)); - emitter.emit('log-debug', __('Pairing iOS and watchOS simulator pair: %s -> %s', newWatchSimHandle.udid, simHandle.udid)); - simctl.pairAndActivate({ simctl: simHandle.simctl, simUdid: simHandle.udid, watchSimUdid: newWatchSimHandle.udid }, function (err) { - if (err) { - emitter.emit('log-debug', __('Pairing failed, trying another watch simulator')); - newWatchSimHandle = null; - } - cb(); - }); - }, - function () { - if (newWatchSimHandle !== null) { - watchSimHandle = newWatchSimHandle; - return next(); - } - - // create a new watch sim - var m = watchSimHandle.name.match(/^(.+ \[Titanium\])(?: (\d+))?$/); - var name = m ? (m[1] + ' ' + ((~~m[2] || 1) + 1)) : (watchSimHandle.name + ' [Titanium]'); - emitter.emit('log-debug', __('Creating a new watch simulator: %s', name)); - simctl.create({ - simctl: simHandle.simctl, - name: name, - deviceType: watchSimHandle.deviceType, - runtime: watchSimHandle.runtime - }, function (err, udid) { - detect({ bypassCache: true }, function (err, simInfo) { - if (err) { - return next(err); - } - - var found = false; - simInfo.simulators.watchos[watchSimHandle.version].some(function (sim) { - if (sim.udid === udid) { - watchSimHandle = new SimHandle(sim); - found = true; - return true; - } - }); - - if (!found) { - // this shouldn't happen, we just added it! - return next(new Error(__('Unable to find the watch simulator %s that was just created', udid))); - } - - simctl.pairAndActivate({ simctl: simHandle.simctl, simUdid: simHandle.udid, watchSimUdid: watchSimHandle.udid }, next); - }); - }); - } - ); - }); - }); - }, - - function startIosSim(next) { - // start the iOS Simulator - simHandle.startTime = Date.now(); - simHandle.running = false; - - function shutdown(code) { - // simulator process ended - - // stop looking for the log file - clearTimeout(findLogTimer); - - logFileTail && logFileTail.unwatch(); - logFileTail = null; - - if (code instanceof Error) { - cleanupAndEmit('error', code); - } else { - // wait 1 second for the potential crash log to be written - setTimeout(function () { - // did we crash? - if (!checkIfCrashed()) { - // we didn't find a crash file, so just report the simulator exited with the code - emitter.emit('log-debug', __('Exited with code: %s', code)); - cleanupAndEmit('exit', code); - } - }, 1000); - } - } - - startSimulator(simHandle) - .on('start', function (err) { - emitter.emit('launched', simHandle, watchSimHandle); - next(err); - }) - .on('error', function (err) { - if (err) { - simHandle.error = err; - shutdown(err); - } - }) - .on('stop', shutdown); - }, - - function startWatchSim(next) { - // if we need to, start the watchOS Simulator - if (watchSimHandle && appc.version.gte(selectedXcode.version, '7.0')) { - startSimulator(watchSimHandle) - .on('start', next) - .on('stop', function (code) { - // TODO: detect crashes for the watch app - }); - } else { - next(); - } - }, - - function focusOrHideSims(next) { - async.eachSeries([ watchSimHandle, simHandle ], function (handle, next) { - if (!handle || (handle.type === 'watchos' && appc.version.lt(handle.version, '2.0'))) { - // either we don't have a watch handle or we do, but it's version 1.x which - // is an external display and doesn't need to be focused - return next(); - } - - var done = false, - args, - action; - - // focus or hide the iOS Simulator - if (options.focus !== false && !options.hide && !options.autoExit) { - action = ['focus', 'focused']; - args = [ - path.join(__dirname, 'sim_focus.scpt'), - path.basename(handle.simulator) - ]; - - if (watchSimHandle && appc.version.satisfies(selectedXcode.version, '>=6.2 <7.0')) { - // Xcode 6... we need to show the external display via the activate script - args.push(watchSimHandle.name); - } else if (appc.version.lt(selectedXcode.version, '7.0')) { - args.push('Disabled'); - } - } else if (options.hide || options.autoExit) { - action = ['hide', 'hidden']; - args = [ - path.join(__dirname, 'sim_hide.scpt'), - path.basename(handle.simulator) - ]; - } - - if (!args) { - return next(); - } - - async.whilst( - function (cb) { return cb(null, !done); }, - function (cb) { - emitter.emit('log-debug', __('Running: %s', 'osascript "' + args.join('" "') + '"')); - appc.subprocess.run('osascript', args, function (code, out, err) { - if (code && /Application isn.t running/.test(err)) { - // give the iOS Simulator a half second to load - setTimeout(function () { - cb(); - }, 500); - return; - } - - if (code) { - emitter.emit('log-debug', __('Failed to %s %s Simulator, continuing', action[0], handle.name)); - } else { - emitter.emit('log-debug', __('%s Simulator successfully %s', handle.name, action[1])); - } - done = true; - - cb(); - }); - }, - next - ); - }, next); - }, - - function uninstallApp(next) { - if (!options.appPath || !appId || options.uninstallApp !== true) { - return next(); - } - emitter.emit('log-debug', __('Uninstalling the app')); - simctl.uninstall({ simctl: simHandle.simctl, udid: simHandle.udid, appId: appId }, next); - }, - - function installApp(next) { - if (!options.appPath || !appId) { - return next(); - } - simHandle.installing = true; - watchSimHandle && (watchSimHandle.installing = true); - emitter.emit('log-debug', __('Installing the app')); - simctl.install({ simctl: simHandle.simctl, udid: simHandle.udid, appPath: options.appPath }, next); - }, - - function installWatchApp(next) { - if (!options.appPath) { - return next(); - } - const watchDir = path.join(options.appPath, 'Watch'); - - if (appc.version.lt(selectedXcode.version, '11.0') || !watchSimHandle || !fs.existsSync(watchDir) || !fs.statSync(watchDir).isDirectory()) { - return next(); - } - - // Xcode 11 now makes us install the watch app separately - async.eachSeries(fs.readdirSync(watchDir), function (name, cb) { - const watchAppDir = path.join(watchDir, name); - try { - if (fs.statSync(watchAppDir).isDirectory() && fs.statSync(path.join(watchAppDir, 'Info.plist')).isFile()) { - emitter.emit('log-debug', __('Installing the watch app: %s', path.parse(name).name)); - return simctl.install({ simctl: simHandle.simctl, udid: watchSimHandle.udid, appPath: watchAppDir }, cb); - } - } catch (e) {} - - cb(); - }, next) - } - ], function (err) { - if (err) { - emitter.emit('error', err); - return callback(err); - } - - // at this point the simulator should be launched - - // if we're not launching an app, then just return now - if (!options.appPath || !appId) { - return callback(null, simHandle); - } - - async.series([ - function waitForWatchAppToSync(next) { - // if we're installing a watch app, only wait for the app to install if we're running - // Xcode 8.x or older... Xcode 9's "simctl install" blocks until both the app and watch - // app are installed - if (watchSimHandle && watchAppId && !simHandle.installed && appc.version.lt(selectedXcode.version, '9.0')) { - // since we are launching the Watch Simulator, we need to give the iOS Simulator a - // second to install the watch app in the Watch Simulator - emitter.emit('log-debug', __('Waiting for Watch App to install...')); - var timer = setInterval(function () { - if (simHandle.installed) { - clearInterval(timer); - next(); - } - }, 250); - } else { - next(); - } - }, - - function launchWatchApp(next) { - if (!watchSimHandle || !watchAppId) { - return next(); - } - - // launch the watchOS app - // - // we launch this first because on Xcode 6 iOS Simulator the watch app causes the iPhone - // to show a black screen which will flash for a second before main app launches instead - // of the main app flashing for a second before the screen turned black. - simctl.launch({ - simctl: simHandle.simctl, - udid: appc.version.gte(selectedXcode.version, '7.0') ? watchSimHandle.udid : simHandle.udid, - appId: watchAppId - }, function (err) { - if (err) { - emitter.emit('log-debug', __('Launched watch app, but with error: %s', err.toString())); - } else { - emitter.emit('log-debug', __('Watch app launched')); - } - watchSimHandle.appStarted = true; - next(); - }); - }, - - function launchIosApp(next) { - // launch the iOS app - if (options.launchWatchAppOnly) { - return next(); - } - - simctl.launch({ - simctl: simHandle.simctl, - udid: simHandle.udid, - appId: appId - }, function (err) { - if (err) { - emitter.emit('log-debug', __('Launched app, but with error: %s', err.toString())); - } else { - emitter.emit('log-debug', __('App launched')); - } - simHandle.appStarted = true; - next(); - }); - }, - - function connectToLogServer(next) { - if (options.logServerPort) { - emitter.emit('log-debug', __('Trying to connect to log server port %s...', options.logServerPort)); - (function tryConnecting() { - var client = net.connect(options.logServerPort, function () { - emitter.emit('log-debug', __('Connected to log server port %s', options.logServerPort)); - - simHandle.disconnectLogServer = function () { - if (client) { - client.end(); - client.destroy(); - client = null; - } - }; - - client.on('close', () => { - cleanupAndEmit('app-quit'); - }); - }); - client.on('data', data => { - data.toString().split('\n').forEach(function (line) { - line = line.replace(/\s+$/g, ''); - line && emitter.emit('log-file', line); - }); - }); - client.on('error', err => { - if (err.code === 'ECONNREFUSED') { - client.destroy(); - setTimeout(tryConnecting, 250); - } else { - emitter.emit('log-error', __('Failed to connect to log server port: %s', err.message || err.toString())); - } - }); - }()); - } - - next(); - }, - - function findTitaniumAppLogFile(next) { - const autoExitToken = options.autoExitToken || 'AUTO_EXIT'; - const crash1RegExp = /\*\*\* Terminating app/; // objective-c issue - - if (watchSimHandle && options.launchWatchAppOnly) { - // nothing to do here, later we'll signal app-quit so that clients can know that - // they don't need to wait around for logs - } else if (options.logFilename) { - // we are installing an app and we found the simulator log directory, now we just - // need to find the log file - (function findLogFile() { - let found = false; - let detectedCrash = false; - (function walk(dir) { - const logFile = path.join(dir, 'Documents', options.logFilename); - if (fs.existsSync(logFile)) { - emitter.emit('log-debug', __('Found application log file: %s', logFile)); - logFileTail = new Tail(logFile, '\n', { interval: 500, start: 0 }); - logFileTail.on('line', function (msg) { - - emitter.emit('log-file', msg); - - if (options.autoExit && msg.indexOf(autoExitToken) !== -1) { - emitter.emit('log-debug', __('Found "%s" token, stopping simulator', autoExitToken)); - // stopping the simulator will cause the "close" event to fire - stop(simHandle, function () { - cleanupAndEmit('app-quit'); - }); - return; - } - - if (!detectedCrash && simHandle.type === 'ios' && ((msg && crash1RegExp.test(msg)))) { - detectedCrash = true; - // wait 1 second for the potential crash log to be written - setTimeout(function () { - // did we crash? - if (!checkIfCrashed()) { - // well something happened, exit - emitter.emit('log-debug', __('Detected crash, but no crash file')); - cleanupAndEmit('app-quit'); - } - }, 1000); - } - }); - logFileTail.watch(); - found = true; - return true; - } - - if (fs.existsSync(dir)) { - return fs.readdirSync(dir).some(function (name) { - var subdir = path.join(dir, name); - - if (!fs.existsSync(subdir)) { - return; - } - - var subdirStats = fs.lstatSync(subdir); - if (subdirStats.isDirectory() && !subdirStats.isSymbolicLink()) { - return walk(subdir); - } - }); - } - }(simHandle.dataDir)); - - // try again - if (!found) { - findLogTimer = setTimeout(findLogFile, 250); - } - }()); - } - next(); - } - ], function () { - emitter.emit('app-started', simHandle, watchSimHandle); - callback(null, simHandle, watchSimHandle); - - if (watchSimHandle && options.launchWatchAppOnly && appc.version.satisfies(selectedXcode.version, '>=6.2 <7.0')) { - cleanupAndEmit('exit'); - } - }); - }); - }); - }); -}; - -/** - * Determines if the iOS Simulator is running by scanning the output of the `ps` command. - * - * @param {String} proc - The path of the executable to find the pid for. - * @param {Function} callback - A function to call with the err, pid, and udid. - */ -function isSimulatorRunning(proc, callback) { - appc.subprocess.run('ps', '-ef', function (code, out, err) { - if (code) { - return callback(new Error(__('Failed to get process list (exit code %d)', code))); - } - - var lines = out.split('\n'), - i = 0, - l = lines.length, - m, - procRE = /^\s*\d+\s+(\d+).* \-CurrentDeviceUDID (.+)/; - - for (; i < l; i++) { - if (m = lines[i].match(procRE)) { - return callback(null, parseInt(m[1]), m[2]); - } - } - - callback(null, false); - }); -} - -/** - * Returns a list of running simulators consisting of their pid and udid. - * - * @param {Function} callback - A function to call with the list of running simulators. - */ -function getRunningSimulatorDevices(callback) { - appc.subprocess.run('ps', '-ef', function (code, out, err) { - if (code) { - return callback(new Error(__('Failed to get process list (exit code %d)', code))); - } - - var lines = out.split('\n'), - i = 0, - l = lines.length, - m, - procRE = /^\s*\d+\s+(\d+).+ launchd_sim .+\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\//, - results = []; - - for (; i < l; i++) { - m = lines[i].match(procRE); - if (m) { - m.push({ - pid: m[1], - udid: m[2] - }); - } - } - - callback(null, results); - }); -} - -/** - * Runs `simctl list` for each Xcode and merges the results. Note that the `isAvailable` property - * cannot be trusted. - * - * @param {Object} options - Various Xcode detect options. - * @param {Function} callback - A function to call with the info. - */ -function list(options, callback) { - xcode.detect(options, function (err, xcodeInfo) { - if (err) { - return callback(err); - } - - const results = { - devicetypes: [], - runtimes: [], - devices: {}, - pairs: {}, - iosSimToWatchSimToPair: {} - }; - - const xcodes = Object.keys(xcodeInfo.xcode).filter(function (ver) { return xcodeInfo.xcode[ver].supported; }); - - async.eachSeries(xcodes, function (xcodeId, next) { - var xcode = xcodeInfo.xcode[xcodeId]; - simctl.list({ simctl: xcode.executables.simctl }, function (err, info) { - if (err) { - return next(err); - } - - info.devicetypes.forEach(function (dt) { - if (!results.runtimes.some(function (d) { return d.name === dt.name && d.identifier === dt.identifier; })) { - results.devicetypes.push(dt); - } - }); - - info.runtimes.forEach(function (rt) { - if (!results.runtimes.some(function (r) { return r.name === rt.name && r.version === rt.version && r.identifier === rt.identifier; })) { - results.runtimes.push(rt); - } - }); - - Object.keys(info.devices).forEach(function (rt) { - if (!results.devices[rt]) { - results.devices[rt] = []; - } - info.devices[rt].forEach(function (dev) { - if (!results.devices[rt].some(function (d) { return d.udid === dev.udid; })) { - results.devices[rt].push(dev); - } - }); - }); - - Object.keys(info.pairs).forEach(function (udid) { - var pair = info.pairs[udid]; - results.pairs[udid] || (results.pairs[udid] = pair); - var m = pair.state.match(/^\(((?:in)?active),/); - if (m) { - results.iosSimToWatchSimToPair[pair.phone.udid] || (results.iosSimToWatchSimToPair[pair.phone.udid] = {}); - results.iosSimToWatchSimToPair[pair.phone.udid][pair.watch.udid] = { udid: udid, active: m[1] === 'active' }; - } - }); - - next(); - }); - }, function (err) { - if (err) { - callback(err); - } else { - callback(null, results); - } - }); - }); -} - -/** - * Stops the specified iOS Simulator. - * - * @param {Object} simHandle - The simulator handle. - * @param {Function} [callback(err)] - A function to call when the simulator has quit. - * - * @emits module:simulator#error - * @emits module:simulator#stopped - * - * @returns {Handle} - */ -function stop(simHandle, callback) { - return magik(null, callback, function (emitter, options, callback) { - if (!simHandle || typeof simHandle !== 'object') { - var err = new Error(__('Invalid simulator handle argument')); - emitter.emit('error', err); - return callback(err); - } - - // make sure the simulator has had some time to launch - setTimeout(function () { - simHandle.disconnectLogServer && simHandle.disconnectLogServer(); - - isSimulatorRunning(simHandle.simulator, function (err, pid) { - if (err) { - callback(err); - } else if (pid) { - try { - process.kill(pid, 'SIGKILL'); - } catch (ex) {} - } - - simHandle.running = true; - - // wait for the process to die - async.whilst( - function (cb) { return cb(null, simHandle.running); }, - function (cb) { - isSimulatorRunning(simHandle.simulator, function (err, pid) { - if (!err && !pid) { - simHandle.running = false; - cb(); - } else { - setTimeout(function () { - cb(); - }, 250); - } - }); - }, - function () { - emitter.emit('stopped'); - callback(); - } - ); - }); - }, simHandle.startTime && Date.now() - simHandle.startTime < 250 ? 250 : 0); - }); -}; diff --git a/lib/teams.js b/lib/teams.js deleted file mode 100644 index 4b4db88..0000000 --- a/lib/teams.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Detects the Apple developer teams. - * - * @module teams - * - * @copyright - * Copyright (c) 2014-2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - async = require('async'), - magik = require('./utilities').magik, - provisioning = require('./provisioning'), - xcode = require('./xcode'); - -/** - * Fired when the developer profiles have been updated. - * @event module:env#detected - * @type {Object} - */ - -/** - * Fired when there was an error retreiving the provisioning profiles. - * @event module:env#error - * @type {Error} - */ - -/** - * Detects the Apple developer teams from the provisioning profiles and Xcodes. - * - * @param {Object} [options] - An object containing various settings - * @param {Function} [callback(err, results)] - A function to call with the development environment information - * - * @emits module:env#detected - * @emits module:env#error - * - * @returns {Handle} - */ -exports.detect = function detect(options, callback) { - return magik(options, callback, function (emitter, options, callback) { - async.parallel({ - provisioning: function (next) { - provisioning.detect(options, next); - }, - xcode: function (next) { - xcode.detect(options, next); - } - }, function (err, iosInfo) { - if (err) { - return callback(err); - } - - var provisioning = iosInfo.provisioning.provisioning; - var xcodes = iosInfo.xcode.xcode; - var teams = {}; - - ['development', 'adhoc', 'distribution'].forEach(function (type) { - provisioning[type].forEach(function (pp) { - if (Array.isArray(pp.team)) { - pp.team.forEach(function (id) { - teams[id] = id; - }); - } - }); - }); - - Object.keys(xcodes).forEach(function (xcodeId) { - var t = xcodes[xcodeId].teams; - Object.keys(t).forEach(function (id) { - teams[id] = t[id]; - }); - }); - - var results = { - teams: Object.keys(teams).map(function (id) { - var team = teams[id]; - if (typeof team === 'string') { - return { - id: team, - name: 'Unknown', - }; - } - - return { - id: id, - name: team.name - }; - }) - }; - - emitter.emit('detected', results); - callback(null, results); - }); - }); -}; diff --git a/lib/utilities.js b/lib/utilities.js deleted file mode 100644 index b3d3e70..0000000 --- a/lib/utilities.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Utility functions used by ioslib. - * - * @module utilities - * - * @copyright - * Copyright (c) 2015-2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -'use strict'; - -const appc = require('node-appc'); -const bplist = require('bplist-parser'); -const crypto = require('crypto'); -const EventEmitter = require('events').EventEmitter; -const fs = require('fs'); -const __ = appc.i18n(__dirname).__; -const util = require('util'); - -exports.Handle = Handle; -exports.magik = magik; -exports.hash = hash; -exports.readPlist = readPlist; - -/** - * Exposes both an event emitter API and a `stop()` method for canceling long - * running functions such as `trackDevices()` and `log()`. - */ -function Handle() {} -util.inherits(Handle, EventEmitter); - -/** - * Creates an event emitting handle, validates that the platform is OS X, - * normalizes the 'options' and 'callback' arguments, and passes all - * these goodies to the 'body' function. It's magik! - * - * @param {Object} [options] - An object containing various settings. - * @param {Function} [callback(err, ...)] - A function to call with the task is complete. This is guaranteed to be called asynchronously. - * @param {Function} [body] - A function to call with the - * - * @returns {Handle} - */ -function magik(options, callback, body) { - var handle = new Handle; - handle.on('error', function () {}); - - process.nextTick(function () { - if (typeof options === 'function') { - callback = options; - options = {}; - } else if (!options) { - options = {}; - } - typeof callback === 'function' || (callback = function () {}); - - if (process.platform !== 'darwin') { - var err = new Error(__('Unsupported platform "%s"', process.platform)); - handle.emit('error', err); - return callback(err); - } - - body && body(handle, options, callback); - }); - - return handle; -}; - -/** - * MD5 hashes the specified string. - * - * @param {String|Buffer} str - The string to hash. - * - * @returns {String} The MD5 hash. - */ -function hash(str) { - return crypto.createHash('md5').update(str || '').digest('hex'); -}; - -/** - * Parses both ascii and binary plist files and returns a JSON representation. - * - * @param {String} file - The path to the plist file. - * - * @returns {Object|null} - Returns a JSON representation of the plist file or null if the file does not exist or unable to parse. - */ -function readPlist(file) { - try { - if (fs.existsSync(file)) { - var buffer = fs.readFileSync(file), - header = buffer.slice(0, 'bplist'.length).toString('utf8'); - if (header === 'bplist') { - return bplist.parseBuffer(buffer)[0]; - } else { - return (new appc.plist()).parse(buffer.toString()); - } - } - } catch (ex) {} - return null; -} diff --git a/lib/xcode.js b/lib/xcode.js deleted file mode 100644 index ea180ee..0000000 --- a/lib/xcode.js +++ /dev/null @@ -1,811 +0,0 @@ -/** - * Detects Xcode installs and their iOS SDKs. - * - * @module xcode - * - * @copyright - * Copyright (c) 2014-2018 by Appcelerator, Inc. All Rights Reserved. - * - * Copyright (c) 2010-2014 Digital Bazaar, Inc. - * {@link https://github.com/digitalbazaar/forge} - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - appc = require('node-appc'), - async = require('async'), - env = require('./env'), - hash = require('./utilities').hash, - magik = require('./utilities').magik, - fs = require('fs'), - path = require('path'), - readPlist = require('./utilities').readPlist, - simctl = require('./simctl'), - __ = appc.i18n(__dirname).__; - -var cache, - detecting = {}, - waiting = []; - -/** - * A lookup table of valid iOS Simulator -> Watch Simulator pairings. - * - * This table MUST be maintained! - * - * The actual device pairing is done by the CoreSimulator private framework. - * I have no idea how it determines what iOS Simulators are compatible with - * what Watch Simulator. It's a mystery! - */ -const simulatorDevicePairCompatibility = { - '>=6.2 <7.0': { // Xcode 6.2, 6.3, 6.4 - '>=8.2 <9.0': { // iOS 8.2, 8.3, 8.4 - '1.x': true // watchOS 1.0 - } - }, - '7.x': { // Xcode 7.x - '>=8.2 <9.0': { // iOS 8.2, 8.3, 8.4 - '1.x': true // watchOS 1.0 - }, - '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 - '>=2.0 <=2.1': true // watchOS 2.0, 2.1 - }, - '>=9.3 <10': { // iOS 9.3 - '2.2': true // watchOS 2.2 - } - }, - '8.x': { // Xcode 8.x - '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 - '>=2.0 <=2.1': true // watchOS 2.0, 2.1 - }, - '>=9.3 <10': { // iOS 9.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '10.x': { // iOS 10.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - } - }, - '9.x': { // Xcode 9.x - '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 - '>=2.0 <=2.1': true // watchOS 2.0, 2.1 - }, - '>=9.3 <10': { // iOS 9.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '10.x': { // iOS 10.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '11.x': { // iOS 11.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true // watchOS 4.x - } - }, - '10.x <10.3': { // Xcode 10.0-10.2.1 - '8.x': {}, // iOS 8.x - '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 - '>=2.0 <=2.1': true // watchOS 2.0, 2.1 - }, - '>=9.3 <10': { // iOS 9.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '>=10.0 <=10.2': { // iOS 10.0, 10.1, 10.2 - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '>=10.3 <11': { // iOS 10.3 - '3.x': true // watchOS 3.x - }, - '11.x': { // iOS 11.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true // watchOS 4.x - }, - '12.x': { // iOS 12.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true, // watchOS 4.x - '5.x': true // watchOS 5.x - } - }, - '>=10.3 <11': { - '>=10.3 <11': { // iOS 10.3 - '3.x': true // watchOS 3.x - }, - '11.x': { // iOS 11.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true // watchOS 4.x - }, - '12.x': { // iOS 12.x - '4.x': true, // watchOS 4.x - '5.x': true // watchOS 5.x - } - }, - '11.x': { // Xcode 11.x - '>=10.3 <11': { // iOS 10.3 - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '11.x': { // iOS 11.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true // watchOS 4.x - }, - '12.x': { // iOS 12.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true // watchOS 6.x - }, - '13.x': { // iOS 13.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true // watchOS 6.x - } - }, - '12.x': { // Xcode 12.x - '>=10.3 <11': { // iOS 10.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '11.x': { // iOS 11.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true // watchOS 4.x - }, - '12.x': { // iOS 12.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true // watchOS 7.x - }, - '13.x': { // iOS 13.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true // watchOS 7.x - }, - '14.x': { // iOS 14.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true // watchOS 7.x - } - }, - '13.x': { // Xcode 13.x - '>=10.3 <11': { // iOS 10.x - '2.2': true, // watchOS 2.2 - '3.x': true // watchOS 3.x - }, - '11.x': { // iOS 11.x - '>=3.2 <4.0': true, // watchOS 3.2 - '4.x': true // watchOS 4.x - }, - '12.x': { // iOS 12.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true, // watchOS 7.x - '8.x': true // watchOS 8.x - }, - '13.x': { // iOS 13.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true, // watchOS 7.x - '8.x': true // watchOS 8.x - }, - '14.x': { // iOS 14.x - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true, // watchOS 7.x - '8.x': true // watchOS 8.x - }, - '15.x': { - '4.x': true, // watchOS 4.x - '5.x': true, // watchOS 5.x - '6.x': true, // watchOS 6.x - '7.x': true, // watchOS 7.x - '8.x': true // watchOS 8.x - } - }, - '14.x': { // Xcode 14.x - '12.x': { // iOS 12.x - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true // watchOS 9.x - }, - '13.x': { // iOS 13.x - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true // watchOS 9.x - }, - '14.x': { // iOS 14.x - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true // watchOS 9.x - }, - '15.x': { - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true // watchOS 9.x - }, - '16.x': { - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true // watchOS 9.x - } - }, - '15.x': { // Xcode 15.x - '13.x': { // iOS 13.x - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true // watchOS 10.x - }, - '14.x': { // iOS 14.x - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true // watchOS 10.x - }, - '15.x': { - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true // watchOS 10.x - }, - '16.x': { - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true // watchOS 10.x - }, - '17.x': { - '7.x': true, // watchOS 7.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true // watchOS 10.x - } - }, - '16.x': { // Xcode 16.x - '15.x': { // iOS 15.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true, // watchOS 10.x - '11.x': true, // watchOS 11.x - }, - '16.x': { // iOS 16.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true, // watchOS 10.x - '11.x': true, // watchOS 11.x - }, - '17.x': { // iOS 18.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true, // watchOS 10.x - '11.x': true, // watchOS 11.x - }, - '18.x': { // iOS 18.x - '8.x': true, // watchOS 8.x - '9.x': true, // watchOS 9.x - '10.x': true, // watchOS 10.x - '11.x': true, // watchOS 11.x - } - } -}; - -/** - * Detects Xcode installations. - * - * @param {Object} [options] - An object containing various settings. - * @param {Boolean} [options.bypassCache=false] - When true, re-detects all Xcode installations. - * @param {String|Array} [options.searchPath] - One or more path to scan for Xcode installations. - * @param {String} [options.minTVosVersion] - The minimum AppleTV SDK to detect. - * @param {String} [options.minIosVersion] - The minimum iOS SDK to detect. - * @param {String} [options.minWatchosVersion] - The minimum WatchOS SDK to detect. - * @param {String} [options.sqlite] - Path to the sqlite executable (most likely named sqlite3) - * @param {String} [options.supportedVersions] - A string with a version number or range to check if an Xcode install is supported. - * @param {Function} [callback(err, results)] - A function to call with the Xcode information. - * - * @emits module:xcode#detected - * @emits module:xcode#error - * - * @returns {Handle} - */ -exports.detect = function detect(options, callback) { - var hopt = hash(JSON.stringify(options)); - if (detecting[hopt]) { - waiting.push(callback); - return detecting[hopt]; - } - - return detecting[hopt] = magik(options, callback, function (emitter, options, callback) { - waiting.push(callback); - - function fireCallbacks(err, result) { - delete detecting[hopt]; - var w; - while (w = waiting.shift()) { - w(err, result); - } - } - - if (cache && !options.bypassCache) { - emitter.emit('detected', cache); - return fireCallbacks(null, cache); - } - - function findSimRuntimes(dir) { - var runtimes = {}; - - // regex to extract the version from the runtime name - var runtimeNameRegExp = /\s(\d+(?:\.\d+(?:\.\d+)?)?)$/; - - fs.existsSync(dir) && fs.readdirSync(dir).forEach(function (name) { - var x = path.join(dir, name, 'Contents', 'Info.plist'); - var plist = readPlist(path.join(dir, name, 'Contents', 'Info.plist')); - if (plist) { - var runtime = runtimes[plist.CFBundleIdentifier] = { - name: plist.CFBundleName, - version: null - }; - var m = plist.CFBundleName.match(runtimeNameRegExp); - if (m) { - runtime.version = m[1]; - } - - plist = readPlist(path.join(dir, name, 'Contents', 'Resources', 'profile.plist')); - if (plist) { - if (!runtime.version || plist.defaultVersionString.startsWith(runtime.version)) { - runtime.version = plist.defaultVersionString; - } - } - } - }); - return runtimes; - } - - function findSDKs(dir, nameRegExp, minVersion) { - var vers = []; - - fs.existsSync(dir) && fs.readdirSync(dir).forEach(function (name) { - var file = path.join(dir, name); - if (!fs.existsSync(file) || !fs.statSync(file).isDirectory()) return; - var m = name.match(nameRegExp); - if (m && (!minVersion || appc.version.gte(m[1], minVersion))) { - var ver = m[1]; - file = path.join(file, 'System', 'Library', 'CoreServices', 'SystemVersion.plist'); - if (fs.existsSync(file)) { - var p = new appc.plist(file); - if (p.ProductVersion) { - ver = p.ProductVersion; - } - } - vers.push(ver); - } - }); - - return vers.sort().reverse(); - } - - function findSims(dir, sdkRegExp, simRuntimeRegExp, minVer, xcodeVer) { - var vers = findSDKs(dir, sdkRegExp), - simRuntimesDir = '/Library/Developer/CoreSimulator/Profiles/Runtimes'; - - // for Xcode >=6.2 <7.0, the simulators are in a global directory - if (fs.existsSync(simRuntimesDir) && (!xcodeVer || appc.version.gte(xcodeVer, '6.2'))) { - fs.readdirSync(simRuntimesDir).forEach(function (name) { - var file = path.join(simRuntimesDir, name); - if (!fs.existsSync(file) || !fs.statSync(file).isDirectory()) return; - - var m = name.match(simRuntimeRegExp); - if (m && (!minVer || appc.version.gte(m[1], minVer))) { - var ver = m[1]; - file = path.join(file, 'Contents', 'Resources', 'RuntimeRoot', 'System', 'Library', 'CoreServices', 'SystemVersion.plist'); - if (fs.existsSync(file)) { - var p = new appc.plist(file); - if (p.ProductVersion) { - ver = p.ProductVersion; - } - } - if (vers.indexOf(ver) === -1) { - vers.push(ver); - } - } - }); - } - - return vers.sort().reverse(); - } - - var searchPaths = { - '/Applications': 1, - '~/Applications': 1 - }, - results = { - selectedXcode: null, - xcode: {}, - iosSDKtoXcode: {}, - issues: [] - }, - selectedXcodePath = null, - globalSimRuntimes = findSimRuntimes('/Library/Developer/CoreSimulator/Profiles/Runtimes'), - xcodes = []; - - async.series([ - // build the list of searchPaths - function detectOSXenv(next) { - env.detect(options, function (err, env) { - (Array.isArray(options.searchPath) ? options.searchPath : [ options.searchPath ]).forEach(function (p) { - p && (searchPaths[p] = 1); - }); - - // resolve each of the paths - Object.keys(searchPaths).forEach(function (p) { - delete searchPaths[p]; - searchPaths[appc.fs.resolvePath(p)] = 1; - }); - - if (err || !env.executables.xcodeSelect) { - return next(); - } - - appc.subprocess.run(env.executables.xcodeSelect, '--print-path', function (code, out, err) { - if (!err) { - searchPaths[selectedXcodePath = out.trim()] = 1; - } - next(); - }); - }); - }, - - function findXcodes(next) { - // scan all searchPaths for Xcode installs - Object.keys(searchPaths).forEach(function (p) { - if (fs.existsSync(p) && fs.statSync(p).isDirectory()) { - // is this directory an Xcode dev dir? - if (/\/Contents\/Developer\/?$/.test(p) && fs.existsSync(path.join(p, 'usr', 'bin', 'xcodebuild')) && xcodes.indexOf(p) === -1) { - xcodes.push(p) - } else { - // is it the Xcode dir? - var devDir = path.join(p, 'Contents', 'Developer'); - if (fs.existsSync(path.join(devDir, 'usr', 'bin', 'xcodebuild')) && xcodes.indexOf(devDir) === -1) { - xcodes.push(devDir); - } else { - // possibly a parent folder, scan for Xcodes - fs.readdirSync(p).forEach(function (name) { - var dir = path.join(p, name, 'Contents', 'Developer'); - if (xcodes.indexOf(dir) === -1 && fs.existsSync(path.join(dir, 'usr', 'bin', 'xcodebuild'))) { - xcodes.push(dir); - } - }); - } - } - } - }); - next(); - }, - - function loadXcodeInfo(next) { - async.eachSeries(xcodes, function (dir, cb) { - var p = new appc.plist(path.join(path.dirname(dir), 'version.plist')), - version = p.CFBundleShortVersionString, - selected = dir == selectedXcodePath, - supported = options.supportedVersions ? appc.version.satisfies(version, options.supportedVersions, true) : true, - id = version + ':' + p.ProductBuildVersion, - f; - - if (results.xcode[id] && !selected && dir > results.xcode[id].path) { - return cb(); - } - - var watchos = null; - if (appc.version.gte(version, '7.0')) { - watchos = { - sdks: findSDKs(path.join(dir, 'Platforms', 'WatchOS.platform', 'Developer', 'SDKs'), /^WatchOS(.+)\.sdk$/, options.minWatchosVersion), - sims: [] - }; - } else if (appc.version.gte(version, '6.2')) { - watchos = { - sdks: ['1.0'], - sims: ['1.0'] - }; - } - - var tvos = { - sdks: findSDKs(path.join(dir, 'Platforms', 'AppleTVOS.platform', 'Developer', 'SDKs'), /^AppleTVOS(.+)\.sdk$/, options.minTVosVersion), - sims: [] // nobody cares - }; - - var xc = results.xcode[id] = { - xcodeapp: dir.replace(/\/Contents\/Developer\/?$/, ''), - path: dir, - selected: selected, - version: version, - build: p.ProductBuildVersion, - supported: supported, - eulaAccepted: false, - sdks: findSDKs(path.join(dir, 'Platforms', 'iPhoneOS.platform', 'Developer', 'SDKs'), /^iPhoneOS(.+)\.sdk$/, options.minIosVersion), - sims: [], - simDeviceTypes: {}, - simRuntimes: {}, - simDevicePairs: {}, - watchos: watchos, - tvos: tvos, - teams: {}, - executables: { - xcodebuild: fs.existsSync(f = path.join(dir, 'usr', 'bin', 'xcodebuild')) ? f : null, - clang: fs.existsSync(f = path.join(dir, 'Toolchains', 'XcodeDefault.xctoolchain', 'usr', 'bin', 'clang')) ? f : null, - clang_xx: fs.existsSync(f = path.join(dir, 'Toolchains', 'XcodeDefault.xctoolchain', 'usr', 'bin', 'clang++')) ? f : null, - libtool: fs.existsSync(f = path.join(dir, 'Toolchains', 'XcodeDefault.xctoolchain', 'usr', 'bin', 'libtool')) ? f : null, - lipo: fs.existsSync(f = path.join(dir, 'Toolchains', 'XcodeDefault.xctoolchain', 'usr', 'bin', 'lipo')) ? f : null, - otool: fs.existsSync(f = path.join(dir, 'Toolchains', 'XcodeDefault.xctoolchain', 'usr', 'bin', 'otool')) ? f : null, - pngcrush: fs.existsSync(f = path.join(dir, 'Platforms', 'iPhoneOS.platform', 'Developer', 'usr', 'bin', 'pngcrush')) ? f : null, - simulator: null, - watchsimulator: null, - simctl: fs.existsSync(f = path.join(dir, 'usr', 'bin', 'simctl')) ? f : null - } - }; - - Object.keys(simulatorDevicePairCompatibility).some(function (xcodeRange) { - if (appc.version.satisfies(xc.version, xcodeRange)) { - xc.simDevicePairs = simulatorDevicePairCompatibility[xcodeRange]; - - // use the device pair compatibility to see if the simruntime is supported by - // this Xcode as there isn't a way to programmatically do it - Object.keys(globalSimRuntimes).forEach(function (runtime) { - Object.keys(xc.simDevicePairs).forEach(function (iosRange) { - if (/iOS/.test(runtime) && appc.version.satisfies(globalSimRuntimes[runtime].version, iosRange)) { - xc.simRuntimes[runtime] = globalSimRuntimes[runtime]; - } else if (/watchOS/.test(runtime)) { - // scan all iOS versions - Object.keys(xc.simDevicePairs[iosRange]).forEach(function (watchosRange) { - if (appc.version.satisfies(globalSimRuntimes[runtime].version, watchosRange)) { - xc.simRuntimes[runtime] = globalSimRuntimes[runtime]; - } - }); - } - }); - }); - - return true; - } - }); - - // Read the device types and devices in one call using the `xcrun simctl list --json` - // command. This not only improves performance (no device I/O required), but also combines - // two command (`simctl list` and `simctl list devices`) into one. - simctl.list({ simctl: xc.executables.simctl }, function (err, info) { - if (err) { - return next(err); - } - - const devices = info.devices; - const deviceTypes = info.devicetypes; - - deviceTypes.forEach(function(deviceType) { - if (!xc.simDeviceTypes[deviceType.identifier]) { - xc.simDeviceTypes[deviceType.identifier] = { - name: deviceType.name, - model: deviceType.modelIdentifier || 'unknown', - // Assume devices with Watch in name or model support watch pairing - supportsWatch: /watch/i.test(deviceType.name) ? false : true - }; - } - }); - - // Map the platform and version from CoreSimulator string like: - // - com.apple.CoreSimulator.SimRuntime.iOS-17-0 - // - com.apple.CoreSimulator.SimRuntime.watchOS-10-0 - for (const key of Object.keys(devices)) { - const [_, platform, rawVersion] = key.match(/\.SimRuntime\.(.*?)\-(.*)$/); - const version = rawVersion.replace(/-/g, '.'); - - const mapping = { - name: `${platform} ${version}`, - version - } - appc.util.mix(xc.simRuntimes, { [key]: mapping }); - } - }); - - ['Simulator', 'iOS Simulator'].some(function (name) { - var p = path.join(dir, 'Applications', name + '.app', 'Contents', 'MacOS', name); - if (fs.existsSync(p)) { - xc.executables.simulator = p; - return true; - } - }); - - if (appc.version.gte(xc.version, 9)) { - xc.executables.watchsimulator = xc.executables.simulator; - } else { - var watchsim = path.join(dir, 'Applications', 'Simulator (Watch).app', 'Contents', 'MacOS', 'Simulator (Watch)'); - if (fs.existsSync(watchsim)) { - xc.executables.watchsimulator = watchsim; - } - } - - // determine the compatible sims - simctl.list({ simctl: xc.executables.simctl }, function (err, info) { - if (err) { - return next(err); - } - - var rtRegExp = /(iOS|watchOS)-(.+)$/; - Object.keys(info.devices).forEach(function (rt) { - var m = rt.match(rtRegExp); - if (m) { - var dest = m[1] === 'iOS' ? xc.sims : xc.watchos.sims; - var ver = m[2].replace(/-/g, '.'); - if (dest.indexOf(ver) === -1) { - dest.push(ver); - } - } - }); - - xc.sims.sort(); - xc.watchos.sims.sort(); - selected && (results.selectedXcode = xc); - - if (supported === false) { - results.issues.push({ - id: 'IOS_XCODE_TOO_OLD', - type: 'warning', - message: __('Xcode %s is too old and is no longer supported.', '__' + version + '__') + '\n' + - __('The minimum supported Xcode version is Xcode %s.', appc.version.parseMin(options.supportedVersions)), - xcodeVer: version, - minSupportedVer: appc.version.parseMin(options.supportedVersions) - }); - } else if (supported === 'maybe') { - results.issues.push({ - id: 'IOS_XCODE_TOO_NEW', - type: 'warning', - message: __('Xcode %s may or may not work as expected.', '__' + version + '__') + '\n' + - __('The maximum supported Xcode version is Xcode %s.', appc.version.parseMax(options.supportedVersions, true)), - xcodeVer: version, - maxSupportedVer: appc.version.parseMax(options.supportedVersions, true) - }); - } - - appc.subprocess.run(xc.executables.xcodebuild, [ '-checkFirstLaunchStatus' ], function (code, out, err) { - xc.eulaAccepted = (code === 0); - cb(); - }); - }); - }, next); - }, - - function findTeams(next) { - appc.subprocess.findExecutable([options.sqlite, '/usr/bin/sqlite3', '/usr/bin/sqlite', 'sqlite3', 'sqlite'], function (err, sqlite) { - if (err) { - results.issues.push({ - id: 'IOS_SQLITE_EXECUTABLE_NOT_FOUND', - type: 'error', - message: __("Unable to find the 'sqlite' or 'sqlite3' executable.") - }); - return next(); - } - - async.each(Object.keys(results.xcode), function (id, cb) { - var xc = results.xcode[id], - dbFile = appc.fs.resolvePath('~/Library/Developer/Xcode/DeveloperPortal ' + xc.version + '.db'); - - if (!fs.existsSync(dbFile)) { - return cb(); - } - - appc.subprocess.run(sqlite, [dbFile, '-separator', '|||', 'SELECT ZNAME, ZSTATUS, ZTEAMID, ZTYPE FROM ZTEAM'], function (code, out, err) { - if (!code) { - out.trim().split('\n').forEach(function (line) { - var cols = line.trim().split('|||'); - if (cols.length === 4) { - xc.teams[cols[2]] = { - name: cols[0], - status: cols[1] || 'unknown', - type: cols[3] - }; - } - }); - } - cb(); - }); - }, next); - }); - } - ], function () { - if (Object.keys(results.xcode).length) { - var validXcodes = 0, - xcodeIds = Object.keys(results.xcode), - sdkCounter = 0, - simCounter = 0, - eulaNotAccepted = []; - - xcodeIds.forEach(function (xcodeId) { - const xc = results.xcode[xcodeId]; - xc.sdks.forEach(function (iosVersion) { - if (xc.selected || !results.iosSDKtoXcode[iosVersion]) { - results.iosSDKtoXcode[iosVersion] = xcodeId; - } - }); - - if (xc.supported) { - // we're counting maybe's as valid - validXcodes++; - } - if (xc.sdks) { - sdkCounter += xc.sdks.length; - } - if (xc.sims) { - simCounter += xc.sims.length; - } - if (!xc.eulaAccepted) { - eulaNotAccepted.push(xc); - } - }); - - if (eulaNotAccepted.length) { - var message; - - if (xcodeIds.length === 1) { - message = __('Xcode EULA has not been accepted.') + '\n' + - __('Launch Xcode and accept the license.'); - } else { - message = __('Multiple Xcode versions have not had their EULA accepted:') + '\n' + - eulaNotAccepted.map(function (xc) { - return ' ' + xc.version + ' (' + xc.xcodeapp + ')'; - }).join('\n') + '\n' + - __('Launch each Xcode and accept the license.'); - } - - results.issues.push({ - id: 'IOS_XCODE_EULA_NOT_ACCEPTED', - type: 'warning', - message: message - }); - } - - if (options.supportedVersions && !validXcodes) { - results.issues.push({ - id: 'IOS_NO_SUPPORTED_XCODE_FOUND', - type: 'warning', - message: __('There are no supported Xcode installations found.') - }); - } - - if (!sdkCounter) { - results.issues.push({ - id: 'IOS_NO_IOS_SDKS', - type: 'error', - message: __('There are no iOS SDKs found') + '\n' + - __('Launch Xcode and download the mobile support packages.') - }); - } - - if (!sdkCounter) { - results.issues.push({ - id: 'IOS_NO_IOS_SIMS', - type: 'error', - message: __('There are no iOS Simulators found') + '\n' + - __('You can install them from the Xcode Preferences > Downloads tab.') - }); - } - } else { - results.issues.push({ - id: 'IOS_XCODE_NOT_INSTALLED', - type: 'error', - message: __('No Xcode installations found.') + '\n' + - __('You can download it from the %s or from %s.', '__App Store__', '__https://developer.apple.com/xcode/__') - }); - } - - cache = results; - emitter.emit('detected', results); - return fireCallbacks(null, results); - }); - }); -}; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index bb63d19..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4280 +0,0 @@ -{ - "name": "ioslib", - "version": "5.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "ioslib", - "version": "5.0.0", - "license": "Apache-2.0", - "dependencies": { - "always-tail": "0.2.0", - "async": "^3.2.6", - "bplist-parser": "0.3.2", - "debug": "^4.3.4", - "node-appc": "^1.1.7", - "node-ios-device": "^1.12.1" - }, - "devDependencies": { - "mocha": "^8.2.0", - "should": "^13.2.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", - "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/always-tail": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/always-tail/-/always-tail-0.2.0.tgz", - "integrity": "sha1-M5sa9E1QJQqgeg6H7Mw6JOxET/4=", - "dependencies": { - "debug": "~0.7.2" - } - }, - "node_modules/always-tail/node_modules/debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "engines": { - "node": "*" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dependencies": { - "micromatch": "^4.0.2" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dependencies": { - "universalify": "^1.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dependencies": { - "mime-db": "1.44.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "node_modules/minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" - }, - "node_modules/nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/node-appc": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/node-appc/-/node-appc-1.1.7.tgz", - "integrity": "sha512-BrALELUzNC4WWhDIkgBu5pUU/9IzIza65ck1yPTd5A2q1wzrXySYDhLfzKJrFmGZZep37XRKey33U10539Xd0Q==", - "license": "Apache-2.0", - "dependencies": { - "@xmldom/xmldom": "^0.8.6", - "async": "^3.2.4", - "colors": "1.4.0", - "fs-extra": "~9.1.0", - "request": "~2.88.0", - "semver": "~7.3.8", - "sprintf": "^0.1.5", - "temp": "~0.9.4", - "uuid": "~9.0.0", - "yauzl": "^2.10.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/node-fetch": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", - "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-ios-device": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/node-ios-device/-/node-ios-device-1.12.1.tgz", - "integrity": "sha512-qcCfQw5qXek1l4NDuKt19w4gCZK4Sra4AM2PXQrpW5NhhCCl0pGfDKknBNzB0UmVd+lRm5CF5Wvy8c2Nor2jEQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.10", - "debug": "^4.3.4", - "nan": "^2.20.0", - "node-pre-gyp-init": "^1.2.1", - "patch-package": "^6.5.1" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/node-pre-gyp-init": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-pre-gyp-init/-/node-pre-gyp-init-1.2.1.tgz", - "integrity": "sha512-gbC2fERRmWbJFvj54f4yyiY/O6J1kkLrN7jkwRvzNmgMgPCufZLv76l2luzWjj+Ge0xQF6zDalZ6iIgzCHJ95Q==", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.1" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=10", - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "dependencies": { - "should-type": "^1.4.0" - } - }, - "node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "node_modules/should-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/sprintf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", - "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=", - "deprecated": "The sprintf package is deprecated in favor of sprintf-js.", - "engines": { - "node": ">=0.2.4" - } - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "@xmldom/xmldom": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", - "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==" - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "always-tail": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/always-tail/-/always-tail-0.2.0.tgz", - "integrity": "sha1-M5sa9E1QJQqgeg6H7Mw6JOxET/4=", - "requires": { - "debug": "~0.7.2" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" - } - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "requires": { - "big-integer": "1.6.x" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "requires": { - "micromatch": "^4.0.2" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" - }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-appc": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/node-appc/-/node-appc-1.1.7.tgz", - "integrity": "sha512-BrALELUzNC4WWhDIkgBu5pUU/9IzIza65ck1yPTd5A2q1wzrXySYDhLfzKJrFmGZZep37XRKey33U10539Xd0Q==", - "requires": { - "@xmldom/xmldom": "^0.8.6", - "async": "^3.2.4", - "colors": "1.4.0", - "fs-extra": "~9.1.0", - "request": "~2.88.0", - "semver": "~7.3.8", - "sprintf": "^0.1.5", - "temp": "~0.9.4", - "uuid": "~9.0.0", - "yauzl": "^2.10.0" - } - }, - "node-fetch": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", - "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-ios-device": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/node-ios-device/-/node-ios-device-1.12.1.tgz", - "integrity": "sha512-qcCfQw5qXek1l4NDuKt19w4gCZK4Sra4AM2PXQrpW5NhhCCl0pGfDKknBNzB0UmVd+lRm5CF5Wvy8c2Nor2jEQ==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.10", - "debug": "^4.3.4", - "nan": "^2.20.0", - "node-pre-gyp-init": "^1.2.1", - "patch-package": "^6.5.1" - } - }, - "node-pre-gyp-init": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-pre-gyp-init/-/node-pre-gyp-init-1.2.1.tgz", - "integrity": "sha512-gbC2fERRmWbJFvj54f4yyiY/O6J1kkLrN7jkwRvzNmgMgPCufZLv76l2luzWjj+Ge0xQF6zDalZ6iIgzCHJ95Q==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.1" - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "dependencies": { - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" - }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "sprintf": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz", - "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "requires": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index c5359b4..33db734 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,16 @@ { "name": "ioslib", - "version": "5.0.0", + "version": "4.2.3", + "publishConfig": { + "tag": "next" + }, "description": "iOS Utility Library", + "main": "./dist/index", + "author": "Axway, Inc. ", + "maintainers": [ + "Chris Barber " + ], + "license": "Apache-2.0", "keywords": [ "appcelerator", "ios", @@ -10,38 +19,35 @@ "xcode", "apple" ], - "author": "TiDev, Inc. ", - "repository": "https://github.com/tidev/ioslib", - "license": "Apache-2.0", - "main": "./index", - "bugs": "https://github.com/tidev/ioslib/issues", - "directories": { - "lib": "./lib" + "bin": "./bin/ioslib", + "scripts": { + "build": "gulp build", + "coverage": "gulp coverage", + "docs": "gulp docs", + "lint": "gulp lint", + "prepare": "gulp build", + "test": "gulp test" }, "dependencies": { - "always-tail": "0.2.0", - "async": "^3.2.6", - "bplist-parser": "0.3.2", - "debug": "^4.3.4", - "node-appc": "^1.1.7", - "node-ios-device": "^1.12.1" + "appcd-fs": "^2.0.2", + "appcd-path": "^2.0.3", + "appcd-subprocess": "^5.0.1", + "appcd-util": "^3.1.1", + "cli-kit": "^1.9.2", + "node-forge": "^0.10.0", + "node-ios-device": "^3.1.1", + "promise-limit": "^2.7.0", + "semver": "^7.3.4", + "simple-plist": "^1.1.1", + "source-map-support": "^0.5.19" }, "devDependencies": { - "mocha": "^8.2.0", - "should": "^13.2.3" - }, - "scripts": { - "test": "mocha --require test/init --check-leaks test/", - "test-certs": "mocha --require test/init --reporter spec --check-leaks test/test-certs", - "test-device": "mocha --require test/init --reporter spec --check-leaks test/test-device", - "test-env": "mocha --require test/init --reporter spec --check-leaks test/test-env", - "test-ioslib": "mocha --require test/init --reporter spec --check-leaks test/test-ioslib", - "test-provisioning": "mocha --require test/init --reporter spec --check-leaks test/test-provisioning", - "test-simulator": "mocha --require test/init --reporter spec --check-leaks test/test-simulator", - "test-teams": "mocha --require test/init --reporter spec --check-leaks test/test-teams", - "test-xcode": "mocha --require test/init --reporter spec --check-leaks test/test-xcode" + "appcd-gulp": "^3.1.1" }, + "homepage": "https://github.com/appcelerator/ioslib", + "bugs": "https://github.com/appcelerator/ioslib/issues", + "repository": "https://github.com/appcelerator/ioslib", "engines": { - "node": ">=18" + "node": ">=10.13.0" } } diff --git a/src/certs.js b/src/certs.js new file mode 100644 index 0000000..a131dd3 --- /dev/null +++ b/src/certs.js @@ -0,0 +1,87 @@ +import getKeychains from './keychains'; +import options from './options'; +import promiseLimit from 'promise-limit'; + +import { certificateFromPem } from 'node-forge/lib/pki'; +import { cache, decodeOctalUTF8, get, sha1 } from 'appcd-util'; +import { run } from 'appcd-subprocess'; + +const BEGIN = '-----BEGIN CERTIFICATE-----'; +const END = '-----END CERTIFICATE-----'; +const wwdrName = 'Apple Worldwide Developer Relations Certification Authority'; +const certRegExp = /^(?:((?:Apple|iOS) Development|iPhone Developer)|((?:Apple|iOS|iPhone) Distribution)): (.+)$/; + +/** + * Detects the installed certs across all keychains, then sorts them into either an iOS Developer + * or iOS Distribution list. It also detects if a valid Apple Worldwide Developer Relations + * certificate is found. + * + * @param {Boolean} [force=false] - When `true`, bypasses cache and forces redetection. + * @returns {Promise} + */ +export function getCerts(force) { + return cache('ioslib:certs', force, async () => { + const keychains = await getKeychains(); + const limit = promiseLimit(3); + const certs = { + developer: [], + distribution: [], + wwdr: false + }; + + await Promise.all(keychains.map(keychain => limit(async () => { + const { stdout } = await run(get(options, 'executables.security') || 'security', [ 'find-certificate', '-a', '-p', keychain.path ]); + const now = new Date(); + let p = stdout.indexOf(BEGIN); + let q; + + while (p !== -1) { + q = stdout.indexOf(END, p); + + if (q !== -1) { + try { + const pem = stdout.substring(p, q + END.length); + const certObj = certificateFromPem(pem); + const commonName = certObj.subject.getField('CN'); + + if (commonName) { + const fullname = decodeOctalUTF8(commonName.value); + const { notBefore, notAfter } = certObj.validity; + const expired = notAfter < now; + + if (fullname !== wwdrName) { + const m = fullname.match(certRegExp); + if (m) { + const team = certObj.subject.attributes.find(attr => attr.name === 'organizationalUnitName'); + const cert = stdout.substring(p + BEGIN.length, q).replace(/\n/g, ''); + certs[m[1] ? 'developer' : 'distribution'].push({ + name: m[3], + fullname, + cert, + hash: sha1(cert), + before: notBefore, + after: notAfter, + expired, + invalid: expired || notBefore > now, + keychain: keychain.path, + teamId: team && team.value + }); + } + } else if (!expired) { + certs.wwdr = true; + } + } + } catch (e) { + // skip + } + } + + p = stdout.indexOf(BEGIN, q + END.length); + } + }))); + + return certs; + }); +} + +export default getCerts; diff --git a/src/devices.js b/src/devices.js new file mode 100644 index 0000000..5a6553c --- /dev/null +++ b/src/devices.js @@ -0,0 +1,42 @@ +let iosDevice; + +/** + * Device information. + */ +export class Device { + /** + * Sets the device information. + * + * @param {Object} [info] - The device info. + * @access public + */ + constructor(info = {}) { + Object.assign(this, info); + } +} + +/** + * Detects all attached devices. + * + * @returns {Array.} + */ +export function list() { + if (!iosDevice) { + iosDevice = require('node-ios-device'); + } + return iosDevice.list().map(d => new Device(d)); +} + +/** + * Starts listening for devices being connected or disconnected. + * + * @returns {WatchDeviceHandle} + */ +export function watch() { + if (!iosDevice) { + iosDevice = require('node-ios-device'); + } + const handle = iosDevice.watch(); + handle.on('change', devices => handle.emit('devices', devices.map(d => new Device(d)))); + return handle; +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..1440100 --- /dev/null +++ b/src/index.js @@ -0,0 +1,24 @@ +/* istanbul ignore if */ +if (!Error.prepareStackTrace) { + require('source-map-support/register'); +} + +export { default as options } from './options'; + +import * as certs from './certs'; +import * as devices from './devices'; +import * as keychains from './keychains'; +import * as provisioning from './provisioning'; +import * as simulator from './simulator'; +import * as teams from './teams'; +import * as xcode from './xcode'; + +export { + certs, + devices, + keychains, + provisioning, + simulator, + teams, + xcode +}; diff --git a/src/keychains.js b/src/keychains.js new file mode 100644 index 0000000..cd757db --- /dev/null +++ b/src/keychains.js @@ -0,0 +1,34 @@ +import options from './options'; +import path from 'path'; + +import { cache, get } from 'appcd-util'; +import { run } from 'appcd-subprocess'; + +export const keychainMetaFile = '~/Library/Preferences/com.apple.security.plist'; + +/** + * Returns a list of all keychains found. + * + * @param {Boolean} [force=false] - When `true`, bypasses cache and forces redetection. + * @returns {Promise} + */ +export function getKeychains(force) { + return cache('ioslib:keychains', force, async () => { + const { stdout } = await run(get(options, 'executables.security') || 'security', [ 'list-keychains' ]); + const keychains = []; + + for (const line of stdout.split('\n')) { + const m = line.match(/^\s*"(.+)"\s*$/); + if (m) { + keychains.push({ + path: m[1], + name: path.basename(m[1]).replace(/\.keychain$/, '') + }); + } + } + + return keychains; + }); +} + +export default getKeychains; diff --git a/src/options.js b/src/options.js new file mode 100644 index 0000000..b0b1418 --- /dev/null +++ b/src/options.js @@ -0,0 +1,24 @@ +/** + * A list of options that can be changed by the parent program. + * @type {Object} + */ +const options = { + env: { + path: null + }, + executables: { + security: 'security', + xcodeSelect: 'xcode-select' + }, + provisioning: { + path: null + }, + simulator: { + devicesDir: null + }, + xcode: { + searchPaths: null + } +}; + +export default options; diff --git a/src/provisioning.js b/src/provisioning.js new file mode 100644 index 0000000..aabe603 --- /dev/null +++ b/src/provisioning.js @@ -0,0 +1,186 @@ +import fs from 'fs'; +import options from './options'; +import path from 'path'; +import plist from 'simple-plist'; + +import { cache, get, sha1 } from 'appcd-util'; +import { expandPath } from 'appcd-path'; +import { isFile } from 'appcd-fs'; + +const ppRegExp = /\.mobileprovision$/; + +/** + * The default provisioning profile directory. + * @type {String} + */ +const defaultProvisioningProfileDir = '~/Library/MobileDevice/Provisioning Profiles'; + +/** + * Returns the path to the provisioning profiles directory. + * + * @returns {String} + */ +export function getProvisioningProfileDir() { + return get(options, 'provisioning.path') || defaultProvisioningProfileDir; +} + +/** + * Detects all provisioning profiles and sorts them into an object by type. + * + * @param {Boolean} [force=false] - When `true`, bypasses cache and forces redetection. + * @param {String} [dir] - The directory to scan for provisioning profiles. + * @returns {Promise} + */ +export async function getProvisioningProfiles(force, dir) { + return cache('ioslib:provisioning', force, async () => { + const profiles = { + adhoc: [], + development: [], + distribution: [], + enterprise: [] + }; + + try { + const files = await findProvisioningProfileFiles(dir); + + await Promise.all(files.map(async (file) => { + try { + const profile = await parseProvisioningProfileFile(file); + profiles[profile.type].push(profile); + } catch (e) { + // ignore + } + })); + } catch (e) { + // squelch + } + + return profiles; + }); +} + +/** + * Finds all provisioning profiles in the specified directory. + * + * @param {String} [provisioningProfileDir] - The directory to scan for provisioning profiles. + * Defaults to the user's default provisioning profiles directory. + * @returns {Promise>} + */ +export function findProvisioningProfileFiles(provisioningProfileDir) { + return new Promise((resolve, reject) => { + const dir = expandPath(provisioningProfileDir || getProvisioningProfileDir()); + + fs.readdir(dir, (err, filenames) => { + if (err && err.code === 'ENOENT') { + return reject(new Error(`Provisioning profile directory does not exist: ${dir}`)); + } else if (err) { + return reject(err); + } + + const files = []; + for (const filename of filenames) { + if (ppRegExp.test(filename)) { + const file = path.join(dir, filename); + if (isFile(file)) { + files.push(file); + } + } + } + + resolve(files); + }); + }); +} + +/** + * Parses the specified provisioining profile and returns the information. Note that not all data in + * the provisioning profile is returned. + * + * @param {String} file - The full path to the provisioning profile to parse. + * @returns {Promise} + */ +export function parseProvisioningProfileFile(file) { + return new Promise((resolve, reject) => { + fs.readFile(file, 'utf8', (err, contents) => { + if (err && err.code === 'ENOENT') { + return reject(new Error(`Provisioning profile does not exist: ${file}`)); + } else if (err) { + return reject(err); + } + + const i = contents.indexOf(''); + + if (j === -1) { + return reject(new Error('Failed to parse provisioning profile: no plist found')); + } + + let data; + const write = console._stderr && console._stderr.write; + if (write) { + console._stderr.write = () => {}; + } + try { + data = plist.parse(contents.substring(i, j + 8), path.basename(file)); + } catch (e) { + return reject(new Error(`Unable to parse provisioning profile: ${e.message}`)); + } finally { + if (write) { + console._stderr.write = write; + } + } + + const entitlements = data.Entitlements || {}; + const teamIds = Array.isArray(data.TeamIdentifier) ? data.TeamIdentifier : null; + + let type = 'development'; + if (data.ProvisionedDevices) { + if (!entitlements['get-task-allow']) { + // ad hoc + type = 'adhoc'; + } + } else if (data.ProvisionsAllDevices) { + // enterprise ad hoc + type = 'enterprise'; + } else { + // app store + type = 'distribution'; + } + + let expired = false; + try { + if (data.ExpirationDate) { + expired = new Date(data.ExpirationDate) < new Date(); + } + } catch (e) { + // assume bad date is valid + } + + const certs = {}; + if (Array.isArray(data.DeveloperCertificates)) { + for (const cert of data.DeveloperCertificates) { + const value = cert.toString('base64'); + const hash = sha1(value); + certs[hash] = value; + } + } + + resolve({ + file, + name: data.Name, + uuid: data.UUID, + type, + creationDate: data.CreationDate, + expirationDate: data.ExpirationDate, + expired, + managed: data.Name.indexOf('iOS Team Provisioning Profile') !== -1, + certs, + devices: data.ProvisionedDevices || null, + entitlements, + teamIds, + teamId: teamIds && teamIds[0] || null, + teamName: data.TeamName || null + }); + }); + }); +} diff --git a/src/simctl.js b/src/simctl.js new file mode 100644 index 0000000..d14d639 --- /dev/null +++ b/src/simctl.js @@ -0,0 +1,97 @@ +import { run } from 'appcd-subprocess'; +import { sleep } from 'appcd-util'; + +/** + * Wrapper around executing the `simctl` utility that ships with Xcode. + */ +export default class Simctl { + /** + * Sets the simctl executable path. + * + * @param {String} bin - The path to the `simctl` executable. + * @access public + */ + constructor(bin) { + this.bin = bin; + } + + /** + * Lists all simulator runtimes, device types, devices, and device pairs. + * + * @param {Number} [maxTries] - The maximum number of times to retry the "list" command before + * giving up. + * @returns {Promise} + * @access public + */ + list(maxTries) { + return this.trySimctl([ 'list', '--json' ], maxTries) + .then(output => { + // we trim off everything before the first '{' just in case simctl outputs some + // garbage + const json = JSON.parse(output.substring(output.indexOf('{'))); + + // convert the pairs from -> (ios sim + watch sim) to + // -> -> + const stateRegExp = /^\(((?:in)?active),/; + json.iosSimToWatchSimToPair = {}; + Object.keys(json.pairs).forEach(function (pairUdid) { + var pair = json.pairs[pairUdid]; + var m = pair.state.match(stateRegExp); + if (m) { + if (!json.iosSimToWatchSimToPair[pair.phone.udid]) { + json.iosSimToWatchSimToPair[pair.phone.udid] = {}; + } + json.iosSimToWatchSimToPair[pair.phone.udid][pair.watch.udid] = { + udid: pairUdid, + active: m[1] === 'active' + }; + } + }); + + return json; + }); + } + + /** + * Attempts to run `simctl`. + * + * @param {Array.} args - The arguments to pass to the `simctl` command. + * @param {Number} [maxTries=4] - The maximum number of times to retry the `simctl` command + * before giving up. We need this because if we call a `simctl` for a different Xcode than the + * last time, it needs to shutdown the old CoreSimulatorService and start the new one which can + * cause `simctl` to fail. + * @returns {Promise} Resolves the output from the `simctl` command. + * @access private + */ + trySimctl(args, maxTries) { + let timeout = 100; + + const attempt = async (remainingTries) => { + if (remainingTries < 0) { + throw new Error('Failed to run simctl'); + } + + try { + const { stdout } = await run(this.bin, args); + return stdout.trim(); + } catch (e) { + if (e.code === 161 || e.code === 37 && /This pair is already active/i.test(e.message)) { + throw e; + } + + if (/Failed to load CoreSimulatorService/i.test(e.message)) { + // simctl needs to switch the CoreSimulatorService, waiting a couple seconds + await sleep(2000); + return attempt(remainingTries - 1); + } + + await sleep(timeout); + timeout *= 2; + + return attempt(remainingTries - 1); + } + }; + + return attempt(Math.max(maxTries || 4, 1)); + } +} diff --git a/src/simulator.js b/src/simulator.js new file mode 100644 index 0000000..f5ccc6e --- /dev/null +++ b/src/simulator.js @@ -0,0 +1,466 @@ +import fs from 'fs'; +import options from './options'; +import path from 'path'; +import plist from 'simple-plist'; +import version from './version'; +import Xcode from './xcode'; + +import { arrayify, cache, get } from 'appcd-util'; +import { expandPath } from 'appcd-path'; +import { isDir } from 'appcd-fs'; + +/** + * A lookup table of Xcode supported iOS Simulators and watchOS Simulator device pairs. + * + * This table MUST be maintained! + * + * The actual device pairing is done by the CoreSimulator private framework and thus there's no way + * to know definitively what the valid device pairs are. + * + * @type {Object} + */ +export const devicePairCompatibility = { + '>=6.2 <7.0': { // Xcode 6.2, 6.3, 6.4 + '>=8.2 <9.0': { // iOS 8.2, 8.3, 8.4 + '1.x': true // watchOS 1.0 + } + }, + '7.x': { // Xcode 7.x + '>=8.2 <9.0': { // iOS 8.2, 8.3, 8.4 + '1.x': true // watchOS 1.0 + }, + '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 + '>=2.0 <=2.1': true // watchOS 2.0, 2.1 + }, + '>=9.3 <10': { // iOS 9.3 + '2.2': true // watchOS 2.2 + } + }, + '8.x': { // Xcode 8.x + '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 + '>=2.0 <=2.1': true // watchOS 2.0, 2.1 + }, + '>=9.3 <10': { // iOS 9.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '10.x': { // iOS 10.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + } + }, + '9.x': { // Xcode 9.x + '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 + '>=2.0 <=2.1': true // watchOS 2.0, 2.1 + }, + '>=9.3 <10': { // iOS 9.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '10.x': { // iOS 10.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '11.x': { // iOS 11.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true // watchOS 4.x + } + }, + '10.x <10.3': { // Xcode 10.0-10.2.1 + '8.x': {}, // iOS 8.x + '>=9.0 <=9.2': { // iOS 9.0, 9.1, 9.2 + '>=2.0 <=2.1': true // watchOS 2.0, 2.1 + }, + '>=9.3 <10': { // iOS 9.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '>=10.0 <=10.2': { // iOS 10.0, 10.1, 10.2 + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '>=10.3 <11': { // iOS 10.3 + '3.x': true // watchOS 3.x + }, + '11.x': { // iOS 11.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true // watchOS 4.x + }, + '12.x': { // iOS 12.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true, // watchOS 4.x + '5.x': true // watchOS 5.x + } + }, + '>=10.3 <11': { // Xcode 10.3 + '>=10.3 <11': { // iOS 10.3 + '3.x': true // watchOS 3.x + }, + '11.x': { // iOS 11.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true // watchOS 4.x + }, + '12.x': { // iOS 12.x + '4.x': true, // watchOS 4.x + '5.x': true // watchOS 5.x + } + }, + '11.x': { // Xcode 11.x + '>=10.3 <11': { // iOS 10.3 + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '11.x': { // iOS 11.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true // watchOS 4.x + }, + '12.x': { // iOS 12.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true // watchOS 6.x + }, + '13.x': { // iOS 13.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true // watchOS 6.x + } + }, + '12.x': { // Xcode 12.x + '>=10.3 <11': { // iOS 10.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '11.x': { // iOS 11.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true // watchOS 4.x + }, + '12.x': { // iOS 12.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true // watchOS 7.x + }, + '13.x': { // iOS 13.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true // watchOS 7.x + }, + '14.x': { // iOS 14.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true // watchOS 7.x + } + }, + '13.x': { // Xcode 13.x + '>=10.3 <11': { // iOS 10.x + '2.2': true, // watchOS 2.2 + '3.x': true // watchOS 3.x + }, + '11.x': { // iOS 11.x + '>=3.2 <4.0': true, // watchOS 3.2 + '4.x': true // watchOS 4.x + }, + '12.x': { // iOS 12.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true, // watchOS 7.x + '8.x': true // watchOS 8.x + }, + '13.x': { // iOS 13.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true, // watchOS 7.x + '8.x': true // watchOS 8.x + }, + '14.x': { // iOS 14.x + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true, // watchOS 7.x + '8.x': true // watchOS 8.x + }, + '15.x': { + '4.x': true, // watchOS 4.x + '5.x': true, // watchOS 5.x + '6.x': true, // watchOS 6.x + '7.x': true, // watchOS 7.x + '8.x': true // watchOS 8.x + } + }, + '14.x': { // Xcode 14.x + '12.x': { // iOS 12.x + '7.x': true, // watchOS 7.x + '8.x': true, // watchOS 8.x + '9.x': true // watchOS 9.x + }, + '13.x': { // iOS 13.x + '7.x': true, // watchOS 7.x + '8.x': true, // watchOS 8.x + '9.x': true // watchOS 9.x + }, + '14.x': { // iOS 14.x + '7.x': true, // watchOS 7.x + '8.x': true, // watchOS 8.x + '9.x': true // watchOS 9.x + }, + '15.x': { + '7.x': true, // watchOS 7.x + '8.x': true, // watchOS 8.x + '9.x': true // watchOS 9.x + }, + '16.x': { + '7.x': true, // watchOS 7.x + '8.x': true, // watchOS 8.x + '9.x': true // watchOS 9.x + } + } +}; + +/** + * The path to the directory containing the simulator devices. + * @type {String} + */ +const defaultDevicesDir = '~/Library/Developer/CoreSimulator/Devices'; + +/** + * The path to the `device_set.plist` that contains all the simulators. `ioslib` does not parse this + * file because the CoreSimulator service has a track record of not reporting (via `simctl`) the + * same info that are in this file. + * @type {String} + */ +const defaultDeviceSetFile = '~/Library/Developer/CoreSimulator/Devices/device_set.plist'; + +/** + * Returns the path to the directory containing all of the simulators. + * + * @returns {String} + */ +export function getDevicesDir() { + return expandPath(get(options, 'simulator.devicesDir') || defaultDevicesDir); +} + +/** + * Returns the path to the plist containing the list of simulators and their pairings. + * + * @returns {String} + */ +export function getDeviceSetFile() { + return expandPath(get(options, 'simulator.deviceSetFile') || defaultDeviceSetFile); +} + +/** + * The simulator base class. + */ +export class Simulator { + constructor(params) { + Object.assign(this, params); + } +} + +/** + * Describes an iOS Simulator. + */ +export class iOSSimulator extends Simulator { + type = 'ios'; +} + +/** + * Describes an watchOS Simulator. + */ +export class watchOSSimulator extends Simulator { + type = 'watchos'; +} + +/** + * A map of simulator types to the corresponding simulator class. + * @type {Object} + */ +const typeMap = { + ios: iOSSimulator, + watchos: watchOSSimulator +}; + +/** + * A cached regex that parses the simulator type from the runtime. + * For example, an iOS 10.3 simulator uses a `com.apple.CoreSimulator.SimRuntime.iOS-10-3` runtime. + * @type {RegExp} + */ +const typeRegExp = /\.(\w+)(?:-\d+)*$/; + +/** + * Detects iOS and watchOS simulators. + * + * @param {Object} [opts] - Various options. + * @param {Boolean} [opts.force=false] - When `true`, bypasses cache and forces redetection. + * @returns {Promise>} + */ +export function getSimulators({ force } = {}) { + return cache('ioslib:simulators', force, () => { + const simDevicesPath = getDevicesDir(); + const results = []; + + if (isDir(simDevicesPath)) { + for (const dirname of fs.readdirSync(simDevicesPath)) { + try { + const deviceDir = path.join(simDevicesPath, dirname); + const deviceInfo = plist.readFileSync(path.join(deviceDir, 'device.plist')); + const info = { + deviceDir, + deviceType: deviceInfo.deviceType, + name: deviceInfo.name, + runtime: deviceInfo.runtime, + udid: deviceInfo.UDID + }; + + if (dirname !== info.udid) { + // sanity check + continue; + } + + const m = info.runtime.match(typeRegExp); + if (!m) { + // can't figure out if it's a iOS or watchOS simulator + continue; + } + + switch (m[1].toLowerCase()) { + case 'ios': + results.push(new iOSSimulator(info)); + break; + case 'watchos': + results.push(new watchOSSimulator(info)); + break; + } + } catch (e) { + // squelch + } + } + } + + return results; + }); +} + +/** + * Generates an object with iOS and watchOS Simulators sorted and with all details populated. + * + * @param {Object} params - Various required parameters. + * @param {Simulator|Array} params.simulators - An array of Simulator objects. + * @param {Xcode|Array|Object} params.xcodes - An array of Xcode objects. + * @returns {Promise} + */ +export function generateSimulatorRegistry({ simulators, xcodes }) { + simulators = arrayify(simulators).filter(sim => sim instanceof iOSSimulator || sim instanceof watchOSSimulator); + + // coerce `xcodes` into something we can work with + if (xcodes instanceof Xcode) { + xcodes = { + [xcodes.id]: xcodes + }; + } else if (Array.isArray(xcodes)) { + const tmp = {}; + for (const xcode of xcodes) { + if (xcode instanceof Xcode) { + tmp[xcode.id] = xcode; + } + } + xcodes = tmp; + } else if (!xcodes || typeof xcodes !== 'object') { + xcodes = {}; + } + + const unsorted = { + ios: {}, + watchos: {} + }; + + // loop over each simulator, then loop over each xcode and try to find the sim runtime and + // populate the simulator details + for (let orig of simulators) { + const type = orig instanceof iOSSimulator ? 'ios' : 'watchos'; + + // copy the simulator + let sim; + + for (const xcode of Object.values(xcodes)) { + const runtime = xcode.simRuntimes[orig.runtime]; + const deviceType = xcode.simDeviceTypes[orig.deviceType]; + + if (!runtime || !deviceType) { + continue; + } + + if (!sim) { + sim = new typeMap[type](orig); + sim.deviceName = deviceType.name; + sim.family = deviceType.model.replace(/[\W0-9]/g, '').toLowerCase(); + sim.model = deviceType.model; + sim.runtimeName = runtime.name; + type === 'ios' && (sim.supportsWatch = {}); + sim.supportsXcode = {}; + sim.version = runtime.version; + type === 'ios' && (sim.watchCompanion = {}); + sim.simctl = xcode.executables.simctl; + sim.simulator = type === 'ios' ? xcode.executables.simulator : xcode.executables.watchsimulator; + + if (!unsorted[type][sim.version]) { + unsorted[type][sim.version] = []; + } + unsorted[type][sim.version].push(sim); + } + + sim.supportsXcode[xcode.id] = true; + if (type === 'ios') { + sim.supportsWatch[xcode.id] = deviceType.supportsWatch; + } + } + } + + // for iOS Simulators only, build the lookup of compatible watch companions + for (const sims of Object.values(unsorted.ios)) { // array sim handles + for (const sim of sims) { // sim handle + for (const xcodeId of Object.keys(sim.supportsWatch).filter(xcodeId => sim.supportsWatch[xcodeId])) { // 11.0:11A419c + const xcode = xcodes[xcodeId]; + for (const iosRange of Object.keys(xcode.simDevicePairs)) { // 13.x + if (version.satisfies(sim.version, iosRange)) { + for (const watchosRange of Object.keys(xcode.simDevicePairs[iosRange])) { // 6.x + if (xcode.simDevicePairs[iosRange][watchosRange]) { + for (const watchVersion of Object.keys(unsorted.watchos)) { // 6.x + for (const watchSim of unsorted.watchos[watchVersion]) { // watch sim handle + if (version.satisfies(watchSim.version, watchosRange)) { + if (!sim.watchCompanion[xcodeId]) { + sim.watchCompanion[xcodeId] = [ watchSim.udid ]; + } else if (!sim.watchCompanion[xcodeId].includes(watchSim.udid)) { + sim.watchCompanion[xcodeId].push(watchSim.udid); + } + } + } + } + } + } + } + } + } + } + } + + // sort the simulators + const compareSims = (a, b) => { + return a.model < b.model ? -1 : a.model > b.model ? 1 : 0; + }; + const sorted = { + ios: {}, + watchos: {} + }; + for (const type of Object.keys(unsorted)) { + for (const ver of Object.keys(unsorted[type]).sort(version.compare)) { + sorted[type][ver] = unsorted[type][ver].sort(compareSims); + } + } + + return sorted; +} diff --git a/src/teams.js b/src/teams.js new file mode 100644 index 0000000..5c1b455 --- /dev/null +++ b/src/teams.js @@ -0,0 +1,49 @@ +import { getProvisioningProfiles } from './provisioning'; +import { cache } from 'appcd-util'; + +/** + * Aggregates all teams found in the provisioning profiles. + * + * @param {Boolean} [force=false] - When `true`, bypasses cache and forces redetection. + * @param {String} [dir] - The directory to scan for provisioning profiles. + * @returns {Promise} + */ +export function getTeams(force, dir) { + return cache('ioslib:teams', force, async () => { + const profiles = await getProvisioningProfiles(force, dir); + return buildTeamsFromProvisioningProfiles(profiles); + }); +} + +/** + * Creates a map of team ids to the team name based on the list of provided provisioning profiles. + * + * @param {Object} profiles - An object of profile types to profile objects. + * @returns {Object} + */ +export function buildTeamsFromProvisioningProfiles(profiles) { + if (!profiles || typeof profiles !== 'object') { + throw new TypeError('Expected profiles list to be an object'); + } + + const teams = {}; + + for (const type of Object.keys(profiles)) { + if (Array.isArray(profiles[type])) { + for (const profile of profiles[type]) { + if (Array.isArray(profile.teamIds)) { + for (const id of profile.teamIds) { + if (id) { + teams[id] = id; + } + } + } + if (profile.teamId) { + teams[profile.teamId] = profile.teamName || profile.teamId; + } + } + } + } + + return teams; +} diff --git a/src/version.js b/src/version.js new file mode 100644 index 0000000..4038de7 --- /dev/null +++ b/src/version.js @@ -0,0 +1,77 @@ +import semver from 'semver'; + +function format(ver, min, max, chopDash) { + ver = ('' + (ver || 0)); + if (chopDash) { + ver = ver.replace(/(-.*)?$/, ''); + } + ver = ver.split('.'); + if (min !== undefined) { + while (ver.length < min) { + ver.push('0'); + } + } + if (max !== undefined) { + ver = ver.slice(0, max); + } + return ver.join('.'); +} + +function eq(v1, v2) { + return semver.eq(format(v1, 3, 3), format(v2, 3, 3)); +} + +function gte(v1, v2) { + return semver.gte(format(v1, 3, 3), format(v2, 3, 3)); +} + +function gt(v1, v2) { + return semver.gt(format(v1, 3, 3), format(v2, 3, 3)); +} + +function lte(v1, v2) { + return semver.lte(format(v1, 3, 3), format(v2, 3, 3)); +} + +function lt(v1, v2) { + return semver.lt(format(v1, 3, 3), format(v2, 3, 3)); +} + +function compare(v1, v2) { + return eq(v1, v2) ? 0 : lt(v1, v2) ? -1 : 1; +} + +function rcompare(v1, v2) { + return eq(v1, v2) ? 0 : lt(v1, v2) ? 1 : -1; +} + +function satisfies(ver, str) { + ver = format(ver, 3, 3, true); + str = str.replace(/(<=?\d+(\.\d+)*?)\.x/g, '$1.99999999').replace(/(>=?\d+(\.\d+)*?)\.x/g, '$1.0'); + try { + if (str === '*' || eq(ver, str)) { + return true; + } + } catch (ex) { + // squelch + } + + return str.split(/\s*\|\|\s*/).some(function (range) { + // semver is picky with the '-' in comparisons and it just so happens when it + // parses versions in the range, it will add '-0' and cause '1.0.0' != '1.0.0-0', + // so we test our version with and without the '-9' + return range === '*' || semver.satisfies(ver, range) || (ver.indexOf('-') === -1 && semver.satisfies(ver + '-0', range)); + }); +} + +export default { + format, + eq, + gte, + gt, + lte, + lt, + compare, + rcompare, + satisfies +}; diff --git a/src/xcode.js b/src/xcode.js new file mode 100644 index 0000000..ceb3c3b --- /dev/null +++ b/src/xcode.js @@ -0,0 +1,366 @@ +import fs from 'fs'; +import options from './options'; +import path from 'path'; +import plist from 'simple-plist'; +import Simctl from './simctl'; +import version from './version'; + +import { arrayify, cache, get } from 'appcd-util'; +import { devicePairCompatibility } from './simulator'; +import { expandPath } from 'appcd-path'; +import { isDir, isFile } from 'appcd-fs'; +import { run, which } from 'appcd-subprocess'; +import { spawnSync } from 'child_process'; + +/** + * Directories to scan for Xcode installations. + * @type {Array.} + */ +export const xcodeLocations = [ + '/Applications', + '~/Applications' +]; + +/** + * The path to the global directory containing the device types and runtimes. This is mostly for + * legacy Xcode versions. Newer versions install runtimes in Xcode app directory. + * @type {String} + */ +export const globalSimProfilesPath = '/Library/Developer/CoreSimulator/Profiles'; + +/** + * The path to the global Xcode license file. It tracks the license acceptance for GM (golden + * master) and beta releases. + * @type {String} + */ +export const globalLicenseFile = '/Library/Preferences/com.apple.dt.Xcode.plist'; + +/** + * The path to the user Xcode license file. It tracks the license acceptance for GM (golden + * master) and beta releases. + * @type {String} + */ +export const userLicenseFile = '~/Library/Preferences/com.apple.dt.Xcode.plist'; + +/** + * Xcode information object. + */ +export class Xcode { + /** + * Checks if the specified directory is an Xcode. + * + * @param {String} dir - The directory to check. + * @access public + */ + constructor(dir) { + if (typeof dir !== 'string' || !dir) { + throw new TypeError('Expected directory to be a valid string'); + } + + dir = expandPath(dir); + if (!isDir(dir)) { + throw new Error('Directory does not exist'); + } + + let xcodebuild = path.join(dir, 'usr', 'bin', 'xcodebuild'); + if (!isFile(xcodebuild)) { + xcodebuild = path.join(dir, 'Developer', 'usr', 'bin', 'xcodebuild'); + } + if (!isFile(xcodebuild)) { + xcodebuild = path.join(dir, 'Contents', 'Developer', 'usr', 'bin', 'xcodebuild'); + } + if (!isFile(xcodebuild)) { + throw new Error('"xcodebuild" not found'); + } + + // now that we've found xcodebuild, trim off all the directories to get us to the Xcode path + dir = path.resolve(path.dirname(xcodebuild), '../..'); + + const versionPlistFile = path.resolve(dir, '../version.plist'); + if (!isFile(versionPlistFile)) { + throw new Error('"version.plist" not found'); + } + const versionPlist = plist.readFileSync(versionPlistFile); + + if (version.lt(versionPlist.CFBundleShortVersionString, 6)) { + throw new Error(`Found Xcode ${versionPlist.CFBundleShortVersionString}, but it is too old and unsupported`); + } + + Object.defineProperty(this, 'simctl', { + configurable: true, + value: new Simctl(path.join(dir, 'usr/bin/simctl')) + }); + + this.path = dir; + this.xcodeapp = path.resolve(dir, '../..'); + this.version = versionPlist.CFBundleShortVersionString; + this.build = versionPlist.ProductBuildVersion; + this.id = `${this.version}:${this.build}`; + this.executables = { + simctl: this.simctl.bin, + simulator: null, + watchsimulator: null, + xcodebuild + }; + this.eulaAccepted = spawnSync(xcodebuild, [ '-checkFirstLaunchStatus' ]).status === 0; + this.coreSimulatorProfilesPaths = []; + this.sdks = { + ios: this.findSDKs('iPhoneOS'), + watchos: this.findSDKs('WatchOS') + }; + this.simDeviceTypes = {}; + this.simRuntimes = {}; + this.simDevicePairs = {}; + + for (const xcodeRange of Object.keys(devicePairCompatibility)) { + if (version.satisfies(this.version, xcodeRange)) { + this.simDevicePairs = devicePairCompatibility[xcodeRange]; + break; + } + } + + // loop over the names and scan the derived path for simulator device types and runtimes + // note: Xcode 9 moved CoreSimulator into the "xxxxOS" directory instead of the "xxxxSimulator" directory + this.findDeviceTypesAndRuntimes(globalSimProfilesPath, true); + for (const name of [ 'iPhoneSimulator', 'iPhoneOS', 'WatchSimulator', 'WatchOS' ]) { + // Xcode 10 and older + this.findDeviceTypesAndRuntimes(path.join(this.path, `Platforms/${name}.platform/Developer/Library/CoreSimulator/Profiles`)); + + // Xcode 11 and newer + this.findDeviceTypesAndRuntimes(path.join(this.path, `Platforms/${name}.platform/Library/Developer/CoreSimulator/Profiles`)); + } + + // remove any simulator runtime versions that are not compatible wit this version of xcode + for (const [ runtime, runtimeInfo ] of Object.entries(this.simRuntimes)) { + let valid = false; + + // remove any iOS runtimes that are not compatible wit this version of xcode + if (/ios/i.test(runtimeInfo.name)) { + for (const iosRange of Object.keys(this.simDevicePairs)) { + if (version.satisfies(runtimeInfo.version, iosRange)) { + valid = true; + break; + } + } + } else if (/watchos/i.test(runtimeInfo.name)) { + // loop through the watch version ranges in the compatibility matrix, + // if the runtime version satisfies ant of the constraints then it's valid + for (const watchosVersions of Object.values(this.simDevicePairs)) { + for (const watchosRange of Object.keys(watchosVersions)) { + if (version.satisfies(runtimeInfo.version, watchosRange)) { + valid = true; + break; + } + } + if (valid) { + break; + } + } + } + + if (!valid) { + delete this.simRuntimes[runtime]; + } + } + + for (const name of [ 'Simulator', 'iOS Simulator' ]) { + const app = path.join(this.path, `Applications/${name}.app/Contents/MacOS/${name}`); + if (isFile(app)) { + this.executables.simulator = app; + break; + } + } + + if (version.gte(this.version, 9)) { + // there's no more watch simulator + this.executables.watchsimulator = this.executables.simulator; + } else { + const app = path.join(dir, 'Applications/Simulator (Watch).app/Contents/MacOS/Simulator (Watch)'); + if (isFile(app)) { + this.executables.watchsimulator = app; + } + } + } + + /** + * Detects all SDK versions in the current Xcode path and the specified SDK type name. + * + * @param {String} sdkTypeName - The name of the SDK to scan. + * @returns {Array.} + * @access private + */ + findSDKs(sdkTypeName) { + const dir = path.join(this.path, `Platforms/${sdkTypeName}.platform/Developer/SDKs`); + + if (!isDir(dir)) { + return []; + } + + const nameRegExp = new RegExp(`^${sdkTypeName}(.*).sdk$`); + const results = new Set(); + + for (const name of fs.readdirSync(dir)) { + const m = name.match(nameRegExp); + const subdir = m && path.join(dir, name); + if (!m || !isDir(subdir)) { + continue; + } + let ver = m[1] || null; + try { + const plistFile = path.join(subdir, 'System/Library/CoreServices/SystemVersion.plist'); + const info = plist.readFileSync(plistFile); + if (info.ProductVersion) { + ver = info.ProductVersion; + } + } catch (e) { + // squelch + } + results.add(ver); + } + + return Array.from(results).sort(version.rcompare); + } + + /** + * Finds all simulator device types and runtimes in the given Xcode dir. + * + * @param {String} dir - The directory to scan for device types and runtimes. + * @param {Boolean} isGlobal - Indicates if `dir` is the global simulator profiles path. + * @access private + */ + findDeviceTypesAndRuntimes(dir, isGlobal) { + if (!isDir(dir)) { + return; + } + + if (!isGlobal) { + // add the path + this.coreSimulatorProfilesPaths.push(dir); + } + + // device types + const deviceTypesDir = path.join(dir, 'DeviceTypes'); + if (isDir(deviceTypesDir)) { + for (const name of fs.readdirSync(deviceTypesDir)) { + try { + let info = plist.readFileSync(path.join(deviceTypesDir, name, 'Contents/Info.plist')); + const deviceType = { + name: info.CFBundleName, + model: 'unknown', + supportsWatch: false + }; + const id = info.CFBundleIdentifier; + + try { + info = plist.readFileSync(path.join(deviceTypesDir, name, 'Contents/Resources/profile.plist')); + if (info.modelIdentifier) { + deviceType.model = info.modelIdentifier; + } + } catch (e) { + // squelch + } + + try { + info = plist.readFileSync(path.join(deviceTypesDir, name, 'Contents/Resources/capabilities.plist')); + deviceType.supportsWatch = !!info.capabilities['watch-companion']; + } catch (e) { + // squelch + } + + this.simDeviceTypes[id] = deviceType; + } catch (e) { + // squelch + } + } + } + + // runtimes + const runtimesDir = path.join(dir, 'Runtimes'); + if (isDir(runtimesDir)) { + // regex to extract the version from the runtime name + const runtimeNameRegExp = /\s(\d+(?:\.\d+(?:\.\d+)?)?)$/; + + for (const name of fs.readdirSync(runtimesDir)) { + try { + let info = plist.readFileSync(path.join(runtimesDir, name, 'Contents/Info.plist')); + const runtime = { + name: info.CFBundleName, + version: null + }; + const id = info.CFBundleIdentifier; + const m = info.CFBundleName.match(runtimeNameRegExp); + if (m) { + runtime.version = m[1]; + } + + try { + info = plist.readFileSync(path.join(runtimesDir, name, 'Contents/Resources/profile.plist')); + if (!runtime.version || info.defaultVersionString.startsWith(runtime.version)) { + runtime.version = info.defaultVersionString; + } + } catch (e) { + // squelch + } + + this.simRuntimes[id] = runtime; + } catch (e) { + // squelch + } + } + } + } +} + +export default Xcode; + +/** + * Detects installed Xcodes, then caches and returns the results. + * + * @param {Object} [opts] - Various options. + * @param {Boolean} [opts.force=false] - When `true`, bypasses cache and forces redetection. + * @returns {Promise>} + */ +export function getXcodes({ force } = {}) { + return cache('ioslib:xcode', force, () => { + const results = {}; + const searchPaths = arrayify(get(options, 'xcode.searchPaths') || xcodeLocations, true); + + for (let dir of searchPaths) { + try { + const xcode = new Xcode(dir); + results[xcode.id] = xcode; + } catch (e) { + // not an Xcode, check subdirectories + if (isDir(dir = expandPath(dir))) { + for (const name of fs.readdirSync(dir)) { + try { + const xcode = new Xcode(path.join(dir, name)); + results[xcode.id] = xcode; + } catch (e2) { + // not an Xcode + } + } + } + } + } + + return results; + }); +} + +/** + * Determines the default Xcode path by running `xcode-select`. + * + * @returns {Promise} + */ +export async function getDefaultXcodePath() { + try { + const bin = await which(get(options, 'executables.xcodeselect') || 'xcode-select', { + path: get(options, 'env.path') + }); + const { stdout } = await run(bin, [ '--print-path' ]); + return path.resolve(stdout.trim(), '../..'); + } catch (e) { + return null; + } +} diff --git a/test/TestApp/TestApp.xcodeproj/project.pbxproj b/test/TestApp/TestApp.xcodeproj/project.pbxproj deleted file mode 100644 index 12d0e56..0000000 --- a/test/TestApp/TestApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,356 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 83D658AA19A00323009A9C56 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D658A919A00323009A9C56 /* Foundation.framework */; }; - 83D658AC19A00323009A9C56 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D658AB19A00323009A9C56 /* CoreGraphics.framework */; }; - 83D658AE19A00323009A9C56 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D658AD19A00323009A9C56 /* UIKit.framework */; }; - 83D658B419A00323009A9C56 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83D658B219A00323009A9C56 /* InfoPlist.strings */; }; - 83D658B619A00323009A9C56 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 83D658B519A00323009A9C56 /* main.m */; }; - 83D658BA19A00323009A9C56 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 83D658B919A00323009A9C56 /* AppDelegate.m */; }; - 83D658BD19A00323009A9C56 /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 83D658BB19A00323009A9C56 /* Main_iPhone.storyboard */; }; - 83D658C019A00323009A9C56 /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 83D658BE19A00323009A9C56 /* Main_iPad.storyboard */; }; - 83D658C319A00323009A9C56 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83D658C219A00323009A9C56 /* ViewController.m */; }; - 83D658C519A00323009A9C56 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 83D658C419A00323009A9C56 /* Images.xcassets */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - CE877F041AE038AE0048B8B6 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 83D658A619A00323009A9C56 /* TestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 83D658A919A00323009A9C56 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 83D658AB19A00323009A9C56 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 83D658AD19A00323009A9C56 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 83D658B119A00323009A9C56 /* TestApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TestApp-Info.plist"; sourceTree = ""; }; - 83D658B319A00323009A9C56 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 83D658B519A00323009A9C56 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 83D658B719A00323009A9C56 /* TestApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TestApp-Prefix.pch"; sourceTree = ""; }; - 83D658B819A00323009A9C56 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 83D658B919A00323009A9C56 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 83D658BC19A00323009A9C56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = ""; }; - 83D658BF19A00323009A9C56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPad.storyboard; sourceTree = ""; }; - 83D658C119A00323009A9C56 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 83D658C219A00323009A9C56 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 83D658C419A00323009A9C56 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 83D658A319A00323009A9C56 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D658AC19A00323009A9C56 /* CoreGraphics.framework in Frameworks */, - 83D658AE19A00323009A9C56 /* UIKit.framework in Frameworks */, - 83D658AA19A00323009A9C56 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 83D6589D19A00322009A9C56 = { - isa = PBXGroup; - children = ( - 83D658AF19A00323009A9C56 /* TestApp */, - 83D658A819A00323009A9C56 /* Frameworks */, - 83D658A719A00323009A9C56 /* Products */, - ); - sourceTree = ""; - }; - 83D658A719A00323009A9C56 /* Products */ = { - isa = PBXGroup; - children = ( - 83D658A619A00323009A9C56 /* TestApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 83D658A819A00323009A9C56 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 83D658A919A00323009A9C56 /* Foundation.framework */, - 83D658AB19A00323009A9C56 /* CoreGraphics.framework */, - 83D658AD19A00323009A9C56 /* UIKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 83D658AF19A00323009A9C56 /* TestApp */ = { - isa = PBXGroup; - children = ( - 83D658B819A00323009A9C56 /* AppDelegate.h */, - 83D658B919A00323009A9C56 /* AppDelegate.m */, - 83D658BB19A00323009A9C56 /* Main_iPhone.storyboard */, - 83D658BE19A00323009A9C56 /* Main_iPad.storyboard */, - 83D658C119A00323009A9C56 /* ViewController.h */, - 83D658C219A00323009A9C56 /* ViewController.m */, - 83D658C419A00323009A9C56 /* Images.xcassets */, - 83D658B019A00323009A9C56 /* Supporting Files */, - ); - path = TestApp; - sourceTree = ""; - }; - 83D658B019A00323009A9C56 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 83D658B119A00323009A9C56 /* TestApp-Info.plist */, - 83D658B219A00323009A9C56 /* InfoPlist.strings */, - 83D658B519A00323009A9C56 /* main.m */, - 83D658B719A00323009A9C56 /* TestApp-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 83D658A519A00323009A9C56 /* TestApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 83D658DB19A00323009A9C56 /* Build configuration list for PBXNativeTarget "TestApp" */; - buildPhases = ( - 83D658A219A00323009A9C56 /* Sources */, - 83D658A319A00323009A9C56 /* Frameworks */, - 83D658A419A00323009A9C56 /* Resources */, - CE877F041AE038AE0048B8B6 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TestApp; - productName = TestApp; - productReference = 83D658A619A00323009A9C56 /* TestApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83D6589E19A00323009A9C56 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0510; - ORGANIZATIONNAME = Appcelerator; - TargetAttributes = { - 83D658A519A00323009A9C56 = { - DevelopmentTeam = WY35J6ST95; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 83D658A119A00323009A9C56 /* Build configuration list for PBXProject "TestApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - English, - en, - Base, - ); - mainGroup = 83D6589D19A00322009A9C56; - productRefGroup = 83D658A719A00323009A9C56 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 83D658A519A00323009A9C56 /* TestApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 83D658A419A00323009A9C56 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D658C019A00323009A9C56 /* Main_iPad.storyboard in Resources */, - 83D658C519A00323009A9C56 /* Images.xcassets in Resources */, - 83D658BD19A00323009A9C56 /* Main_iPhone.storyboard in Resources */, - 83D658B419A00323009A9C56 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 83D658A219A00323009A9C56 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D658C319A00323009A9C56 /* ViewController.m in Sources */, - 83D658BA19A00323009A9C56 /* AppDelegate.m in Sources */, - 83D658B619A00323009A9C56 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 83D658B219A00323009A9C56 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 83D658B319A00323009A9C56 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 83D658BB19A00323009A9C56 /* Main_iPhone.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 83D658BC19A00323009A9C56 /* Base */, - ); - name = Main_iPhone.storyboard; - sourceTree = ""; - }; - 83D658BE19A00323009A9C56 /* Main_iPad.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 83D658BF19A00323009A9C56 /* Base */, - ); - name = Main_iPad.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 83D658D919A00323009A9C56 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.1; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 83D658DA19A00323009A9C56 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.1; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 83D658DC19A00323009A9C56 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TestApp/TestApp-Prefix.pch"; - INFOPLIST_FILE = "TestApp/TestApp-Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.testapp3; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 83D658DD19A00323009A9C56 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TestApp/TestApp-Prefix.pch"; - INFOPLIST_FILE = "TestApp/TestApp-Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.testapp3; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 83D658A119A00323009A9C56 /* Build configuration list for PBXProject "TestApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83D658D919A00323009A9C56 /* Debug */, - 83D658DA19A00323009A9C56 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83D658DB19A00323009A9C56 /* Build configuration list for PBXNativeTarget "TestApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83D658DC19A00323009A9C56 /* Debug */, - 83D658DD19A00323009A9C56 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83D6589E19A00323009A9C56 /* Project object */; -} diff --git a/test/TestApp/TestApp.xcodeproj/xcshareddata/xcschemes/TestApp.xcscheme b/test/TestApp/TestApp.xcodeproj/xcshareddata/xcschemes/TestApp.xcscheme deleted file mode 100644 index b02e2e1..0000000 --- a/test/TestApp/TestApp.xcodeproj/xcshareddata/xcschemes/TestApp.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestApp/TestApp/AppDelegate.h b/test/TestApp/TestApp/AppDelegate.h deleted file mode 100644 index b9b7e13..0000000 --- a/test/TestApp/TestApp/AppDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AppDelegate.h -// TestApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/test/TestApp/TestApp/AppDelegate.m b/test/TestApp/TestApp/AppDelegate.m deleted file mode 100644 index f904591..0000000 --- a/test/TestApp/TestApp/AppDelegate.m +++ /dev/null @@ -1,89 +0,0 @@ -// -// AppDelegate.m -// TestApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import "AppDelegate.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"TestApp.log"]; - freopen([logPath cStringUsingEncoding:NSUTF8StringEncoding], "w+", stderr); - fprintf(stderr, "[INFO] Application started\n"); - -#ifdef TEST_BASIC_LOGGING - NSLog(@"[INFO] info test"); - NSLog(@"[DEBUG] debug test"); - NSLog(@"[DEBUG] line 1 test\n[DEBUG] line 2 test"); - NSLog(@"[DEBUG] AUTO_EXIT"); -#endif - -#ifdef TEST_TIMOCHA - NSLog(@"[DEBUG] TI_MOCHA_RESULT_START"); - NSLog(@"[DEBUG] {\"foo\":\"bar\"}"); - NSLog(@"[DEBUG] TI_MOCHA_RESULT_STOP"); -#endif - -#ifdef TEST_TIMOCHA_MULTIPLE_LINES - NSLog(@"[DEBUG] TI_MOCHA_RESULT_START"); - NSLog(@"[DEBUG] {"); - NSLog(@"[DEBUG] \"foo\":\"bar\""); - NSLog(@"[DEBUG] }"); - NSLog(@"[DEBUG] TI_MOCHA_RESULT_STOP"); -#endif - -#ifdef TEST_TIMEOUT - // do nothing, we want to time out explicitly here -#endif - -#ifdef TEST_OBJC_CRASH - // force a crash (unrecognized selector) - SEL selector = NSSelectorFromString(@"pleaseCrash"); - [NSObject performSelector:selector]; -#endif - -#ifdef TEST_C_CRASH - // force a crash (divide by zero) - int *x = NULL; - *x = 99; -#endif - - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/test/TestApp/TestApp/Base.lproj/Main_iPad.storyboard b/test/TestApp/TestApp/Base.lproj/Main_iPad.storyboard deleted file mode 100644 index 4edef30..0000000 --- a/test/TestApp/TestApp/Base.lproj/Main_iPad.storyboard +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestApp/TestApp/Base.lproj/Main_iPhone.storyboard b/test/TestApp/TestApp/Base.lproj/Main_iPhone.storyboard deleted file mode 100644 index ce2c658..0000000 --- a/test/TestApp/TestApp/Base.lproj/Main_iPhone.storyboard +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestApp/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json b/test/TestApp/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 91bf9c1..0000000 --- a/test/TestApp/TestApp/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/test/TestApp/TestApp/Images.xcassets/LaunchImage.launchimage/Contents.json b/test/TestApp/TestApp/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index 6f870a4..0000000 --- a/test/TestApp/TestApp/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/test/TestApp/TestApp/TestApp-Info.plist b/test/TestApp/TestApp/TestApp-Info.plist deleted file mode 100644 index 314b9b1..0000000 --- a/test/TestApp/TestApp/TestApp-Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIMainStoryboardFile - Main_iPhone - UIMainStoryboardFile~ipad - Main_iPad - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/test/TestApp/TestApp/TestApp-Prefix.pch b/test/TestApp/TestApp/TestApp-Prefix.pch deleted file mode 100644 index a0c6545..0000000 --- a/test/TestApp/TestApp/TestApp-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/test/TestApp/TestApp/ViewController.h b/test/TestApp/TestApp/ViewController.h deleted file mode 100644 index f4cb4ca..0000000 --- a/test/TestApp/TestApp/ViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ViewController.h -// TestApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import - -@interface ViewController : UIViewController - -@end diff --git a/test/TestApp/TestApp/ViewController.m b/test/TestApp/TestApp/ViewController.m deleted file mode 100644 index cd16bfb..0000000 --- a/test/TestApp/TestApp/ViewController.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// ViewController.m -// TestApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import "ViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -@end diff --git a/test/TestApp/TestApp/en.lproj/InfoPlist.strings b/test/TestApp/TestApp/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/test/TestApp/TestApp/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/test/TestApp/TestApp/main.m b/test/TestApp/TestApp/main.m deleted file mode 100644 index cc87af6..0000000 --- a/test/TestApp/TestApp/main.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// main.m -// TestApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/test/TestWatchApp/TestWatchApp WatchKit App/Base.lproj/Interface.storyboard b/test/TestWatchApp/TestWatchApp WatchKit App/Base.lproj/Interface.storyboard deleted file mode 100644 index 367984c..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit App/Base.lproj/Interface.storyboard +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp WatchKit App/Images.xcassets/AppIcon.appiconset/Contents.json b/test/TestWatchApp/TestWatchApp WatchKit App/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2a9dea2..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit App/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "images" : [ - { - "size" : "24x24", - "idiom" : "watch", - "scale" : "2x", - "role" : "notificationCenter", - "subtype" : "38mm" - }, - { - "size" : "27.5x27.5", - "idiom" : "watch", - "scale" : "2x", - "role" : "notificationCenter", - "subtype" : "42mm" - }, - { - "size" : "29x29", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "watch", - "scale" : "2x", - "role" : "appLauncher", - "subtype" : "38mm" - }, - { - "size" : "44x44", - "idiom" : "watch", - "scale" : "2x", - "role" : "longLook", - "subtype" : "42mm" - }, - { - "size" : "86x86", - "idiom" : "watch", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "38mm" - }, - { - "size" : "98x98", - "idiom" : "watch", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "42mm" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/test/TestWatchApp/TestWatchApp WatchKit App/Info.plist b/test/TestWatchApp/TestWatchApp WatchKit App/Info.plist deleted file mode 100644 index 1a65c45..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit App/Info.plist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - TestWatchApp - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - com.appcelerator.TestWatchApp.watchkitapp - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - WKCompanionAppBundleIdentifier - com.appcelerator.TestWatchApp - WKWatchKitApp - - - diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/GlanceController.h b/test/TestWatchApp/TestWatchApp WatchKit Extension/GlanceController.h deleted file mode 100644 index 0bf4b57..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/GlanceController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// GlanceController.h -// TestWatchApp WatchKit Extension -// -// Created by Jonathan Alter on 4/16/15. -// Copyright (c) 2015 Appcelerator. All rights reserved. -// - -#import -#import - -@interface GlanceController : WKInterfaceController - -@end diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/GlanceController.m b/test/TestWatchApp/TestWatchApp WatchKit Extension/GlanceController.m deleted file mode 100644 index 4761bed..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/GlanceController.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// GlanceController.m -// TestWatchApp WatchKit Extension -// -// Created by Jonathan Alter on 4/16/15. -// Copyright (c) 2015 Appcelerator. All rights reserved. -// - -#import "GlanceController.h" - - -@interface GlanceController() - -@end - - -@implementation GlanceController - -- (void)awakeWithContext:(id)context { - [super awakeWithContext:context]; - - // Configure interface objects here. -} - -- (void)willActivate { - // This method is called when watch view controller is about to be visible to user - [super willActivate]; -} - -- (void)didDeactivate { - // This method is called when watch view controller is no longer visible - [super didDeactivate]; -} - -@end - - - diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ b/test/TestWatchApp/TestWatchApp WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ deleted file mode 100644 index b601d38..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ +++ /dev/null @@ -1 +0,0 @@ -Did you know that git does not support storing empty directories? diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/Info.plist b/test/TestWatchApp/TestWatchApp WatchKit Extension/Info.plist deleted file mode 100644 index 606971e..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - TestWatchApp WatchKit Extension - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - com.appcelerator.TestWatchApp.watchkitextension - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - XPC! - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - NSExtension - - NSExtensionAttributes - - WKAppBundleIdentifier - com.appcelerator.TestWatchApp.watchkitapp - - NSExtensionPointIdentifier - com.apple.watchkit - - RemoteInterfacePrincipalClass - InterfaceController - - diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/InterfaceController.h b/test/TestWatchApp/TestWatchApp WatchKit Extension/InterfaceController.h deleted file mode 100644 index d34e407..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/InterfaceController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// InterfaceController.h -// TestWatchApp WatchKit Extension -// -// Created by Jonathan Alter on 4/16/15. -// Copyright (c) 2015 Appcelerator. All rights reserved. -// - -#import -#import - -@interface InterfaceController : WKInterfaceController - -@end diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/InterfaceController.m b/test/TestWatchApp/TestWatchApp WatchKit Extension/InterfaceController.m deleted file mode 100644 index 2929d3c..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/InterfaceController.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// InterfaceController.m -// TestWatchApp WatchKit Extension -// -// Created by Jonathan Alter on 4/16/15. -// Copyright (c) 2015 Appcelerator. All rights reserved. -// - -#import "InterfaceController.h" - - -@interface InterfaceController() - -@end - - -@implementation InterfaceController - -- (void)awakeWithContext:(id)context { - [super awakeWithContext:context]; - - // Configure interface objects here. -} - -- (void)willActivate { - // This method is called when watch view controller is about to be visible to user - [super willActivate]; -} - -- (void)didDeactivate { - // This method is called when watch view controller is no longer visible - [super didDeactivate]; -} - -@end - - - diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/NotificationController.h b/test/TestWatchApp/TestWatchApp WatchKit Extension/NotificationController.h deleted file mode 100644 index 1b40238..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/NotificationController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// NotificationController.h -// TestWatchApp WatchKit Extension -// -// Created by Jonathan Alter on 4/16/15. -// Copyright (c) 2015 Appcelerator. All rights reserved. -// - -#import -#import - -@interface NotificationController : WKUserNotificationInterfaceController - -@end diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/NotificationController.m b/test/TestWatchApp/TestWatchApp WatchKit Extension/NotificationController.m deleted file mode 100644 index 8693942..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/NotificationController.m +++ /dev/null @@ -1,64 +0,0 @@ -// -// NotificationController.m -// TestWatchApp WatchKit Extension -// -// Created by Jonathan Alter on 4/16/15. -// Copyright (c) 2015 Appcelerator. All rights reserved. -// - -#import "NotificationController.h" - - -@interface NotificationController() - -@end - - -@implementation NotificationController - -- (instancetype)init { - self = [super init]; - if (self){ - // Initialize variables here. - // Configure interface objects here. - - } - return self; -} - -- (void)willActivate { - // This method is called when watch view controller is about to be visible to user - [super willActivate]; -} - -- (void)didDeactivate { - // This method is called when watch view controller is no longer visible - [super didDeactivate]; -} - -/* -- (void)didReceiveLocalNotification:(UILocalNotification *)localNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { - // This method is called when a local notification needs to be presented. - // Implement it if you use a dynamic notification interface. - // Populate your dynamic notification interface as quickly as possible. - // - // After populating your dynamic notification interface call the completion block. - completionHandler(WKUserNotificationInterfaceTypeCustom); -} -*/ - -/* -- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { - // This method is called when a remote notification needs to be presented. - // Implement it if you use a dynamic notification interface. - // Populate your dynamic notification interface as quickly as possible. - // - // After populating your dynamic notification interface call the completion block. - completionHandler(WKUserNotificationInterfaceTypeCustom); -} -*/ - -@end - - - diff --git a/test/TestWatchApp/TestWatchApp WatchKit Extension/PushNotificationPayload.apns b/test/TestWatchApp/TestWatchApp WatchKit Extension/PushNotificationPayload.apns deleted file mode 100644 index e793a02..0000000 --- a/test/TestWatchApp/TestWatchApp WatchKit Extension/PushNotificationPayload.apns +++ /dev/null @@ -1,18 +0,0 @@ -{ - "aps": { - "alert": { - "body": "Test message", - "title": "Optional title" - }, - "category": "myCategory" - }, - - "WatchKit Simulator Actions": [ - { - "title": "First Button", - "identifier": "firstButtonAction" - } - ], - - "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." -} diff --git a/test/TestWatchApp/TestWatchApp.xcodeproj/project.pbxproj b/test/TestWatchApp/TestWatchApp.xcodeproj/project.pbxproj deleted file mode 100644 index 2617dac..0000000 --- a/test/TestWatchApp/TestWatchApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,636 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 83D658AA19A00323009A9C56 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D658A919A00323009A9C56 /* Foundation.framework */; }; - 83D658AC19A00323009A9C56 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D658AB19A00323009A9C56 /* CoreGraphics.framework */; }; - 83D658AE19A00323009A9C56 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83D658AD19A00323009A9C56 /* UIKit.framework */; }; - 83D658B419A00323009A9C56 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 83D658B219A00323009A9C56 /* InfoPlist.strings */; }; - 83D658B619A00323009A9C56 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 83D658B519A00323009A9C56 /* main.m */; }; - 83D658BA19A00323009A9C56 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 83D658B919A00323009A9C56 /* AppDelegate.m */; }; - 83D658BD19A00323009A9C56 /* Main_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 83D658BB19A00323009A9C56 /* Main_iPhone.storyboard */; }; - 83D658C019A00323009A9C56 /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 83D658BE19A00323009A9C56 /* Main_iPad.storyboard */; }; - 83D658C319A00323009A9C56 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83D658C219A00323009A9C56 /* ViewController.m */; }; - 83D658C519A00323009A9C56 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 83D658C419A00323009A9C56 /* Images.xcassets */; }; - CE877EE41AE038AD0048B8B6 /* InterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE877EE31AE038AD0048B8B6 /* InterfaceController.m */; }; - CE877EE71AE038AD0048B8B6 /* NotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE877EE61AE038AD0048B8B6 /* NotificationController.m */; }; - CE877EEA1AE038AD0048B8B6 /* GlanceController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE877EE91AE038AD0048B8B6 /* GlanceController.m */; }; - CE877EEC1AE038AD0048B8B6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE877EEB1AE038AD0048B8B6 /* Images.xcassets */; }; - CE877EF01AE038AE0048B8B6 /* TestWatchApp WatchKit App.app in Resources */ = {isa = PBXBuildFile; fileRef = CE877EEF1AE038AE0048B8B6 /* TestWatchApp WatchKit App.app */; }; - CE877EF81AE038AE0048B8B6 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE877EF61AE038AE0048B8B6 /* Interface.storyboard */; }; - CE877EFA1AE038AE0048B8B6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE877EF91AE038AE0048B8B6 /* Images.xcassets */; }; - CE877EFD1AE038AE0048B8B6 /* TestWatchApp WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = CE877EDD1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - CE877EF11AE038AE0048B8B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83D6589E19A00323009A9C56 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CE877EEE1AE038AE0048B8B6; - remoteInfo = "TestWatchApp WatchKit App"; - }; - CE877EFB1AE038AE0048B8B6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83D6589E19A00323009A9C56 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CE877EDC1AE038AD0048B8B6; - remoteInfo = "TestWatchApp WatchKit Extension"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - CE877F041AE038AE0048B8B6 /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - CE877EFD1AE038AE0048B8B6 /* TestWatchApp WatchKit Extension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 83D658A619A00323009A9C56 /* TestWatchApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestWatchApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 83D658A919A00323009A9C56 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 83D658AB19A00323009A9C56 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 83D658AD19A00323009A9C56 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 83D658B119A00323009A9C56 /* TestWatchApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TestWatchApp-Info.plist"; sourceTree = ""; }; - 83D658B319A00323009A9C56 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 83D658B519A00323009A9C56 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 83D658B719A00323009A9C56 /* TestWatchApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TestWatchApp-Prefix.pch"; sourceTree = ""; }; - 83D658B819A00323009A9C56 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 83D658B919A00323009A9C56 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 83D658BC19A00323009A9C56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPhone.storyboard; sourceTree = ""; }; - 83D658BF19A00323009A9C56 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main_iPad.storyboard; sourceTree = ""; }; - 83D658C119A00323009A9C56 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 83D658C219A00323009A9C56 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 83D658C419A00323009A9C56 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 83D658CB19A00323009A9C56 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - CE877EDD1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "TestWatchApp WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - CE877EE01AE038AD0048B8B6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CE877EE11AE038AD0048B8B6 /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; - CE877EE21AE038AD0048B8B6 /* InterfaceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InterfaceController.h; sourceTree = ""; }; - CE877EE31AE038AD0048B8B6 /* InterfaceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InterfaceController.m; sourceTree = ""; }; - CE877EE51AE038AD0048B8B6 /* NotificationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationController.h; sourceTree = ""; }; - CE877EE61AE038AD0048B8B6 /* NotificationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationController.m; sourceTree = ""; }; - CE877EE81AE038AD0048B8B6 /* GlanceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GlanceController.h; sourceTree = ""; }; - CE877EE91AE038AD0048B8B6 /* GlanceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GlanceController.m; sourceTree = ""; }; - CE877EEB1AE038AD0048B8B6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - CE877EEF1AE038AE0048B8B6 /* TestWatchApp WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestWatchApp WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - CE877EF51AE038AE0048B8B6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CE877EF71AE038AE0048B8B6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; - CE877EF91AE038AE0048B8B6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 83D658A319A00323009A9C56 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D658AC19A00323009A9C56 /* CoreGraphics.framework in Frameworks */, - 83D658AE19A00323009A9C56 /* UIKit.framework in Frameworks */, - 83D658AA19A00323009A9C56 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CE877EDA1AE038AD0048B8B6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 83D6589D19A00322009A9C56 = { - isa = PBXGroup; - children = ( - 83D658AF19A00323009A9C56 /* TestWatchApp */, - CE877EDE1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension */, - CE877EF31AE038AE0048B8B6 /* TestWatchApp WatchKit App */, - 83D658A819A00323009A9C56 /* Frameworks */, - 83D658A719A00323009A9C56 /* Products */, - ); - sourceTree = ""; - }; - 83D658A719A00323009A9C56 /* Products */ = { - isa = PBXGroup; - children = ( - 83D658A619A00323009A9C56 /* TestWatchApp.app */, - CE877EDD1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension.appex */, - CE877EEF1AE038AE0048B8B6 /* TestWatchApp WatchKit App.app */, - ); - name = Products; - sourceTree = ""; - }; - 83D658A819A00323009A9C56 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 83D658A919A00323009A9C56 /* Foundation.framework */, - 83D658AB19A00323009A9C56 /* CoreGraphics.framework */, - 83D658AD19A00323009A9C56 /* UIKit.framework */, - 83D658CB19A00323009A9C56 /* XCTest.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 83D658AF19A00323009A9C56 /* TestWatchApp */ = { - isa = PBXGroup; - children = ( - 83D658B819A00323009A9C56 /* AppDelegate.h */, - 83D658B919A00323009A9C56 /* AppDelegate.m */, - 83D658BB19A00323009A9C56 /* Main_iPhone.storyboard */, - 83D658BE19A00323009A9C56 /* Main_iPad.storyboard */, - 83D658C119A00323009A9C56 /* ViewController.h */, - 83D658C219A00323009A9C56 /* ViewController.m */, - 83D658C419A00323009A9C56 /* Images.xcassets */, - 83D658B019A00323009A9C56 /* Supporting Files */, - ); - name = TestWatchApp; - path = TestWatchApp; - sourceTree = ""; - }; - 83D658B019A00323009A9C56 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 83D658B119A00323009A9C56 /* TestWatchApp-Info.plist */, - 83D658B219A00323009A9C56 /* InfoPlist.strings */, - 83D658B519A00323009A9C56 /* main.m */, - 83D658B719A00323009A9C56 /* TestWatchApp-Prefix.pch */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CE877EDE1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension */ = { - isa = PBXGroup; - children = ( - CE877EE21AE038AD0048B8B6 /* InterfaceController.h */, - CE877EE31AE038AD0048B8B6 /* InterfaceController.m */, - CE877EE51AE038AD0048B8B6 /* NotificationController.h */, - CE877EE61AE038AD0048B8B6 /* NotificationController.m */, - CE877EE81AE038AD0048B8B6 /* GlanceController.h */, - CE877EE91AE038AD0048B8B6 /* GlanceController.m */, - CE877EEB1AE038AD0048B8B6 /* Images.xcassets */, - CE877EDF1AE038AD0048B8B6 /* Supporting Files */, - ); - name = "TestWatchApp WatchKit Extension"; - path = "TestWatchApp WatchKit Extension"; - sourceTree = ""; - }; - CE877EDF1AE038AD0048B8B6 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - CE877EE01AE038AD0048B8B6 /* Info.plist */, - CE877EE11AE038AD0048B8B6 /* PushNotificationPayload.apns */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CE877EF31AE038AE0048B8B6 /* TestWatchApp WatchKit App */ = { - isa = PBXGroup; - children = ( - CE877EF61AE038AE0048B8B6 /* Interface.storyboard */, - CE877EF91AE038AE0048B8B6 /* Images.xcassets */, - CE877EF41AE038AE0048B8B6 /* Supporting Files */, - ); - name = "TestWatchApp WatchKit App"; - path = "TestWatchApp WatchKit App"; - sourceTree = ""; - }; - CE877EF41AE038AE0048B8B6 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - CE877EF51AE038AE0048B8B6 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 83D658A519A00323009A9C56 /* TestWatchApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 83D658DB19A00323009A9C56 /* Build configuration list for PBXNativeTarget "TestWatchApp" */; - buildPhases = ( - 83D658A219A00323009A9C56 /* Sources */, - 83D658A319A00323009A9C56 /* Frameworks */, - 83D658A419A00323009A9C56 /* Resources */, - CE877F041AE038AE0048B8B6 /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - CE877EFC1AE038AE0048B8B6 /* PBXTargetDependency */, - ); - name = TestWatchApp; - productName = TestWatchApp; - productReference = 83D658A619A00323009A9C56 /* TestWatchApp.app */; - productType = "com.apple.product-type.application"; - }; - CE877EDC1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = CE877F031AE038AE0048B8B6 /* Build configuration list for PBXNativeTarget "TestWatchApp WatchKit Extension" */; - buildPhases = ( - CE877ED91AE038AD0048B8B6 /* Sources */, - CE877EDA1AE038AD0048B8B6 /* Frameworks */, - CE877EDB1AE038AD0048B8B6 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - CE877EF21AE038AE0048B8B6 /* PBXTargetDependency */, - ); - name = "TestWatchApp WatchKit Extension"; - productName = "TestWatchApp WatchKit Extension"; - productReference = CE877EDD1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension.appex */; - productType = "com.apple.product-type.watchkit-extension"; - }; - CE877EEE1AE038AE0048B8B6 /* TestWatchApp WatchKit App */ = { - isa = PBXNativeTarget; - buildConfigurationList = CE877F021AE038AE0048B8B6 /* Build configuration list for PBXNativeTarget "TestWatchApp WatchKit App" */; - buildPhases = ( - CE877EED1AE038AE0048B8B6 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "TestWatchApp WatchKit App"; - productName = "TestWatchApp WatchKit App"; - productReference = CE877EEF1AE038AE0048B8B6 /* TestWatchApp WatchKit App.app */; - productType = "com.apple.product-type.application.watchapp"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83D6589E19A00323009A9C56 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0510; - ORGANIZATIONNAME = Appcelerator; - TargetAttributes = { - CE877EDC1AE038AD0048B8B6 = { - CreatedOnToolsVersion = 6.3; - }; - CE877EEE1AE038AE0048B8B6 = { - CreatedOnToolsVersion = 6.3; - }; - }; - }; - buildConfigurationList = 83D658A119A00323009A9C56 /* Build configuration list for PBXProject "TestWatchApp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83D6589D19A00322009A9C56; - productRefGroup = 83D658A719A00323009A9C56 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 83D658A519A00323009A9C56 /* TestWatchApp */, - CE877EDC1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension */, - CE877EEE1AE038AE0048B8B6 /* TestWatchApp WatchKit App */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 83D658A419A00323009A9C56 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D658C019A00323009A9C56 /* Main_iPad.storyboard in Resources */, - 83D658C519A00323009A9C56 /* Images.xcassets in Resources */, - 83D658BD19A00323009A9C56 /* Main_iPhone.storyboard in Resources */, - 83D658B419A00323009A9C56 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CE877EDB1AE038AD0048B8B6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CE877EF01AE038AE0048B8B6 /* TestWatchApp WatchKit App.app in Resources */, - CE877EEC1AE038AD0048B8B6 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CE877EED1AE038AE0048B8B6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CE877EF81AE038AE0048B8B6 /* Interface.storyboard in Resources */, - CE877EFA1AE038AE0048B8B6 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 83D658A219A00323009A9C56 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 83D658C319A00323009A9C56 /* ViewController.m in Sources */, - 83D658BA19A00323009A9C56 /* AppDelegate.m in Sources */, - 83D658B619A00323009A9C56 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CE877ED91AE038AD0048B8B6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CE877EE71AE038AD0048B8B6 /* NotificationController.m in Sources */, - CE877EE41AE038AD0048B8B6 /* InterfaceController.m in Sources */, - CE877EEA1AE038AD0048B8B6 /* GlanceController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - CE877EF21AE038AE0048B8B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = CE877EEE1AE038AE0048B8B6 /* TestWatchApp WatchKit App */; - targetProxy = CE877EF11AE038AE0048B8B6 /* PBXContainerItemProxy */; - }; - CE877EFC1AE038AE0048B8B6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = CE877EDC1AE038AD0048B8B6 /* TestWatchApp WatchKit Extension */; - targetProxy = CE877EFB1AE038AE0048B8B6 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 83D658B219A00323009A9C56 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 83D658B319A00323009A9C56 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 83D658BB19A00323009A9C56 /* Main_iPhone.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 83D658BC19A00323009A9C56 /* Base */, - ); - name = Main_iPhone.storyboard; - sourceTree = ""; - }; - 83D658BE19A00323009A9C56 /* Main_iPad.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 83D658BF19A00323009A9C56 /* Base */, - ); - name = Main_iPad.storyboard; - sourceTree = ""; - }; - CE877EF61AE038AE0048B8B6 /* Interface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - CE877EF71AE038AE0048B8B6 /* Base */, - ); - name = Interface.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 83D658D919A00323009A9C56 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.1; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 83D658DA19A00323009A9C56 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.1; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 83D658DC19A00323009A9C56 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TestWatchApp/TestWatchApp-Prefix.pch"; - INFOPLIST_FILE = "TestWatchApp/TestWatchApp-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - VALID_ARCHS = "arm64 armv7 armv7s"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 83D658DD19A00323009A9C56 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TestWatchApp/TestWatchApp-Prefix.pch"; - INFOPLIST_FILE = "TestWatchApp/TestWatchApp-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - VALID_ARCHS = "arm64 armv7 armv7s"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - CE877EFE1AE038AE0048B8B6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_UNREACHABLE_CODE = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = "TestWatchApp WatchKit Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = "${TARGET_NAME}"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - CE877EFF1AE038AE0048B8B6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_UNREACHABLE_CODE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "TestWatchApp WatchKit Extension/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "${TARGET_NAME}"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - CE877F001AE038AE0048B8B6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_WARN_UNREACHABLE_CODE = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - IBSC_MODULE = TestWatchApp_WatchKit_Extension; - INFOPLIST_FILE = "TestWatchApp WatchKit App/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; - }; - name = Debug; - }; - CE877F011AE038AE0048B8B6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_WARN_UNREACHABLE_CODE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - IBSC_MODULE = TestWatchApp_WatchKit_Extension; - INFOPLIST_FILE = "TestWatchApp WatchKit App/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 83D658A119A00323009A9C56 /* Build configuration list for PBXProject "TestWatchApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83D658D919A00323009A9C56 /* Debug */, - 83D658DA19A00323009A9C56 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83D658DB19A00323009A9C56 /* Build configuration list for PBXNativeTarget "TestWatchApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83D658DC19A00323009A9C56 /* Debug */, - 83D658DD19A00323009A9C56 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CE877F021AE038AE0048B8B6 /* Build configuration list for PBXNativeTarget "TestWatchApp WatchKit App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CE877F001AE038AE0048B8B6 /* Debug */, - CE877F011AE038AE0048B8B6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CE877F031AE038AE0048B8B6 /* Build configuration list for PBXNativeTarget "TestWatchApp WatchKit Extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CE877EFE1AE038AE0048B8B6 /* Debug */, - CE877EFF1AE038AE0048B8B6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83D6589E19A00323009A9C56 /* Project object */; -} diff --git a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/Glance - TestWatchApp WatchKit App.xcscheme b/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/Glance - TestWatchApp WatchKit App.xcscheme deleted file mode 100644 index b0e84f1..0000000 --- a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/Glance - TestWatchApp WatchKit App.xcscheme +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/Notification - TestWatchApp WatchKit App.xcscheme b/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/Notification - TestWatchApp WatchKit App.xcscheme deleted file mode 100644 index ae99608..0000000 --- a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/Notification - TestWatchApp WatchKit App.xcscheme +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/TestWatchApp WatchKit App.xcscheme b/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/TestWatchApp WatchKit App.xcscheme deleted file mode 100644 index aa8db12..0000000 --- a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/TestWatchApp WatchKit App.xcscheme +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/TestWatchApp.xcscheme b/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/TestWatchApp.xcscheme deleted file mode 100644 index 0f5351e..0000000 --- a/test/TestWatchApp/TestWatchApp.xcodeproj/xcshareddata/xcschemes/TestWatchApp.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp/AppDelegate.h b/test/TestWatchApp/TestWatchApp/AppDelegate.h deleted file mode 100644 index 5e675e9..0000000 --- a/test/TestWatchApp/TestWatchApp/AppDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AppDelegate.h -// TestWatchApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/test/TestWatchApp/TestWatchApp/AppDelegate.m b/test/TestWatchApp/TestWatchApp/AppDelegate.m deleted file mode 100644 index 9ff4b83..0000000 --- a/test/TestWatchApp/TestWatchApp/AppDelegate.m +++ /dev/null @@ -1,83 +0,0 @@ -// -// AppDelegate.m -// TestWatchApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import "AppDelegate.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ -#ifdef TEST_BASIC_LOGGING - NSLog(@"[INFO] info test"); - NSLog(@"[DEBUG] debug test"); - NSLog(@"[DEBUG] line 1 test\n[DEBUG] line 2 test"); - NSLog(@"[DEBUG] AUTO_EXIT"); -#endif - -#ifdef TEST_TIMOCHA - NSLog(@"[DEBUG] TI_MOCHA_RESULT_START"); - NSLog(@"[DEBUG] {\"foo\":\"bar\"}"); - NSLog(@"[DEBUG] TI_MOCHA_RESULT_STOP"); -#endif - -#ifdef TEST_TIMOCHA_MULTIPLE_LINES - NSLog(@"[DEBUG] TI_MOCHA_RESULT_START"); - NSLog(@"[DEBUG] {"); - NSLog(@"[DEBUG] \"foo\":\"bar\""); - NSLog(@"[DEBUG] }"); - NSLog(@"[DEBUG] TI_MOCHA_RESULT_STOP"); -#endif - -#ifdef TEST_TIMEOUT - // do nothing, we want to time out explicitly here -#endif - -#ifdef TEST_OBJC_CRASH - // force a crash (unrecognized selector) - SEL selector = NSSelectorFromString(@"pleaseCrash"); - [NSObject performSelector:selector]; -#endif - -#ifdef TEST_C_CRASH - // force a crash (divide by zero) - int *x = NULL; - *x = 99; -#endif - - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/test/TestWatchApp/TestWatchApp/Base.lproj/Main_iPad.storyboard b/test/TestWatchApp/TestWatchApp/Base.lproj/Main_iPad.storyboard deleted file mode 100644 index 4edef30..0000000 --- a/test/TestWatchApp/TestWatchApp/Base.lproj/Main_iPad.storyboard +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp/Base.lproj/Main_iPhone.storyboard b/test/TestWatchApp/TestWatchApp/Base.lproj/Main_iPhone.storyboard deleted file mode 100644 index ce2c658..0000000 --- a/test/TestWatchApp/TestWatchApp/Base.lproj/Main_iPhone.storyboard +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp/TestWatchApp/Images.xcassets/AppIcon.appiconset/Contents.json b/test/TestWatchApp/TestWatchApp/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index b7f3352..0000000 --- a/test/TestWatchApp/TestWatchApp/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/test/TestWatchApp/TestWatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json b/test/TestWatchApp/TestWatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json deleted file mode 100644 index 6f870a4..0000000 --- a/test/TestWatchApp/TestWatchApp/Images.xcassets/LaunchImage.launchimage/Contents.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "images" : [ - { - "orientation" : "portrait", - "idiom" : "iphone", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "iphone", - "subtype" : "retina4", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "1x" - }, - { - "orientation" : "portrait", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - }, - { - "orientation" : "landscape", - "idiom" : "ipad", - "extent" : "full-screen", - "minimum-system-version" : "7.0", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/test/TestWatchApp/TestWatchApp/TestWatchApp-Info.plist b/test/TestWatchApp/TestWatchApp/TestWatchApp-Info.plist deleted file mode 100644 index 3a419af..0000000 --- a/test/TestWatchApp/TestWatchApp/TestWatchApp-Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.appcelerator.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIMainStoryboardFile - Main_iPhone - UIMainStoryboardFile~ipad - Main_iPad - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/test/TestWatchApp/TestWatchApp/TestWatchApp-Prefix.pch b/test/TestWatchApp/TestWatchApp/TestWatchApp-Prefix.pch deleted file mode 100644 index a0c6545..0000000 --- a/test/TestWatchApp/TestWatchApp/TestWatchApp-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/test/TestWatchApp/TestWatchApp/ViewController.h b/test/TestWatchApp/TestWatchApp/ViewController.h deleted file mode 100644 index 88ebff7..0000000 --- a/test/TestWatchApp/TestWatchApp/ViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ViewController.h -// TestWatchApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import - -@interface ViewController : UIViewController - -@end diff --git a/test/TestWatchApp/TestWatchApp/ViewController.m b/test/TestWatchApp/TestWatchApp/ViewController.m deleted file mode 100644 index 46039ed..0000000 --- a/test/TestWatchApp/TestWatchApp/ViewController.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// ViewController.m -// TestWatchApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import "ViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -@end diff --git a/test/TestWatchApp/TestWatchApp/en.lproj/InfoPlist.strings b/test/TestWatchApp/TestWatchApp/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/test/TestWatchApp/TestWatchApp/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/test/TestWatchApp/TestWatchApp/main.m b/test/TestWatchApp/TestWatchApp/main.m deleted file mode 100644 index 4ba1345..0000000 --- a/test/TestWatchApp/TestWatchApp/main.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// main.m -// TestWatchApp -// -// Created by Chris Barber on 8/16/14. -// -// - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json b/test/TestWatchApp2/TestWatchApp2 WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2a9dea2..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "images" : [ - { - "size" : "24x24", - "idiom" : "watch", - "scale" : "2x", - "role" : "notificationCenter", - "subtype" : "38mm" - }, - { - "size" : "27.5x27.5", - "idiom" : "watch", - "scale" : "2x", - "role" : "notificationCenter", - "subtype" : "42mm" - }, - { - "size" : "29x29", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "watch", - "scale" : "2x", - "role" : "appLauncher", - "subtype" : "38mm" - }, - { - "size" : "44x44", - "idiom" : "watch", - "scale" : "2x", - "role" : "longLook", - "subtype" : "42mm" - }, - { - "size" : "86x86", - "idiom" : "watch", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "38mm" - }, - { - "size" : "98x98", - "idiom" : "watch", - "scale" : "2x", - "role" : "quickLook", - "subtype" : "42mm" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit App/Base.lproj/Interface.storyboard b/test/TestWatchApp2/TestWatchApp2 WatchKit App/Base.lproj/Interface.storyboard deleted file mode 100644 index 496d90a..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit App/Base.lproj/Interface.storyboard +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit App/Info.plist b/test/TestWatchApp2/TestWatchApp2 WatchKit App/Info.plist deleted file mode 100644 index e92a05a..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit App/Info.plist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - TestWatchApp2 WatchKit App - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - WKCompanionAppBundleIdentifier - com.appcelerator.TestWatchApp2 - WKWatchKitApp - - - diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/Assets.xcassets/README__ignoredByTemplate__ b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/Assets.xcassets/README__ignoredByTemplate__ deleted file mode 100644 index b601d38..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/Assets.xcassets/README__ignoredByTemplate__ +++ /dev/null @@ -1 +0,0 @@ -Did you know that git does not support storing empty directories? diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/ExtensionDelegate.h b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/ExtensionDelegate.h deleted file mode 100644 index b4777ff..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/ExtensionDelegate.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ExtensionDelegate.h -// TestWatchApp2 WatchKit Extension -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import - -@interface ExtensionDelegate : NSObject - -@end diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/ExtensionDelegate.m b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/ExtensionDelegate.m deleted file mode 100644 index 8127dd1..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/ExtensionDelegate.m +++ /dev/null @@ -1,26 +0,0 @@ -// -// ExtensionDelegate.m -// TestWatchApp2 WatchKit Extension -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import "ExtensionDelegate.h" - -@implementation ExtensionDelegate - -- (void)applicationDidFinishLaunching { - // Perform any final initialization of your application. -} - -- (void)applicationDidBecomeActive { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillResignActive { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, etc. -} - -@end diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/Info.plist b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/Info.plist deleted file mode 100644 index 1a76b21..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/Info.plist +++ /dev/null @@ -1,40 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - TestWatchApp2 WatchKit Extension - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - XPC! - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSExtension - - NSExtensionAttributes - - WKAppBundleIdentifier - com.appcelerator.TestWatchApp2.watchkitapp - - NSExtensionPointIdentifier - com.apple.watchkit - - RemoteInterfacePrincipalClass - InterfaceController - WKExtensionDelegateClassName - ExtensionDelegate - - diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/InterfaceController.h b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/InterfaceController.h deleted file mode 100644 index 0987a5f..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/InterfaceController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// InterfaceController.h -// TestWatchApp2 WatchKit Extension -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import -#import - -@interface InterfaceController : WKInterfaceController - -@end diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/InterfaceController.m b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/InterfaceController.m deleted file mode 100644 index 62a5ea3..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/InterfaceController.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// InterfaceController.m -// TestWatchApp2 WatchKit Extension -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import "InterfaceController.h" - - -@interface InterfaceController() - -@end - - -@implementation InterfaceController - -- (void)awakeWithContext:(id)context { - [super awakeWithContext:context]; - - // Configure interface objects here. -} - -- (void)willActivate { - // This method is called when watch view controller is about to be visible to user - [super willActivate]; -} - -- (void)didDeactivate { - // This method is called when watch view controller is no longer visible - [super didDeactivate]; -} - -@end - - - diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/NotificationController.h b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/NotificationController.h deleted file mode 100644 index 1288c8e..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/NotificationController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// NotificationController.h -// TestWatchApp2 WatchKit Extension -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import -#import - -@interface NotificationController : WKUserNotificationInterfaceController - -@end diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/NotificationController.m b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/NotificationController.m deleted file mode 100644 index 4cd183e..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/NotificationController.m +++ /dev/null @@ -1,64 +0,0 @@ -// -// NotificationController.m -// TestWatchApp2 WatchKit Extension -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import "NotificationController.h" - - -@interface NotificationController() - -@end - - -@implementation NotificationController - -- (instancetype)init { - self = [super init]; - if (self){ - // Initialize variables here. - // Configure interface objects here. - - } - return self; -} - -- (void)willActivate { - // This method is called when watch view controller is about to be visible to user - [super willActivate]; -} - -- (void)didDeactivate { - // This method is called when watch view controller is no longer visible - [super didDeactivate]; -} - -/* -- (void)didReceiveLocalNotification:(UILocalNotification *)localNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { - // This method is called when a local notification needs to be presented. - // Implement it if you use a dynamic notification interface. - // Populate your dynamic notification interface as quickly as possible. - // - // After populating your dynamic notification interface call the completion block. - completionHandler(WKUserNotificationInterfaceTypeCustom); -} -*/ - -/* -- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { - // This method is called when a remote notification needs to be presented. - // Implement it if you use a dynamic notification interface. - // Populate your dynamic notification interface as quickly as possible. - // - // After populating your dynamic notification interface call the completion block. - completionHandler(WKUserNotificationInterfaceTypeCustom); -} -*/ - -@end - - - diff --git a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/PushNotificationPayload.apns b/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/PushNotificationPayload.apns deleted file mode 100644 index e793a02..0000000 --- a/test/TestWatchApp2/TestWatchApp2 WatchKit Extension/PushNotificationPayload.apns +++ /dev/null @@ -1,18 +0,0 @@ -{ - "aps": { - "alert": { - "body": "Test message", - "title": "Optional title" - }, - "category": "myCategory" - }, - - "WatchKit Simulator Actions": [ - { - "title": "First Button", - "identifier": "firstButtonAction" - } - ], - - "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." -} diff --git a/test/TestWatchApp2/TestWatchApp2.xcodeproj/project.pbxproj b/test/TestWatchApp2/TestWatchApp2.xcodeproj/project.pbxproj deleted file mode 100644 index 5161dd8..0000000 --- a/test/TestWatchApp2/TestWatchApp2.xcodeproj/project.pbxproj +++ /dev/null @@ -1,585 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 839654F51B5FB53900B2DE3D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 839654F41B5FB53900B2DE3D /* main.m */; }; - 839654F81B5FB53900B2DE3D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 839654F71B5FB53900B2DE3D /* AppDelegate.m */; }; - 839654FB1B5FB53900B2DE3D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 839654FA1B5FB53900B2DE3D /* ViewController.m */; }; - 839654FE1B5FB53900B2DE3D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 839654FC1B5FB53900B2DE3D /* Main.storyboard */; }; - 839655001B5FB53900B2DE3D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 839654FF1B5FB53900B2DE3D /* Assets.xcassets */; }; - 839655031B5FB53900B2DE3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 839655011B5FB53900B2DE3D /* LaunchScreen.storyboard */; }; - 839655081B5FB53900B2DE3D /* TestWatchApp2 WatchKit App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 839655071B5FB53900B2DE3D /* TestWatchApp2 WatchKit App.app */; }; - 8396550E1B5FB53900B2DE3D /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8396550C1B5FB53900B2DE3D /* Interface.storyboard */; }; - 839655101B5FB53900B2DE3D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8396550F1B5FB53900B2DE3D /* Assets.xcassets */; }; - 839655171B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 839655161B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 8396551F1B5FB53900B2DE3D /* InterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8396551E1B5FB53900B2DE3D /* InterfaceController.m */; }; - 839655221B5FB53900B2DE3D /* ExtensionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 839655211B5FB53900B2DE3D /* ExtensionDelegate.m */; }; - 839655251B5FB53900B2DE3D /* NotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 839655241B5FB53900B2DE3D /* NotificationController.m */; }; - 839655271B5FB53900B2DE3D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 839655261B5FB53900B2DE3D /* Assets.xcassets */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 839655091B5FB53900B2DE3D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 839654E81B5FB53900B2DE3D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 839655061B5FB53900B2DE3D; - remoteInfo = "TestWatchApp2 WatchKit App"; - }; - 839655181B5FB53900B2DE3D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 839654E81B5FB53900B2DE3D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 839655151B5FB53900B2DE3D; - remoteInfo = "TestWatchApp2 WatchKit Extension"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 8396552E1B5FB53900B2DE3D /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 839655171B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - 839655321B5FB53900B2DE3D /* Embed Watch Content */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; - dstSubfolderSpec = 16; - files = ( - 839655081B5FB53900B2DE3D /* TestWatchApp2 WatchKit App.app in Embed Watch Content */, - ); - name = "Embed Watch Content"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 839654F01B5FB53900B2DE3D /* TestWatchApp2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestWatchApp2.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 839654F41B5FB53900B2DE3D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 839654F61B5FB53900B2DE3D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 839654F71B5FB53900B2DE3D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 839654F91B5FB53900B2DE3D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 839654FA1B5FB53900B2DE3D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 839654FD1B5FB53900B2DE3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 839654FF1B5FB53900B2DE3D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 839655021B5FB53900B2DE3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 839655041B5FB53900B2DE3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 839655071B5FB53900B2DE3D /* TestWatchApp2 WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestWatchApp2 WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8396550D1B5FB53900B2DE3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; - 8396550F1B5FB53900B2DE3D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 839655111B5FB53900B2DE3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 839655161B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "TestWatchApp2 WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8396551C1B5FB53900B2DE3D /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; - 8396551D1B5FB53900B2DE3D /* InterfaceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InterfaceController.h; sourceTree = ""; }; - 8396551E1B5FB53900B2DE3D /* InterfaceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InterfaceController.m; sourceTree = ""; }; - 839655201B5FB53900B2DE3D /* ExtensionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtensionDelegate.h; sourceTree = ""; }; - 839655211B5FB53900B2DE3D /* ExtensionDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExtensionDelegate.m; sourceTree = ""; }; - 839655231B5FB53900B2DE3D /* NotificationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationController.h; sourceTree = ""; }; - 839655241B5FB53900B2DE3D /* NotificationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationController.m; sourceTree = ""; }; - 839655261B5FB53900B2DE3D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 839655281B5FB53900B2DE3D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 839654ED1B5FB53900B2DE3D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 839655131B5FB53900B2DE3D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 839654E71B5FB53900B2DE3D = { - isa = PBXGroup; - children = ( - 839654F21B5FB53900B2DE3D /* TestWatchApp2 */, - 8396550B1B5FB53900B2DE3D /* TestWatchApp2 WatchKit App */, - 8396551A1B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension */, - 839654F11B5FB53900B2DE3D /* Products */, - ); - sourceTree = ""; - }; - 839654F11B5FB53900B2DE3D /* Products */ = { - isa = PBXGroup; - children = ( - 839654F01B5FB53900B2DE3D /* TestWatchApp2.app */, - 839655071B5FB53900B2DE3D /* TestWatchApp2 WatchKit App.app */, - 839655161B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension.appex */, - ); - name = Products; - sourceTree = ""; - }; - 839654F21B5FB53900B2DE3D /* TestWatchApp2 */ = { - isa = PBXGroup; - children = ( - 839654F61B5FB53900B2DE3D /* AppDelegate.h */, - 839654F71B5FB53900B2DE3D /* AppDelegate.m */, - 839654F91B5FB53900B2DE3D /* ViewController.h */, - 839654FA1B5FB53900B2DE3D /* ViewController.m */, - 839654FC1B5FB53900B2DE3D /* Main.storyboard */, - 839654FF1B5FB53900B2DE3D /* Assets.xcassets */, - 839655011B5FB53900B2DE3D /* LaunchScreen.storyboard */, - 839655041B5FB53900B2DE3D /* Info.plist */, - 839654F31B5FB53900B2DE3D /* Supporting Files */, - ); - path = TestWatchApp2; - sourceTree = ""; - }; - 839654F31B5FB53900B2DE3D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 839654F41B5FB53900B2DE3D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8396550B1B5FB53900B2DE3D /* TestWatchApp2 WatchKit App */ = { - isa = PBXGroup; - children = ( - 8396550C1B5FB53900B2DE3D /* Interface.storyboard */, - 8396550F1B5FB53900B2DE3D /* Assets.xcassets */, - 839655111B5FB53900B2DE3D /* Info.plist */, - ); - path = "TestWatchApp2 WatchKit App"; - sourceTree = ""; - }; - 8396551A1B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension */ = { - isa = PBXGroup; - children = ( - 8396551D1B5FB53900B2DE3D /* InterfaceController.h */, - 8396551E1B5FB53900B2DE3D /* InterfaceController.m */, - 839655201B5FB53900B2DE3D /* ExtensionDelegate.h */, - 839655211B5FB53900B2DE3D /* ExtensionDelegate.m */, - 839655231B5FB53900B2DE3D /* NotificationController.h */, - 839655241B5FB53900B2DE3D /* NotificationController.m */, - 839655261B5FB53900B2DE3D /* Assets.xcassets */, - 839655281B5FB53900B2DE3D /* Info.plist */, - 8396551B1B5FB53900B2DE3D /* Supporting Files */, - ); - path = "TestWatchApp2 WatchKit Extension"; - sourceTree = ""; - }; - 8396551B1B5FB53900B2DE3D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8396551C1B5FB53900B2DE3D /* PushNotificationPayload.apns */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 839654EF1B5FB53900B2DE3D /* TestWatchApp2 */ = { - isa = PBXNativeTarget; - buildConfigurationList = 839655331B5FB53900B2DE3D /* Build configuration list for PBXNativeTarget "TestWatchApp2" */; - buildPhases = ( - 839654EC1B5FB53900B2DE3D /* Sources */, - 839654ED1B5FB53900B2DE3D /* Frameworks */, - 839654EE1B5FB53900B2DE3D /* Resources */, - 839655321B5FB53900B2DE3D /* Embed Watch Content */, - ); - buildRules = ( - ); - dependencies = ( - 8396550A1B5FB53900B2DE3D /* PBXTargetDependency */, - ); - name = TestWatchApp2; - productName = TestWatchApp2; - productReference = 839654F01B5FB53900B2DE3D /* TestWatchApp2.app */; - productType = "com.apple.product-type.application"; - }; - 839655061B5FB53900B2DE3D /* TestWatchApp2 WatchKit App */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8396552F1B5FB53900B2DE3D /* Build configuration list for PBXNativeTarget "TestWatchApp2 WatchKit App" */; - buildPhases = ( - 839655051B5FB53900B2DE3D /* Resources */, - 8396552E1B5FB53900B2DE3D /* Embed App Extensions */, - ); - buildRules = ( - ); - dependencies = ( - 839655191B5FB53900B2DE3D /* PBXTargetDependency */, - ); - name = "TestWatchApp2 WatchKit App"; - productName = "TestWatchApp2 WatchKit App"; - productReference = 839655071B5FB53900B2DE3D /* TestWatchApp2 WatchKit App.app */; - productType = "com.apple.product-type.application.watchapp2"; - }; - 839655151B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8396552B1B5FB53900B2DE3D /* Build configuration list for PBXNativeTarget "TestWatchApp2 WatchKit Extension" */; - buildPhases = ( - 839655121B5FB53900B2DE3D /* Sources */, - 839655131B5FB53900B2DE3D /* Frameworks */, - 839655141B5FB53900B2DE3D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "TestWatchApp2 WatchKit Extension"; - productName = "TestWatchApp2 WatchKit Extension"; - productReference = 839655161B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension.appex */; - productType = "com.apple.product-type.watchkit2-extension"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 839654E81B5FB53900B2DE3D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0700; - ORGANIZATIONNAME = Appcelerator; - TargetAttributes = { - 839654EF1B5FB53900B2DE3D = { - CreatedOnToolsVersion = 7.0; - }; - 839655061B5FB53900B2DE3D = { - CreatedOnToolsVersion = 7.0; - }; - 839655151B5FB53900B2DE3D = { - CreatedOnToolsVersion = 7.0; - }; - }; - }; - buildConfigurationList = 839654EB1B5FB53900B2DE3D /* Build configuration list for PBXProject "TestWatchApp2" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 839654E71B5FB53900B2DE3D; - productRefGroup = 839654F11B5FB53900B2DE3D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 839654EF1B5FB53900B2DE3D /* TestWatchApp2 */, - 839655061B5FB53900B2DE3D /* TestWatchApp2 WatchKit App */, - 839655151B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 839654EE1B5FB53900B2DE3D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 839655031B5FB53900B2DE3D /* LaunchScreen.storyboard in Resources */, - 839655001B5FB53900B2DE3D /* Assets.xcassets in Resources */, - 839654FE1B5FB53900B2DE3D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 839655051B5FB53900B2DE3D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 839655101B5FB53900B2DE3D /* Assets.xcassets in Resources */, - 8396550E1B5FB53900B2DE3D /* Interface.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 839655141B5FB53900B2DE3D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 839655271B5FB53900B2DE3D /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 839654EC1B5FB53900B2DE3D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 839654FB1B5FB53900B2DE3D /* ViewController.m in Sources */, - 839654F81B5FB53900B2DE3D /* AppDelegate.m in Sources */, - 839654F51B5FB53900B2DE3D /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 839655121B5FB53900B2DE3D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 839655221B5FB53900B2DE3D /* ExtensionDelegate.m in Sources */, - 8396551F1B5FB53900B2DE3D /* InterfaceController.m in Sources */, - 839655251B5FB53900B2DE3D /* NotificationController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 8396550A1B5FB53900B2DE3D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 839655061B5FB53900B2DE3D /* TestWatchApp2 WatchKit App */; - targetProxy = 839655091B5FB53900B2DE3D /* PBXContainerItemProxy */; - }; - 839655191B5FB53900B2DE3D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 839655151B5FB53900B2DE3D /* TestWatchApp2 WatchKit Extension */; - targetProxy = 839655181B5FB53900B2DE3D /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 839654FC1B5FB53900B2DE3D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 839654FD1B5FB53900B2DE3D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 839655011B5FB53900B2DE3D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 839655021B5FB53900B2DE3D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - 8396550C1B5FB53900B2DE3D /* Interface.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8396550D1B5FB53900B2DE3D /* Base */, - ); - name = Interface.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 839655291B5FB53900B2DE3D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8396552A1B5FB53900B2DE3D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 8396552C1B5FB53900B2DE3D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = "TestWatchApp2 WatchKit Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.TestWatchApp2.watchkitapp.watchkitextension; - PRODUCT_NAME = "${TARGET_NAME}"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Debug; - }; - 8396552D1B5FB53900B2DE3D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = "TestWatchApp2 WatchKit Extension/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.TestWatchApp2.watchkitapp.watchkitextension; - PRODUCT_NAME = "${TARGET_NAME}"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Release; - }; - 839655301B5FB53900B2DE3D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - IBSC_MODULE = TestWatchApp2_WatchKit_Extension; - INFOPLIST_FILE = "TestWatchApp2 WatchKit App/Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.TestWatchApp2.watchkitapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Debug; - }; - 839655311B5FB53900B2DE3D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - IBSC_MODULE = TestWatchApp2_WatchKit_Extension; - INFOPLIST_FILE = "TestWatchApp2 WatchKit App/Info.plist"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.TestWatchApp2.watchkitapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.0; - }; - name = Release; - }; - 839655341B5FB53900B2DE3D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = TestWatchApp2/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.TestWatchApp2; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 839655351B5FB53900B2DE3D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = TestWatchApp2/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcelerator.TestWatchApp2; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 839654EB1B5FB53900B2DE3D /* Build configuration list for PBXProject "TestWatchApp2" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 839655291B5FB53900B2DE3D /* Debug */, - 8396552A1B5FB53900B2DE3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 8396552B1B5FB53900B2DE3D /* Build configuration list for PBXNativeTarget "TestWatchApp2 WatchKit Extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8396552C1B5FB53900B2DE3D /* Debug */, - 8396552D1B5FB53900B2DE3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 8396552F1B5FB53900B2DE3D /* Build configuration list for PBXNativeTarget "TestWatchApp2 WatchKit App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 839655301B5FB53900B2DE3D /* Debug */, - 839655311B5FB53900B2DE3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 839655331B5FB53900B2DE3D /* Build configuration list for PBXNativeTarget "TestWatchApp2" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 839655341B5FB53900B2DE3D /* Debug */, - 839655351B5FB53900B2DE3D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ - }; - rootObject = 839654E81B5FB53900B2DE3D /* Project object */; -} diff --git a/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/Notification - TestWatchApp2 WatchKit App.xcscheme b/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/Notification - TestWatchApp2 WatchKit App.xcscheme deleted file mode 100644 index 96091d4..0000000 --- a/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/Notification - TestWatchApp2 WatchKit App.xcscheme +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/TestWatchApp2 WatchKit App.xcscheme b/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/TestWatchApp2 WatchKit App.xcscheme deleted file mode 100644 index e1828a3..0000000 --- a/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/TestWatchApp2 WatchKit App.xcscheme +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/TestWatchApp2.xcscheme b/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/TestWatchApp2.xcscheme deleted file mode 100644 index 540c283..0000000 --- a/test/TestWatchApp2/TestWatchApp2.xcodeproj/xcshareddata/xcschemes/TestWatchApp2.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp2/TestWatchApp2/AppDelegate.h b/test/TestWatchApp2/TestWatchApp2/AppDelegate.h deleted file mode 100644 index 47ef0c3..0000000 --- a/test/TestWatchApp2/TestWatchApp2/AppDelegate.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// AppDelegate.h -// TestWatchApp2 -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - - -@end - diff --git a/test/TestWatchApp2/TestWatchApp2/AppDelegate.m b/test/TestWatchApp2/TestWatchApp2/AppDelegate.m deleted file mode 100644 index 68c0a36..0000000 --- a/test/TestWatchApp2/TestWatchApp2/AppDelegate.m +++ /dev/null @@ -1,45 +0,0 @@ -// -// AppDelegate.m -// TestWatchApp2 -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import "AppDelegate.h" - -@interface AppDelegate () - -@end - -@implementation AppDelegate - - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. -} - -- (void)applicationWillTerminate:(UIApplication *)application { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/test/TestWatchApp2/TestWatchApp2/Assets.xcassets/AppIcon.appiconset/Contents.json b/test/TestWatchApp2/TestWatchApp2/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 36d2c80..0000000 --- a/test/TestWatchApp2/TestWatchApp2/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/test/TestWatchApp2/TestWatchApp2/Base.lproj/LaunchScreen.storyboard b/test/TestWatchApp2/TestWatchApp2/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 2e721e1..0000000 --- a/test/TestWatchApp2/TestWatchApp2/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp2/TestWatchApp2/Base.lproj/Main.storyboard b/test/TestWatchApp2/TestWatchApp2/Base.lproj/Main.storyboard deleted file mode 100644 index f56d2f3..0000000 --- a/test/TestWatchApp2/TestWatchApp2/Base.lproj/Main.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/TestWatchApp2/TestWatchApp2/Info.plist b/test/TestWatchApp2/TestWatchApp2/Info.plist deleted file mode 100644 index 40c6215..0000000 --- a/test/TestWatchApp2/TestWatchApp2/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/test/TestWatchApp2/TestWatchApp2/ViewController.h b/test/TestWatchApp2/TestWatchApp2/ViewController.h deleted file mode 100644 index 0e9697e..0000000 --- a/test/TestWatchApp2/TestWatchApp2/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// TestWatchApp2 -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import - -@interface ViewController : UIViewController - - -@end - diff --git a/test/TestWatchApp2/TestWatchApp2/ViewController.m b/test/TestWatchApp2/TestWatchApp2/ViewController.m deleted file mode 100644 index ad12976..0000000 --- a/test/TestWatchApp2/TestWatchApp2/ViewController.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// ViewController.m -// TestWatchApp2 -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import "ViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -@end diff --git a/test/TestWatchApp2/TestWatchApp2/main.m b/test/TestWatchApp2/TestWatchApp2/main.m deleted file mode 100644 index 5a7fef7..0000000 --- a/test/TestWatchApp2/TestWatchApp2/main.m +++ /dev/null @@ -1,16 +0,0 @@ -// -// main.m -// TestWatchApp2 -// -// Created by Chris Barber on 7/22/15. -// Copyright Ā© 2015 Appcelerator. All rights reserved. -// - -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/test/fixtures/Bad Provisioning Profiles/bad_plist.mobileprovision b/test/fixtures/Bad Provisioning Profiles/bad_plist.mobileprovision new file mode 100644 index 0000000..f00e65b --- /dev/null +++ b/test/fixtures/Bad Provisioning Profiles/bad_plist.mobileprovision @@ -0,0 +1,4 @@ +foo! + diff --git a/test/fixtures/Bad Provisioning Profiles/no_plist.mobileprovision b/test/fixtures/Bad Provisioning Profiles/no_plist.mobileprovision new file mode 100644 index 0000000..929efb3 --- /dev/null +++ b/test/fixtures/Bad Provisioning Profiles/no_plist.mobileprovision @@ -0,0 +1 @@ +foo! diff --git a/test/fixtures/BadXcode.app/.gitignore b/test/fixtures/BadXcode.app/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/IncompleteXcode.app/Contents/Developer/usr/bin/xcodebuild b/test/fixtures/IncompleteXcode.app/Contents/Developer/usr/bin/xcodebuild new file mode 100644 index 0000000..76bc49c --- /dev/null +++ b/test/fixtures/IncompleteXcode.app/Contents/Developer/usr/bin/xcodebuild @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from xcodebuild" diff --git a/test/fixtures/OldXcode.app/Contents/Developer/usr/bin/xcodebuild b/test/fixtures/OldXcode.app/Contents/Developer/usr/bin/xcodebuild new file mode 100644 index 0000000..76bc49c --- /dev/null +++ b/test/fixtures/OldXcode.app/Contents/Developer/usr/bin/xcodebuild @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from xcodebuild" diff --git a/test/fixtures/OldXcode.app/Contents/version.plist b/test/fixtures/OldXcode.app/Contents/version.plist new file mode 100644 index 0000000..e2ab441 --- /dev/null +++ b/test/fixtures/OldXcode.app/Contents/version.plist @@ -0,0 +1,20 @@ + + + + + BuildAliasOf + IDEFrameworks + BuildVersion + 1 + CFBundleShortVersionString + 5.0 + CFBundleVersion + 13245 + ProductBuildVersion + 9A235 + ProjectName + IDEFrameworks + SourceVersion + 13247000000000000 + + diff --git a/test/fixtures/Provisioning Profiles/11111111-1111-1111-1111-111111111111.mobileprovision b/test/fixtures/Provisioning Profiles/11111111-1111-1111-1111-111111111111.mobileprovision new file mode 100644 index 0000000..ad48ecc --- /dev/null +++ b/test/fixtures/Provisioning Profiles/11111111-1111-1111-1111-111111111111.mobileprovision @@ -0,0 +1,59 @@ +XXXXXXXXXX + + + + AppIDName + Test App + ApplicationIdentifierPrefix + + WP12345678 + + CreationDate + 2016-09-20T22:33:39Z + Platform + + iOS + + DeveloperCertificates + + REVWRUxPUEVSX0NFUlRfR09FU19IRVJF + + Entitlements + + keychain-access-groups + + WP12345678.* + + get-task-allow + + application-identifier + WP12345678.com.test + com.apple.security.application-groups + + group.com.test + + com.apple.developer.team-identifier + WP12345678 + aps-environment + production + beta-reports-active + + + ExpirationDate + 2018-09-20T22:06:04Z + Name + Test App + TeamIdentifier + + WP12345678 + + TeamName + Testco + TimeToLive + 364 + UUID + 11111111-1111-1111-1111-111111111111 + Version + 1 + +XXXXXXXXXX diff --git a/test/fixtures/Provisioning Profiles/22222222-2222-2222-2222-222222222222.mobileprovision b/test/fixtures/Provisioning Profiles/22222222-2222-2222-2222-222222222222.mobileprovision new file mode 100644 index 0000000..85859e5 --- /dev/null +++ b/test/fixtures/Provisioning Profiles/22222222-2222-2222-2222-222222222222.mobileprovision @@ -0,0 +1,63 @@ +XXXXXXXXXX + + + + AppIDName + Test App + ApplicationIdentifierPrefix + + WP12345678 + + CreationDate + 2016-09-20T22:33:39Z + Platform + + iOS + + DeveloperCertificates + + REVWRUxPUEVSX0NFUlRfR09FU19IRVJF + + Entitlements + + keychain-access-groups + + WP12345678.* + + get-task-allow + + application-identifier + WP12345678.com.test + com.apple.security.application-groups + + group.com.test + + com.apple.developer.team-identifier + WP12345678 + aps-environment + production + beta-reports-active + + + ExpirationDate + 2018-09-20T22:06:04Z + Name + Test App + ProvisionedDevices + + UDID_GOES_HERE + + TeamIdentifier + + WP12345678 + + TeamName + Testco + TimeToLive + 364 + UUID + 22222222-2222-2222-2222-222222222222 + Version + 1 + +XXXXXXXXXX diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator b/test/fixtures/Xcode11.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator new file mode 100755 index 0000000..25e61d4 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from Simulator" diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/dummy/.gitignore b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/dummy/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..e158c94 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,16 @@ + + + + + BuildID + E015DD14-9984-11E9-A6F4-550688D0A4B8 + ProductBuildVersion + 17A5522e + ProductCopyright + 1983-2019 Apple Inc. + ProductName + iPhone OS + ProductVersion + 13.0 + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.0.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.0.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..e158c94 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.0.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,16 @@ + + + + + BuildID + E015DD14-9984-11E9-A6F4-550688D0A4B8 + ProductBuildVersion + 17A5522e + ProductCopyright + 1983-2019 Apple Inc. + ProductName + iPhone OS + ProductVersion + 13.0 + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Info.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Info.plist new file mode 100644 index 0000000..db63da2 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Info.plist @@ -0,0 +1,46 @@ + + + + + DTPlatformVersion + GM + CFBundleIdentifier + com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus + CFBundleInfoDictionaryVersion + 6.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + CFBundleVersion + 1 + DTPlatformBuild + 9M189u + CFBundleExecutable + iPhone 7 Plus + DTXcodeBuild + 9M189u + DTSDKName + macosx10.12internal + CFBundleShortVersionString + 1.0 + DTXcode + 0900 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleSignature + ???? + CFBundlePackageType + BNDL + BuildMachineOSBuild + 16B2657 + DTSDKBuild + 16B2657 + CFBundleDevelopmentRegion + English + NSHumanReadableCopyright + Copyright Ā© 2013-2016 Apple Inc. All rights reserved. + CFBundleName + iPhone 7 Plus + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/capabilities.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/capabilities.plist new file mode 100644 index 0000000..96cdebc --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/capabilities.plist @@ -0,0 +1,172 @@ + + + + + iconState + + iconLists + + + com.apple.mobileslideshow + com.apple.MobileAddressBook + com.apple.Preferences + com.apple.gamecenter + com.apple.MobileSMS + com.apple.mobilecal + com.apple.camera + com.apple.youtube + com.apple.stocks + com.apple.Maps + com.apple.weather + com.apple.mobilenotes + com.apple.reminders + com.apple.mobiletimer + + listType + newsstand + iconLists + + + + displayName + Newsstand + + + + com.apple.videos + com.apple.MobileStore + com.apple.AppStore + + defaultDisplayName + Utilities + iconLists + + + com.apple.calculator + com.apple.compass + com.apple.VoiceMemos + + + + com.apple.nike + + + buttonBar + + com.apple.mobilephone + com.apple.mobilemail + com.apple.mobilesafari + com.apple.mobileipod + + + capabilities + + cellular-data + + accessibility + + gamekit + + memoryClass + 4 + PiPPinned + + modelIdentifier + iPhone9,2 + displayGamut + P3 + arm64 + + shoebox + + load-thumbnails-while-scrolling + + MLEHW + + idiom + phone + location-services + + hardware-keyboard + + full-6 + + contains-cellular-radio + + opengles-1 + + hidpi + + wifi + + sms + + opengles-2 + + applicationInstallation + + software-dimming-alpha + 0 + ASTC + + graphicsFeatureSetFallbacks + MTL3,1:MTL2,2:MTL1,2:GLES2,0 + IsLargeFormatPhone + + GPSCapability + + HasThinBezel + + armv7s + + telephony + + screenrecorder + + unified-ipod + + bluetooth-le + + watch-companion + + armv6 + + stand-alone-contacts + + microphone + + marketing-name + iPhone 7 Plus + multitasking + + ModelNumber + A1661 + subtype + 570 + ringer-switch + + international-settings + + PiPOverlay + + accelerometer + + SupportsForceTouch + + armv7 + + homescreen-wallpaper + + graphicsClass + 2 + graphicsFeatureSetClass + MTL3,2 + device-name + iPhone Simulator + bluetooth + + touch-id + + + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/profile.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/profile.plist new file mode 100644 index 0000000..a29e5c9 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/profile.plist @@ -0,0 +1,68 @@ + + + + + mainScreenHeight + 2208 + supportedProductFamilyIDs + + 1 + + modelIdentifier + iPhone9,2 + chromeIdentifier + com.apple.CoreSimulator.SimDeviceChrome.phone + productClass + D11 + mainScreenHeightDPI + 461 + minRuntimeVersion + 10.0 + mainScreenScale + 3 + mainScreenWidth + 1242 + mainScreenWidthDPI + 461 + supportedArchs + + x86_64 + i386 + + springBoardConfigName + iPhone4Simulator + environment + + SIMULATOR_LEGACY_ASSET_SUFFIX + iphone + + supportedFeatures + + com.apple.hid.keyboard + + com.apple.display.integrated + + com.apple.display.supports-external + + com.apple.hid.touch-screen + + + supportedFeaturesConditionalOnRuntime + + com.apple.hid.applepay.authorize + + com.apple.carplay + + com.apple.watch.pairing.qws + + com.apple.touch-id + + com.apple.watch.pairing.companion + + com.apple.hid.touch-pressure + + com.apple.CoreSimulator.pairing + + + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist new file mode 100644 index 0000000..97df493 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist @@ -0,0 +1,50 @@ + + + + + CFBundleName + iOS 13.0 + DTXcode + 1100 + DTSDKName + macosx10.14internal + NSHumanReadableCopyright + Copyright Ā© 2013-2019 Apple Inc. All rights reserved. + DTSDKBuild + 18A391011 + CFBundleDevelopmentRegion + English + CFBundleVersion + 232 + BuildMachineOSBuild + 18A391011 + DTPlatformName + macosx + CFBundlePackageType + BNDL + CFBundleShortVersionString + 232 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleExecutable + iOS 13.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + CFBundleIdentifier + com.apple.CoreSimulator.SimRuntime.iOS-13-0 + DTPlatformVersion + 10.14 + DTXcodeBuild + 11M335w + CFBundleSignature + ???? + LSMinimumSystemVersion + 10.10 + DTPlatformBuild + 11M335w + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/profile.plist b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/profile.plist new file mode 100644 index 0000000..bcd6222 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/profile.plist @@ -0,0 +1,120 @@ + + + + + forwardHostNotificationsWithState + + com.apple.system.thermalpressurelevel + com.apple.system.thermalpressurelevel + + preferredPairingDeviceTypes + + com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max + com.apple.CoreSimulator.SimDeviceType.iPhone-XS + + supportedProductFamilyIDs + + 2 + 1 + + pairingRequirements + + minOSVersion + 3.2 + maxPairs + 100 + supportedProductFamilies + + 4 + + + forwardHostNotifications + + com.apple.system.clock_set + com.apple.system.clock_set + + conditionalFeatures + + com.apple.accelerator.iosurface + + hostMinVersion + 10.14.4 + + com.apple.accelerator.metal + + hostHasMetalGPU + + hostMinVersion + 10.15 + + + platformIdentifier + com.apple.platform.iphonesimulator + requiredHostServices + + com.apple.PowerManagement.control + com.apple.PowerManagement.control + com.apple.SystemConfiguration.configd_host + com.apple.SystemConfiguration.configd + com.apple.audio.coreaudiod + com.apple.audio.coreaudiod + com.apple.SystemConfiguration.PPPController + com.apple.SystemConfiguration.PPPController + com.apple.audio.audiohald + com.apple.audio.audiohald + com.apple.coreservices.lsuseractivity.simulatorsupport + com.apple.coreservices.lsuseractivity.simulatorsupport + com.apple.SystemConfiguration.configd + com.apple.SystemConfiguration.configd + com.apple.FSEvents + com.apple.FSEvents + + defaultVersionString + 13.0 + minHostVersion + 10.14.4 + environment + + LS_ENABLE_BUNDLE_LOCALIZATION_CACHING + 1 + + supportedFeatures + + com.apple.CoreSimulator.display.rotation + + com.apple.CoreSimulator.framebuffer.server + + com.apple.UIKit.SimulatorShakeDarwinNotification + + com.apple.UIKit.SimulatorSlowMotionStateful + + com.apple.CoreSimulator.audio.routable + + com.apple.UIKit.SimulatorGraphicsQualityOverride + + com.apple.fs.apfs + + com.apple.instruments.remoteserver + + com.apple.coreanimation.virtual-context + + com.apple.siri + + + supportedFeaturesConditionalOnDeviceType + + com.apple.watch.pairing.qws + + com.apple.touch-id + + com.apple.hid.touch-pressure + + com.apple.hid.applepay.authorize + + com.apple.carplay + + com.apple.CoreSimulator.pairing + + + + diff --git a/test/fixtures/Xcode11.app/Contents/Developer/usr/bin/simctl b/test/fixtures/Xcode11.app/Contents/Developer/usr/bin/simctl new file mode 100755 index 0000000..736c8b0 --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/usr/bin/simctl @@ -0,0 +1,1738 @@ +#!/bin/sh + +echo '{ + "devicetypes" : [ + { + "name" : "iPhone 4s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-4s" + }, + { + "name" : "iPhone 5", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5" + }, + { + "name" : "iPhone 5s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s" + }, + { + "name" : "iPhone 6", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6" + }, + { + "name" : "iPhone 6 Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus" + }, + { + "name" : "iPhone 6s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s" + }, + { + "name" : "iPhone 6s Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus" + }, + { + "name" : "iPhone 7", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7" + }, + { + "name" : "iPhone 7 Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus" + }, + { + "name" : "iPhone SE", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE" + }, + { + "name" : "iPhone2017-A", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8" + }, + { + "name" : "iPhone2017-B", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus" + }, + { + "name" : "iPhone2017-C", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X" + }, + { + "name" : "iPad 2", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-2" + }, + { + "name" : "iPad Retina", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Retina" + }, + { + "name" : "iPad Air", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air" + }, + { + "name" : "iPad Air 2", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2" + }, + { + "name" : "iPad (5th generation)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-" + }, + { + "name" : "iPad Pro (9.7-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-" + }, + { + "name" : "iPad Pro (12.9-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro" + }, + { + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-" + }, + { + "name" : "iPad Pro (10.5-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-" + }, + { + "name" : "Apple TV", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p" + }, + { + "name" : "Apple TV 4K", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K" + }, + { + "name" : "Apple TV 4K (at 1080p)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p" + }, + { + "name" : "Apple Watch - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm" + }, + { + "name" : "Apple Watch - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm" + }, + { + "name" : "Apple Watch Series 2 - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm" + }, + { + "name" : "Apple Watch Series 2 - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm" + }, + { + "name" : "Watch2017 - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm" + }, + { + "name" : "Watch2017 - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm" + } + ], + "runtimes" : [ + { + "buildversion" : "12B411", + "availability" : "(available)", + "name" : "iOS 8.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-1", + "version" : "8.1" + }, + { + "buildversion" : "12D508", + "availability" : "(available)", + "name" : "iOS 8.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-2", + "version" : "8.2" + }, + { + "buildversion" : "12F70", + "availability" : "(available)", + "name" : "iOS 8.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-3", + "version" : "8.3" + }, + { + "buildversion" : "12H141", + "availability" : "(available)", + "name" : "iOS 8.4", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-4", + "version" : "8.4" + }, + { + "buildversion" : "13A344", + "availability" : "(available)", + "name" : "iOS 9.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-0", + "version" : "9.0" + }, + { + "buildversion" : "13B143", + "availability" : "(available)", + "name" : "iOS 9.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-1", + "version" : "9.1" + }, + { + "buildversion" : "13C75", + "availability" : "(available)", + "name" : "iOS 9.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-2", + "version" : "9.2" + }, + { + "buildversion" : "13E233", + "availability" : "(available)", + "name" : "iOS 9.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-3", + "version" : "9.3" + }, + { + "buildversion" : "14A345", + "availability" : "(available)", + "name" : "iOS 10.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-0", + "version" : "10.0" + }, + { + "buildversion" : "14B72", + "availability" : "(available)", + "name" : "iOS 10.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-1", + "version" : "10.1" + }, + { + "buildversion" : "14C89", + "availability" : "(available)", + "name" : "iOS 10.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-2", + "version" : "10.2" + }, + { + "buildversion" : "14E8301", + "availability" : "(available)", + "name" : "iOS 10.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-3", + "version" : "10.3.1" + }, + { + "buildversion" : "15A372", + "availability" : "(available)", + "name" : "iOS 11.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-11-0", + "version" : "11.0" + }, + { + "buildversion" : "15J380", + "availability" : "(available)", + "name" : "tvOS 11.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.tvOS-11-0", + "version" : "11.0" + }, + { + "buildversion" : "13S343", + "availability" : "(available)", + "name" : "watchOS 2.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-0", + "version" : "2.0" + }, + { + "buildversion" : "13S661", + "availability" : "(available)", + "name" : "watchOS 2.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-1", + "version" : "2.1" + }, + { + "buildversion" : "13V144", + "availability" : "(available)", + "name" : "watchOS 2.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-2", + "version" : "2.2" + }, + { + "buildversion" : "14S471a", + "availability" : "(available)", + "name" : "watchOS 3.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-3-1", + "version" : "3.1" + }, + { + "buildversion" : "14V243", + "availability" : "(available)", + "name" : "watchOS 3.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-3-2", + "version" : "3.2" + }, + { + "buildversion" : "15R372", + "availability" : "(available)", + "name" : "watchOS 4.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-4-0", + "version" : "4.0" + } + ], + "devices" : { + "iOS 8.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "602D7BFD-35E0-4E83-BEA7-6002BA0F4D5E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "5EB5F6ED-1345-47BD-A38E-666E4863240A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "E2693FD7-E671-4753-A438-038B83573D5E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "D42DA841-250C-4DAE-AC2D-5EEBED5E79ED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "85B1F870-73FA-4822-98EF-0F51C374A520" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "CF9F197F-8B2A-4788-8B31-B59008D33D8E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "DB28283A-D837-482F-AB90-91B3665470D0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "28A98C9B-610E-4082-824C-754DEC0348A5" + } + ], + "watchOS 2.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "EA660137-200A-49BD-8096-2771A75CD555" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "294502AF-6DD2-44AB-BD2D-2462237835A0" + } + ], + "watchOS 4.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "894DD68F-AF3E-49A5-AB14-151303208531" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "E2D564D4-C8EF-4D00-9127-AC104FB5E973" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "8A91C961-6862-4AE4-B721-91D07B22A0F5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "6395E605-1519-4E36-97AB-0EAEAD988DF9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "E55F590C-F3F2-4182-AA69-B17683EF9FA4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "DDF101D2-1393-49CC-8C32-98FAA0DD3527" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "B8E6757D-4FB0-4799-8443-1A3282F288F0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "12C94717-40CC-4DD2-890D-A0C92A827881" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 3 - 38mm", + "udid" : "DD65A7D5-02B8-4B31-A969-1F74E4699505" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 3 - 42mm", + "udid" : "985D823F-A66B-4D3C-9E67-42EF760DC32D" + } + ], + "watchOS 2.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "4EC5A8AF-49A7-4EBA-894F-55F2E9A99A8E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "77358FDB-A9EB-4D69-BE96-83C5635C1038" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "3A3230B9-9ADA-4FB3-AB00-FCA272FB483D" + } + ], + "iOS 8.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "AF2D5410-A49C-4791-ADBE-504F2CEA7C21" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "AD2BB11C-61B1-4547-914C-99E8EAE478C5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C5950B80-0986-4009-9A5F-46C70372BDB9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "B45DE89F-AA37-4C60-9117-89FD7B9846CD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A40401A7-AB0B-4336-A7CF-9C0CE4A8CDF9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "4C810BDE-7B4D-45FD-ACFE-4F61A0DE8C60" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "B88124DA-91C2-47BB-8FA0-768D446F8EA9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "6C348D70-5BC3-4E1A-A42B-835DE7AB517D" + } + ], + "iOS 10.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "8EC1813C-82A2-408F-BB74-93F13BD8280F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "4A2E8159-3A59-4B48-B38D-8E6CEEFA44A7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "3BF8D87C-5583-4356-8639-51C00C81D925" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "BCB2B8F9-65F9-4AC1-B371-F98569B78EE6" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "FD7D58EF-59FC-4555-8202-59AE10F27860" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "asdf", + "udid" : "EB55D699-40BF-40AA-934B-AEADFE9CCF02" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "159B396D-D61D-4196-BD30-027AE27D2285" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "A5C83EA9-897C-4A16-A80D-E383E4B153CA" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "068C81B5-63C9-466B-BE58-D44C527736FF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "C5057256-5EB4-479F-B00C-9E9E6E6F10CD" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "392C0559-F808-4204-A9A9-C71F97715259" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "3347E41C-DB69-432A-9F87-C195FE3CE63B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "BA0BEF0A-168B-4054-BEF7-7878A1936578" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad (5th generation)", + "udid" : "E0E205B5-49BB-4CC2-B775-C0D4363DFE96" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "C3972EDD-9AD7-4A8D-A03B-EBF7EA904C3E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "3F50EE7B-5FA3-4550-B5B1-3ED93ADF5DD2" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "udid" : "9924F372-9CC9-4331-B348-6EA0B62170DE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (10.5-inch)", + "udid" : "A978600A-1BAD-45B4-840D-D9D00820E136" + } + ], + "iOS 8.4" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "4BB61B8A-8A90-4D86-8463-1FC06678FA30" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "EF5AE97B-122C-44E6-A432-1A4B1BCA20EB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "EFF4FA45-6C84-42BE-BE4E-A00946967EB4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "A621FD08-D9E1-461C-9179-F6A8273389BA" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A9FFE7BB-2903-4D82-A53F-2418512640A8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "E6E2D7FF-A5C4-4515-A27A-692D92C5A011" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "71759027-1AC1-4EFB-881E-51BD92C56D87" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "0DC73028-1ED5-4173-9BDC-03426B01D309" + } + ], + "iOS 10.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "1F17E923-8204-4E01-A533-6440F0594358" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "7DB88AAC-0257-4EA3-9561-CCF1938A5A0B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "D2928C8B-C70D-47B0-BE78-18B39556FE32" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "787D25C9-37F8-4A50-883E-46A9D3A8DE20" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "E4F2429C-2F8C-49FB-8E44-210AFB9FBA8A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "D99CA8B4-852E-48D5-A7C1-4446A52716EE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "63D926F7-1D0F-4BCD-8FDB-5E55C731673C" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "60DDBF0F-5D95-452B-9DEE-E9D58FAF2D77" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "5338FB07-5B7F-4703-B2A9-DF6225E41FF1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "0F804774-FD0C-4FB4-9ACF-246F869428EC" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "B9149367-BBE9-4E74-B2DD-8EB544DE04B3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "EBE3692C-D0F8-4E9F-BA1E-19F7B5827D57" + } + ], + "iOS 9.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "4AC3B95D-7F5C-456B-9F8D-6DB82B38278B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "196A0004-0619-496C-A1DB-CAAFEC8E16AC" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "FD19CDCE-6AB8-4956-B64C-5BC7669F4F72" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "62E48B91-6D2A-423A-9C9F-E90508AA9FCE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "883F4526-2800-4864-BB0B-D64CEAE2626A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "0369B028-09EA-40B0-A54E-73A4D88A6563" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "A4F669ED-81B9-48CA-BB0E-E967A2E85B61" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "81F12EAA-0F9E-46AF-82D6-46904280A759" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "0BD1F4FE-6FB9-4C91-A5A7-3D87DB5337CF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "A797F5DA-8F44-4A50-A806-B786294EAA81" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "94D87EF4-9BAB-453C-AAD0-54EC678410AF" + } + ], + "iOS 9.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "61459108-4C89-4A8A-AC16-B1306E52B9F1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "0C5C35E7-237A-470D-9B9E-9F3D9426BC15" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "CF17DD3F-FD3A-4824-90BD-3ACA2F25E981" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "A465611C-C7C1-4EEB-9214-E068BC20CA26" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "56E7D0C9-E7BE-49E9-BD22-033C87C966AD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "FF25A247-1811-47AF-A8B5-19354F2932FE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "712C1CD6-9929-4344-8A9E-EBBBB67DCD67" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "E069DD83-3821-4212-8141-E541FC2A0753" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "733EE770-4BF7-4191-B9E9-E683CE64AE99" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "339D86EB-CC09-4DAB-A37B-7BFA3EB3CC51" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "8345F0DE-245D-4120-9895-C89FF907E3AE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "2527D580-0311-4CFD-9640-CC4E42FA3038" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-2" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D6FAFAE6-E4DF-41D1-A553-5FDF7FC7BDEF" + } + ], + "iOS 10.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "EC865657-ED69-425C-9E10-90BA935A5176" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "DC5D470D-D31C-44E4-B16C-10676862C5F5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "6C00D239-9CF0-495F-A1C6-72FEDCE410BD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A1835E96-FE4A-49AA-BB74-D9216AD0E857" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "31B472C4-C5CF-4CA7-A6C9-8857E5F90525" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "808B033A-6E1F-4AB9-A450-E00ADB975C6C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "55E5B6C4-3610-45F0-A47B-49138BB6661C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "62DA6248-7F72-456F-853A-EBC05554840C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "357B5BD2-A691-49A0-B217-3D99AB0C9181" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "EF42ADDA-FC5C-4FF9-B677-783035233F0F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "CEC0C409-FA88-46DD-A102-F60D9FCE20E4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "681C11CE-8A05-4CD3-9768-75609550275F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7-inch)", + "udid" : "D468A10E-D13A-418C-AC23-222158CD5A2A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch)", + "udid" : "BB1F78A3-8459-41C6-B7C1-2EF4531074C5" + } + ], + "tvOS 11.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 1080p", + "udid" : "96387811-0A88-4BCB-BA78-328109EA4F8F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 4K", + "udid" : "420D484F-4487-4FD3-AC3C-62476C823CA7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 4K (at 1080p)", + "udid" : "9CC2EFB1-1BF2-4B2C-B36E-79DD46049A79" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-1" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "69AF1B4F-B6A5-41F2-A2E4-896F7C40FA97" + } + ], + "iOS 9.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "86A9575C-F90D-476C-AEEF-322832FF2685" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "202DBB9D-A5DD-4C09-96DC-693F659A3680" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C7595416-5472-42C2-BDB3-5D9EB9BE8FED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "91A3ED67-AD7B-48F6-8D1A-48EDB1AEA4A2" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "590FAFCF-CCAE-4495-B58C-FBF6731996B0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "74DC131E-C062-453F-844B-4A6EB5DD1F89" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "72575A2F-F57E-4646-9453-624D42445D2E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "D7E92ACD-AB7F-4FDC-BA79-A73DA2A16035" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "2C1A14EA-EBB1-49A2-ABC5-773673258C6F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7CCB9AF9-42A8-47D3-A0C1-F07625162DBB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "83C6CAD4-6966-4CAD-AF4E-5DDC6A075969" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "99E89AF7-B82D-44ED-B093-76F80193A6D4" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-0" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D57C6B4C-E855-4566-AC78-947E6DA8026E" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-9-2" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D81E4502-0BE4-4738-88D7-11E466BCB529" + } + ], + "iOS 11.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "18E43F32-5E3C-4017-AD30-643D9B1B1170" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "98DB2248-F444-4062-AF65-3B177BAADB2B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "B207E003-7A63-4159-A730-E4C591CA63DB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "EC223176-FCBC-4C16-BC6F-E519DC2C305C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "C1E83595-4222-43E7-9A6F-5F3A3D3A5E3C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "foo", + "udid" : "EBF60C97-C4EE-43BF-BC70-896080BFF7C8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "428DC5AD-5539-4896-A7CC-9900CD53248A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "F645F686-D0FE-48E9-82FF-7E486FA49986" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "4CBA12D8-B011-4FA7-A56C-8FC177861997" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 8", + "udid" : "DF7989D2-12CF-48C9-921E-9E5F2A446CCD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 8 Plus", + "udid" : "47F4B1D4-9610-4520-A6B1-F155557A89EB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone X", + "udid" : "B184EA2B-0B67-4343-9091-C916B94F038E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "79EC4979-E862-409B-8606-7227219B3F91" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "EC10C053-0894-46A9-9494-A98F666A3890" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad (5th generation)", + "udid" : "55C9796D-850B-4FEA-821C-754E2F687D51" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "22FB5213-E4C1-4023-916B-05F751E5FEF8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "20F90912-5BD3-4FD7-A390-89AF18C4472B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "udid" : "9AFA069C-1337-4C85-9892-4F89A8B0DA34" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (10.5-inch)", + "udid" : "5E5076B1-7C61-415A-A330-34FC971DD308" + } + ], + "iOS 8.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "15EF0847-F4EC-4026-B1BF-B24639BF06A3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "C9C8EB05-E129-4ED2-BE6A-D1A324C6B307" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "389F62E9-72BA-478F-9028-D23C0119D3F4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "69E72023-FE03-4651-A912-17FD77051A13" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "7A7C4FDB-7B23-40C2-B85B-0C22C3225EA4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "7CAD91FC-7851-469D-9B2E-537D5E805E1B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "BEB7A278-0288-48EA-A192-2B85258DD05D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "6025AD0E-7347-4113-ABE3-7DA5B3C2FCC9" + } + ], + "iOS 9.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "C65BF923-9D7F-4809-9DE5-8F57D9E2B499" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "B46677BC-5D56-4F0F-A7C9-391FC741FDD3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "3D7A6CA5-E8A3-4CCF-911C-32FEDB651ADB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "9B32555B-3FD5-4B90-81ED-C796782921F1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "1C20388A-F192-466A-B43A-AA5EF50E49BB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "3072B555-6E30-48C9-8CA2-97645EC17FFE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "BCF6A918-B520-4F09-8602-FDDD78E39D13" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "25D8C01D-9584-435B-B762-DA1839486BA8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "6B035ED4-56A8-4B1D-96A9-F342F15765F8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7CB98A40-8061-486C-99E7-36AC5B97F363" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "4CF5981A-1C94-4925-85C5-70AF1F8B2E07" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "5577EC0A-0BAE-44FF-8B2A-92613E04430C" + } + ], + "watchOS 2.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "8EEA5302-BF03-4B21-BFA9-54876468FF7D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "4AAC051C-821E-4688-BF96-E7A480B83EBE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "6C6CA684-7F33-4242-B970-4B9F14ACE9ED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "4724C566-9A17-4C45-A0C1-EA728DFD1086" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "2CB10B36-3D2D-4324-80EF-8FE7DD045984" + } + ], + "iOS 10.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "27E6DA8D-E9A4-4200-9BCD-57553780D323" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C1993314-1546-45F6-B8EF-164295B293FF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "2802C22F-7C35-4BFC-A87B-A58F4FFDC966" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "B0BD38E7-B2BB-4845-93B1-631CA299788D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "2373B6FA-3212-48A1-9CA4-AB827D67F966" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "601BFAE5-B77A-48B2-8CAF-6268D75B1ADB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "3EA8DF8C-9196-43B2-BCF4-09FB2DFC0E28" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "B7D6D8FE-DC3D-44F6-93C1-527B52AFFBC3" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "366FBEED-A353-4566-BC7A-1EC951E95D0F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7EE6E1AA-DD65-4264-B7F2-3008FED2DA7E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "47CB3EB9-882A-46AD-AD17-1A5074F5D2B1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7-inch)", + "udid" : "10D41027-3CAA-406E-AA8C-258670F125AF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch)", + "udid" : "E6B6A797-6F01-4FEB-A471-D9C3920AA01C" + } + ], + "watchOS 3.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "1BF0C27A-029F-4E65-8158-E82953BBF687" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "2AF2AB04-4C4E-4699-A980-492C6342DFF4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "ECFB70F1-132D-47C6-A6CD-2B54A15316F7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "169E93D8-78A1-4C32-A2D3-E6848B6930B7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "6DDC9D8B-EFA3-4DE7-A1D2-A73E2EDD1385" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "C2C0366D-1E3E-4BBC-9343-E724FA6D581E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "693A7800-C04D-4358-8BE2-F418C3DB3BF0" + } + ], + "watchOS 3.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "C841D536-25FD-429E-823A-1F1C8D10B40C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "22CE8BD7-5B38-41AF-975A-CEFB4F7AFEC7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "0D4596D9-6AF8-4991-B5C0-2CE8CBE8AB88" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "C06F85C1-277B-473F-AC01-896985CD8C54" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "B5A0DFBB-3518-4E92-8255-7A982DE8C0D8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "3F5B4265-9CFF-471C-9337-FDB583D4E13C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "39FCCD77-7FFA-4566-A7E9-C3E09EEB1173" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "879F7D42-DE97-4DD3-9F08-75723A8B14E4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "41642CA8-A26D-4A0F-98D9-48B69E9E932D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "1BA5D988-F8FD-43C8-B441-CBDEA19A105E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm [Titanium]", + "udid" : "F298DFB0-0ACB-48E1-AED0-6E1CB05EF9CB" + } + ] + }, + "pairs" : { + "CA0C766D-EBEE-4F7D-84A9-9B443A32ADE5" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "1BA5D988-F8FD-43C8-B441-CBDEA19A105E", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96", + "state" : "Shutdown" + }, + "state" : "(inactive, disconnected)" + }, + "0C48C036-4CB3-4EE4-8EAC-24C5C5678DA5" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "C2C0366D-1E3E-4BBC-9343-E724FA6D581E", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "A5C83EA9-897C-4A16-A80D-E383E4B153CA", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "D90F7B93-409D-43E7-93E8-E58B1E60AF6C" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "8EEA5302-BF03-4B21-BFA9-54876468FF7D", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "3072B555-6E30-48C9-8CA2-97645EC17FFE", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "3A66DB1E-F4F8-45C6-8478-12DFF45E1FCB" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm [Titanium]", + "udid" : "F298DFB0-0ACB-48E1-AED0-6E1CB05EF9CB", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "87981DB0-3CBD-4A21-96CA-79548CC69AF9" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "DDF101D2-1393-49CC-8C32-98FAA0DD3527", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "C1E83595-4222-43E7-9A6F-5F3A3D3A5E3C", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "79B46C59-F6B7-4841-AE52-DBD90264A181" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "693A7800-C04D-4358-8BE2-F418C3DB3BF0", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "068C81B5-63C9-466B-BE58-D44C527736FF", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "099446B1-948E-4C08-A9F2-EEFF29D6B92B" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "879F7D42-DE97-4DD3-9F08-75723A8B14E4", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "3EA8DF8C-9196-43B2-BCF4-09FB2DFC0E28", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "F652E50B-5B44-4CBC-83E3-1780977E1993" : { + "watch" : { + "name" : "Apple Watch Series 3 - 42mm", + "udid" : "985D823F-A66B-4D3C-9E67-42EF760DC32D", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 8 Plus", + "udid" : "47F4B1D4-9610-4520-A6B1-F155557A89EB", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "0C30FE01-678C-4D75-A0C4-62B541D4A486" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "894DD68F-AF3E-49A5-AB14-151303208531", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "EC223176-FCBC-4C16-BC6F-E519DC2C305C", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "9D136B73-1BDF-4C78-B0DB-E7C425EFDC37" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "B8E6757D-4FB0-4799-8443-1A3282F288F0", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "428DC5AD-5539-4896-A7CC-9900CD53248A", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "BE42E223-3DAF-4186-8315-B0697CDA463B" : { + "watch" : { + "name" : "Apple Watch Series 3 - 38mm", + "udid" : "DD65A7D5-02B8-4B31-A969-1F74E4699505", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 8", + "udid" : "DF7989D2-12CF-48C9-921E-9E5F2A446CCD", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "8ACDD025-872A-4FCE-9414-61FF15986991" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "1BF0C27A-029F-4E65-8158-E82953BBF687", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "FD7D58EF-59FC-4555-8202-59AE10F27860", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "B826FADC-8607-419E-B5B4-05506F65B5D7" : { + "watch" : { + "name" : "bar", + "udid" : "6395E605-1519-4E36-97AB-0EAEAD988DF9", + "state" : "Shutdown" + }, + "phone" : { + "name" : "foo", + "udid" : "EBF60C97-C4EE-43BF-BC70-896080BFF7C8", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "A1EEF25B-1958-4CC7-8A6C-7A0B0AB837DE" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "12C94717-40CC-4DD2-890D-A0C92A827881", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "F645F686-D0FE-48E9-82FF-7E486FA49986", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "4E64AD6A-CB5A-4388-A3F6-3788016902AC" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "6DDC9D8B-EFA3-4DE7-A1D2-A73E2EDD1385", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "159B396D-D61D-4196-BD30-027AE27D2285", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "A87F0119-B2EC-4800-8A09-1ADDC9C2E863" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "2CB10B36-3D2D-4324-80EF-8FE7DD045984", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "BCF6A918-B520-4F09-8602-FDDD78E39D13", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + } + } +}' diff --git a/test/fixtures/Xcode11.app/Contents/Developer/usr/bin/xcodebuild b/test/fixtures/Xcode11.app/Contents/Developer/usr/bin/xcodebuild new file mode 100755 index 0000000..76bc49c --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/Developer/usr/bin/xcodebuild @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from xcodebuild" diff --git a/test/fixtures/Xcode11.app/Contents/version.plist b/test/fixtures/Xcode11.app/Contents/version.plist new file mode 100644 index 0000000..a28057a --- /dev/null +++ b/test/fixtures/Xcode11.app/Contents/version.plist @@ -0,0 +1,20 @@ + + + + + BuildAliasOf + IDEFrameworks + BuildVersion + 12 + CFBundleShortVersionString + 11.0 + CFBundleVersion + 14883.7 + ProductBuildVersion + 11M362v + ProjectName + IDEFrameworks + SourceVersion + 14883007000000000 + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Applications/Simulator (Watch).app/Contents/MacOS/Simulator (Watch) b/test/fixtures/Xcode8.app/Contents/Developer/Applications/Simulator (Watch).app/Contents/MacOS/Simulator (Watch) new file mode 100755 index 0000000..2ab7df4 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Applications/Simulator (Watch).app/Contents/MacOS/Simulator (Watch) @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from Watch Simulator" diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator b/test/fixtures/Xcode8.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator new file mode 100755 index 0000000..25e61d4 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from Simulator" diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/dummy/.gitignore b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/dummy/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..ac4d1ff --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,14 @@ + + + + + ProductBuildVersion + 14E8301 + ProductCopyright + 1983-2017 Apple Inc. + ProductName + iPhone OS + ProductVersion + 10.3.1 + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Info.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Info.plist new file mode 100644 index 0000000..768e4d6 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Info.plist @@ -0,0 +1,46 @@ + + + + + DTPlatformVersion + GM + CFBundleIdentifier + com.apple.CoreSimulator.SimDeviceType.iPhone-7 + CFBundleInfoDictionaryVersion + 6.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + CFBundleVersion + 1 + DTPlatformBuild + 8V109d + CFBundleExecutable + iPhone 7 + DTXcodeBuild + 8V109d + DTSDKName + macosx10.11internal + CFBundleShortVersionString + 1.0 + DTXcode + 0830 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleSignature + ???? + CFBundlePackageType + BNDL + BuildMachineOSBuild + 15A284 + DTSDKBuild + 15A284 + CFBundleDevelopmentRegion + English + NSHumanReadableCopyright + Copyright Ā© 2013-2016 Apple Inc. All rights reserved. + CFBundleName + iPhone 7 + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Resources/capabilities.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Resources/capabilities.plist new file mode 100644 index 0000000..921a5da --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Resources/capabilities.plist @@ -0,0 +1,166 @@ + + + + + iconState + + iconLists + + + com.apple.mobileslideshow + com.apple.MobileAddressBook + com.apple.Preferences + com.apple.gamecenter + com.apple.MobileSMS + com.apple.mobilecal + com.apple.camera + com.apple.youtube + com.apple.stocks + com.apple.Maps + com.apple.weather + com.apple.mobilenotes + com.apple.reminders + com.apple.mobiletimer + + listType + newsstand + iconLists + + + + displayName + Newsstand + + + + com.apple.videos + com.apple.MobileStore + com.apple.AppStore + + defaultDisplayName + Utilities + iconLists + + + com.apple.calculator + com.apple.compass + com.apple.VoiceMemos + + + + com.apple.nike + + + buttonBar + + com.apple.mobilephone + com.apple.mobilemail + com.apple.mobilesafari + com.apple.mobileipod + + + capabilities + + contains-cellular-radio + + MLEHW + + screenrecorder + + memoryClass + 2 + arm64 + + unified-ipod + + GPSCapability + + microphone + + software-dimming-alpha + 0 + graphicsClass + 2 + PiPOverlay + + opengles-1 + + hardware-keyboard + + device-name + iPhone Simulator + graphicsFeatureSetFallbacks + MTL3,1:MTL2,2:MTL1,2:GLES2,0 + armv7 + + bluetooth + + idiom + phone + accelerometer + + sms + + modelIdentifier + iPhone9,1 + gamekit + + PiPPinned + + displayGamut + P3 + multitasking + + opengles-2 + + wifi + + applicationInstallation + + telephony + + international-settings + + ASTC + + cellular-data + + graphicsFeatureSetClass + MTL3,2 + accessibility + + armv7s + + ModelNumber + A1660 + full-6 + + hidpi + + homescreen-wallpaper + + armv6 + + SupportsForceTouch + + bluetooth-le + + marketing-name + iPhone 7 + shoebox + + stand-alone-contacts + + touch-id + + subtype + 569 + watch-companion + + location-services + + load-thumbnails-while-scrolling + + + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Resources/profile.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Resources/profile.plist new file mode 100644 index 0000000..1eabae1 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/DeviceTypes/iPhone 7.simdevicetype/Contents/Resources/profile.plist @@ -0,0 +1,66 @@ + + + + + mainScreenHeight + 1334 + supportedProductFamilyIDs + + 1 + + modelIdentifier + iPhone9,1 + productClass + D10 + mainScreenHeightDPI + 326 + minRuntimeVersion + 10.0 + mainScreenScale + 2 + mainScreenWidth + 750 + mainScreenWidthDPI + 326 + supportedArchs + + x86_64 + i386 + + springBoardConfigName + iPhone4Simulator + environment + + SIMULATOR_LEGACY_ASSET_SUFFIX + iphone + + supportedFeatures + + com.apple.hid.keyboard + + com.apple.display.integrated + + com.apple.display.supports-external + + com.apple.hid.touch-screen + + + supportedFeaturesConditionalOnRuntime + + com.apple.hid.applepay.authorize + + com.apple.carplay + + com.apple.watch.pairing.qws + + com.apple.touch-id + + com.apple.watch.pairing.companion + + com.apple.hid.touch-pressure + + com.apple.CoreSimulator.pairing + + + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Runtimes/iOS 10.3.simruntime/Contents/Info.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Runtimes/iOS 10.3.simruntime/Contents/Info.plist new file mode 100644 index 0000000..cc7b831 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Runtimes/iOS 10.3.simruntime/Contents/Info.plist @@ -0,0 +1,46 @@ + + + + + DTPlatformVersion + GM + CFBundleIdentifier + com.apple.CoreSimulator.SimRuntime.iOS-10-3 + CFBundleInfoDictionaryVersion + 6.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + CFBundleVersion + 1 + DTPlatformBuild + 8V109d + CFBundleExecutable + iOS 10.3 + DTXcodeBuild + 8V109d + DTSDKName + macosx10.11internal + CFBundleShortVersionString + 1.0 + DTXcode + 0830 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleSignature + ???? + CFBundlePackageType + BNDL + BuildMachineOSBuild + 15A284 + DTSDKBuild + 15A284 + CFBundleDevelopmentRegion + English + NSHumanReadableCopyright + Copyright Ā© 2013-2017 Apple Inc. All rights reserved. + CFBundleName + iOS 10.3 + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Runtimes/iOS 10.3.simruntime/Contents/Resources/profile.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Runtimes/iOS 10.3.simruntime/Contents/Resources/profile.plist new file mode 100644 index 0000000..3085501 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Runtimes/iOS 10.3.simruntime/Contents/Resources/profile.plist @@ -0,0 +1,98 @@ + + + + + defaultVersionString + 10.3 + forwardHostNotifications + + com.apple.system.clock_set + com.apple.system.clock_set + + forwardHostNotificationsWithState + + com.apple.system.thermalpressurelevel + com.apple.system.thermalpressurelevel + + minHostVersion + 10.11.0 + pairingRequirements + + maxPairs + 100 + minOSVersion + 3.0 + supportedProductFamilies + + 4 + + + platformIdentifier + com.apple.platform.iphonesimulator + platformName + iPhoneSimulator + preferredPairingDeviceTypes + + com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus + com.apple.CoreSimulator.SimDeviceType.iPhone-6s + com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus + com.apple.CoreSimulator.SimDeviceType.iPhone-7 + + requiredHostServices + + com.apple.FSEvents + com.apple.FSEvents + com.apple.PowerManagement.control + com.apple.PowerManagement.control + com.apple.SystemConfiguration.PPPController + com.apple.SystemConfiguration.PPPController + com.apple.SystemConfiguration.configd + com.apple.SystemConfiguration.configd + com.apple.SystemConfiguration.configd_host + com.apple.SystemConfiguration.configd + com.apple.audio.audiohald + com.apple.audio.audiohald + com.apple.audio.coreaudiod + com.apple.audio.coreaudiod + com.apple.coreservices.lsuseractivity.simulatorsupport + com.apple.coreservices.lsuseractivity.simulatorsupport + + runtimeDir + iPhoneSimulator.sdk + supportedFeatures + + com.apple.UIKit.SimulatorGraphicsQualityOverride + + com.apple.UIKit.SimulatorShakeDarwinNotification + + com.apple.UIKit.SimulatorSlowMotionStateful + + com.apple.fs.apfs + + com.apple.instruments.remoteserver + + com.apple.siri + + + supportedFeaturesConditionalOnDeviceType + + com.apple.CoreSimulator.pairing + + com.apple.carplay + + com.apple.hid.applepay.authorize + + com.apple.hid.touch-pressure + + com.apple.touch-id + + com.apple.watch.pairing.qws + + + supportedProductFamilyIDs + + 2 + 1 + + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/.gitignore b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..ac4d1ff --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,14 @@ + + + + + ProductBuildVersion + 14E8301 + ProductCopyright + 1983-2017 Apple Inc. + ProductName + iPhone OS + ProductVersion + 10.3.1 + + diff --git a/test/fixtures/Xcode8.app/Contents/Developer/usr/bin/simctl b/test/fixtures/Xcode8.app/Contents/Developer/usr/bin/simctl new file mode 100755 index 0000000..736c8b0 --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/usr/bin/simctl @@ -0,0 +1,1738 @@ +#!/bin/sh + +echo '{ + "devicetypes" : [ + { + "name" : "iPhone 4s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-4s" + }, + { + "name" : "iPhone 5", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5" + }, + { + "name" : "iPhone 5s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s" + }, + { + "name" : "iPhone 6", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6" + }, + { + "name" : "iPhone 6 Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus" + }, + { + "name" : "iPhone 6s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s" + }, + { + "name" : "iPhone 6s Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus" + }, + { + "name" : "iPhone 7", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7" + }, + { + "name" : "iPhone 7 Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus" + }, + { + "name" : "iPhone SE", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE" + }, + { + "name" : "iPhone2017-A", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8" + }, + { + "name" : "iPhone2017-B", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus" + }, + { + "name" : "iPhone2017-C", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X" + }, + { + "name" : "iPad 2", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-2" + }, + { + "name" : "iPad Retina", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Retina" + }, + { + "name" : "iPad Air", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air" + }, + { + "name" : "iPad Air 2", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2" + }, + { + "name" : "iPad (5th generation)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-" + }, + { + "name" : "iPad Pro (9.7-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-" + }, + { + "name" : "iPad Pro (12.9-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro" + }, + { + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-" + }, + { + "name" : "iPad Pro (10.5-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-" + }, + { + "name" : "Apple TV", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p" + }, + { + "name" : "Apple TV 4K", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K" + }, + { + "name" : "Apple TV 4K (at 1080p)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p" + }, + { + "name" : "Apple Watch - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm" + }, + { + "name" : "Apple Watch - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm" + }, + { + "name" : "Apple Watch Series 2 - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm" + }, + { + "name" : "Apple Watch Series 2 - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm" + }, + { + "name" : "Watch2017 - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm" + }, + { + "name" : "Watch2017 - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm" + } + ], + "runtimes" : [ + { + "buildversion" : "12B411", + "availability" : "(available)", + "name" : "iOS 8.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-1", + "version" : "8.1" + }, + { + "buildversion" : "12D508", + "availability" : "(available)", + "name" : "iOS 8.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-2", + "version" : "8.2" + }, + { + "buildversion" : "12F70", + "availability" : "(available)", + "name" : "iOS 8.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-3", + "version" : "8.3" + }, + { + "buildversion" : "12H141", + "availability" : "(available)", + "name" : "iOS 8.4", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-4", + "version" : "8.4" + }, + { + "buildversion" : "13A344", + "availability" : "(available)", + "name" : "iOS 9.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-0", + "version" : "9.0" + }, + { + "buildversion" : "13B143", + "availability" : "(available)", + "name" : "iOS 9.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-1", + "version" : "9.1" + }, + { + "buildversion" : "13C75", + "availability" : "(available)", + "name" : "iOS 9.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-2", + "version" : "9.2" + }, + { + "buildversion" : "13E233", + "availability" : "(available)", + "name" : "iOS 9.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-3", + "version" : "9.3" + }, + { + "buildversion" : "14A345", + "availability" : "(available)", + "name" : "iOS 10.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-0", + "version" : "10.0" + }, + { + "buildversion" : "14B72", + "availability" : "(available)", + "name" : "iOS 10.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-1", + "version" : "10.1" + }, + { + "buildversion" : "14C89", + "availability" : "(available)", + "name" : "iOS 10.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-2", + "version" : "10.2" + }, + { + "buildversion" : "14E8301", + "availability" : "(available)", + "name" : "iOS 10.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-3", + "version" : "10.3.1" + }, + { + "buildversion" : "15A372", + "availability" : "(available)", + "name" : "iOS 11.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-11-0", + "version" : "11.0" + }, + { + "buildversion" : "15J380", + "availability" : "(available)", + "name" : "tvOS 11.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.tvOS-11-0", + "version" : "11.0" + }, + { + "buildversion" : "13S343", + "availability" : "(available)", + "name" : "watchOS 2.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-0", + "version" : "2.0" + }, + { + "buildversion" : "13S661", + "availability" : "(available)", + "name" : "watchOS 2.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-1", + "version" : "2.1" + }, + { + "buildversion" : "13V144", + "availability" : "(available)", + "name" : "watchOS 2.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-2", + "version" : "2.2" + }, + { + "buildversion" : "14S471a", + "availability" : "(available)", + "name" : "watchOS 3.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-3-1", + "version" : "3.1" + }, + { + "buildversion" : "14V243", + "availability" : "(available)", + "name" : "watchOS 3.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-3-2", + "version" : "3.2" + }, + { + "buildversion" : "15R372", + "availability" : "(available)", + "name" : "watchOS 4.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-4-0", + "version" : "4.0" + } + ], + "devices" : { + "iOS 8.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "602D7BFD-35E0-4E83-BEA7-6002BA0F4D5E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "5EB5F6ED-1345-47BD-A38E-666E4863240A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "E2693FD7-E671-4753-A438-038B83573D5E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "D42DA841-250C-4DAE-AC2D-5EEBED5E79ED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "85B1F870-73FA-4822-98EF-0F51C374A520" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "CF9F197F-8B2A-4788-8B31-B59008D33D8E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "DB28283A-D837-482F-AB90-91B3665470D0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "28A98C9B-610E-4082-824C-754DEC0348A5" + } + ], + "watchOS 2.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "EA660137-200A-49BD-8096-2771A75CD555" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "294502AF-6DD2-44AB-BD2D-2462237835A0" + } + ], + "watchOS 4.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "894DD68F-AF3E-49A5-AB14-151303208531" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "E2D564D4-C8EF-4D00-9127-AC104FB5E973" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "8A91C961-6862-4AE4-B721-91D07B22A0F5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "6395E605-1519-4E36-97AB-0EAEAD988DF9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "E55F590C-F3F2-4182-AA69-B17683EF9FA4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "DDF101D2-1393-49CC-8C32-98FAA0DD3527" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "B8E6757D-4FB0-4799-8443-1A3282F288F0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "12C94717-40CC-4DD2-890D-A0C92A827881" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 3 - 38mm", + "udid" : "DD65A7D5-02B8-4B31-A969-1F74E4699505" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 3 - 42mm", + "udid" : "985D823F-A66B-4D3C-9E67-42EF760DC32D" + } + ], + "watchOS 2.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "4EC5A8AF-49A7-4EBA-894F-55F2E9A99A8E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "77358FDB-A9EB-4D69-BE96-83C5635C1038" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "3A3230B9-9ADA-4FB3-AB00-FCA272FB483D" + } + ], + "iOS 8.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "AF2D5410-A49C-4791-ADBE-504F2CEA7C21" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "AD2BB11C-61B1-4547-914C-99E8EAE478C5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C5950B80-0986-4009-9A5F-46C70372BDB9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "B45DE89F-AA37-4C60-9117-89FD7B9846CD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A40401A7-AB0B-4336-A7CF-9C0CE4A8CDF9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "4C810BDE-7B4D-45FD-ACFE-4F61A0DE8C60" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "B88124DA-91C2-47BB-8FA0-768D446F8EA9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "6C348D70-5BC3-4E1A-A42B-835DE7AB517D" + } + ], + "iOS 10.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "8EC1813C-82A2-408F-BB74-93F13BD8280F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "4A2E8159-3A59-4B48-B38D-8E6CEEFA44A7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "3BF8D87C-5583-4356-8639-51C00C81D925" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "BCB2B8F9-65F9-4AC1-B371-F98569B78EE6" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "FD7D58EF-59FC-4555-8202-59AE10F27860" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "asdf", + "udid" : "EB55D699-40BF-40AA-934B-AEADFE9CCF02" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "159B396D-D61D-4196-BD30-027AE27D2285" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "A5C83EA9-897C-4A16-A80D-E383E4B153CA" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "068C81B5-63C9-466B-BE58-D44C527736FF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "C5057256-5EB4-479F-B00C-9E9E6E6F10CD" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "392C0559-F808-4204-A9A9-C71F97715259" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "3347E41C-DB69-432A-9F87-C195FE3CE63B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "BA0BEF0A-168B-4054-BEF7-7878A1936578" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad (5th generation)", + "udid" : "E0E205B5-49BB-4CC2-B775-C0D4363DFE96" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "C3972EDD-9AD7-4A8D-A03B-EBF7EA904C3E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "3F50EE7B-5FA3-4550-B5B1-3ED93ADF5DD2" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "udid" : "9924F372-9CC9-4331-B348-6EA0B62170DE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (10.5-inch)", + "udid" : "A978600A-1BAD-45B4-840D-D9D00820E136" + } + ], + "iOS 8.4" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "4BB61B8A-8A90-4D86-8463-1FC06678FA30" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "EF5AE97B-122C-44E6-A432-1A4B1BCA20EB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "EFF4FA45-6C84-42BE-BE4E-A00946967EB4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "A621FD08-D9E1-461C-9179-F6A8273389BA" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A9FFE7BB-2903-4D82-A53F-2418512640A8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "E6E2D7FF-A5C4-4515-A27A-692D92C5A011" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "71759027-1AC1-4EFB-881E-51BD92C56D87" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "0DC73028-1ED5-4173-9BDC-03426B01D309" + } + ], + "iOS 10.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "1F17E923-8204-4E01-A533-6440F0594358" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "7DB88AAC-0257-4EA3-9561-CCF1938A5A0B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "D2928C8B-C70D-47B0-BE78-18B39556FE32" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "787D25C9-37F8-4A50-883E-46A9D3A8DE20" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "E4F2429C-2F8C-49FB-8E44-210AFB9FBA8A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "D99CA8B4-852E-48D5-A7C1-4446A52716EE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "63D926F7-1D0F-4BCD-8FDB-5E55C731673C" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "60DDBF0F-5D95-452B-9DEE-E9D58FAF2D77" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "5338FB07-5B7F-4703-B2A9-DF6225E41FF1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "0F804774-FD0C-4FB4-9ACF-246F869428EC" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "B9149367-BBE9-4E74-B2DD-8EB544DE04B3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "EBE3692C-D0F8-4E9F-BA1E-19F7B5827D57" + } + ], + "iOS 9.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "4AC3B95D-7F5C-456B-9F8D-6DB82B38278B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "196A0004-0619-496C-A1DB-CAAFEC8E16AC" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "FD19CDCE-6AB8-4956-B64C-5BC7669F4F72" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "62E48B91-6D2A-423A-9C9F-E90508AA9FCE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "883F4526-2800-4864-BB0B-D64CEAE2626A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "0369B028-09EA-40B0-A54E-73A4D88A6563" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "A4F669ED-81B9-48CA-BB0E-E967A2E85B61" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "81F12EAA-0F9E-46AF-82D6-46904280A759" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "0BD1F4FE-6FB9-4C91-A5A7-3D87DB5337CF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "A797F5DA-8F44-4A50-A806-B786294EAA81" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "94D87EF4-9BAB-453C-AAD0-54EC678410AF" + } + ], + "iOS 9.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "61459108-4C89-4A8A-AC16-B1306E52B9F1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "0C5C35E7-237A-470D-9B9E-9F3D9426BC15" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "CF17DD3F-FD3A-4824-90BD-3ACA2F25E981" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "A465611C-C7C1-4EEB-9214-E068BC20CA26" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "56E7D0C9-E7BE-49E9-BD22-033C87C966AD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "FF25A247-1811-47AF-A8B5-19354F2932FE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "712C1CD6-9929-4344-8A9E-EBBBB67DCD67" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "E069DD83-3821-4212-8141-E541FC2A0753" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "733EE770-4BF7-4191-B9E9-E683CE64AE99" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "339D86EB-CC09-4DAB-A37B-7BFA3EB3CC51" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "8345F0DE-245D-4120-9895-C89FF907E3AE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "2527D580-0311-4CFD-9640-CC4E42FA3038" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-2" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D6FAFAE6-E4DF-41D1-A553-5FDF7FC7BDEF" + } + ], + "iOS 10.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "EC865657-ED69-425C-9E10-90BA935A5176" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "DC5D470D-D31C-44E4-B16C-10676862C5F5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "6C00D239-9CF0-495F-A1C6-72FEDCE410BD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A1835E96-FE4A-49AA-BB74-D9216AD0E857" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "31B472C4-C5CF-4CA7-A6C9-8857E5F90525" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "808B033A-6E1F-4AB9-A450-E00ADB975C6C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "55E5B6C4-3610-45F0-A47B-49138BB6661C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "62DA6248-7F72-456F-853A-EBC05554840C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "357B5BD2-A691-49A0-B217-3D99AB0C9181" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "EF42ADDA-FC5C-4FF9-B677-783035233F0F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "CEC0C409-FA88-46DD-A102-F60D9FCE20E4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "681C11CE-8A05-4CD3-9768-75609550275F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7-inch)", + "udid" : "D468A10E-D13A-418C-AC23-222158CD5A2A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch)", + "udid" : "BB1F78A3-8459-41C6-B7C1-2EF4531074C5" + } + ], + "tvOS 11.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 1080p", + "udid" : "96387811-0A88-4BCB-BA78-328109EA4F8F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 4K", + "udid" : "420D484F-4487-4FD3-AC3C-62476C823CA7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 4K (at 1080p)", + "udid" : "9CC2EFB1-1BF2-4B2C-B36E-79DD46049A79" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-1" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "69AF1B4F-B6A5-41F2-A2E4-896F7C40FA97" + } + ], + "iOS 9.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "86A9575C-F90D-476C-AEEF-322832FF2685" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "202DBB9D-A5DD-4C09-96DC-693F659A3680" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C7595416-5472-42C2-BDB3-5D9EB9BE8FED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "91A3ED67-AD7B-48F6-8D1A-48EDB1AEA4A2" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "590FAFCF-CCAE-4495-B58C-FBF6731996B0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "74DC131E-C062-453F-844B-4A6EB5DD1F89" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "72575A2F-F57E-4646-9453-624D42445D2E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "D7E92ACD-AB7F-4FDC-BA79-A73DA2A16035" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "2C1A14EA-EBB1-49A2-ABC5-773673258C6F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7CCB9AF9-42A8-47D3-A0C1-F07625162DBB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "83C6CAD4-6966-4CAD-AF4E-5DDC6A075969" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "99E89AF7-B82D-44ED-B093-76F80193A6D4" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-0" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D57C6B4C-E855-4566-AC78-947E6DA8026E" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-9-2" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D81E4502-0BE4-4738-88D7-11E466BCB529" + } + ], + "iOS 11.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "18E43F32-5E3C-4017-AD30-643D9B1B1170" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "98DB2248-F444-4062-AF65-3B177BAADB2B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "B207E003-7A63-4159-A730-E4C591CA63DB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "EC223176-FCBC-4C16-BC6F-E519DC2C305C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "C1E83595-4222-43E7-9A6F-5F3A3D3A5E3C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "foo", + "udid" : "EBF60C97-C4EE-43BF-BC70-896080BFF7C8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "428DC5AD-5539-4896-A7CC-9900CD53248A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "F645F686-D0FE-48E9-82FF-7E486FA49986" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "4CBA12D8-B011-4FA7-A56C-8FC177861997" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 8", + "udid" : "DF7989D2-12CF-48C9-921E-9E5F2A446CCD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 8 Plus", + "udid" : "47F4B1D4-9610-4520-A6B1-F155557A89EB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone X", + "udid" : "B184EA2B-0B67-4343-9091-C916B94F038E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "79EC4979-E862-409B-8606-7227219B3F91" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "EC10C053-0894-46A9-9494-A98F666A3890" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad (5th generation)", + "udid" : "55C9796D-850B-4FEA-821C-754E2F687D51" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "22FB5213-E4C1-4023-916B-05F751E5FEF8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "20F90912-5BD3-4FD7-A390-89AF18C4472B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "udid" : "9AFA069C-1337-4C85-9892-4F89A8B0DA34" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (10.5-inch)", + "udid" : "5E5076B1-7C61-415A-A330-34FC971DD308" + } + ], + "iOS 8.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "15EF0847-F4EC-4026-B1BF-B24639BF06A3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "C9C8EB05-E129-4ED2-BE6A-D1A324C6B307" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "389F62E9-72BA-478F-9028-D23C0119D3F4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "69E72023-FE03-4651-A912-17FD77051A13" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "7A7C4FDB-7B23-40C2-B85B-0C22C3225EA4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "7CAD91FC-7851-469D-9B2E-537D5E805E1B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "BEB7A278-0288-48EA-A192-2B85258DD05D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "6025AD0E-7347-4113-ABE3-7DA5B3C2FCC9" + } + ], + "iOS 9.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "C65BF923-9D7F-4809-9DE5-8F57D9E2B499" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "B46677BC-5D56-4F0F-A7C9-391FC741FDD3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "3D7A6CA5-E8A3-4CCF-911C-32FEDB651ADB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "9B32555B-3FD5-4B90-81ED-C796782921F1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "1C20388A-F192-466A-B43A-AA5EF50E49BB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "3072B555-6E30-48C9-8CA2-97645EC17FFE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "BCF6A918-B520-4F09-8602-FDDD78E39D13" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "25D8C01D-9584-435B-B762-DA1839486BA8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "6B035ED4-56A8-4B1D-96A9-F342F15765F8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7CB98A40-8061-486C-99E7-36AC5B97F363" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "4CF5981A-1C94-4925-85C5-70AF1F8B2E07" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "5577EC0A-0BAE-44FF-8B2A-92613E04430C" + } + ], + "watchOS 2.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "8EEA5302-BF03-4B21-BFA9-54876468FF7D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "4AAC051C-821E-4688-BF96-E7A480B83EBE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "6C6CA684-7F33-4242-B970-4B9F14ACE9ED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "4724C566-9A17-4C45-A0C1-EA728DFD1086" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "2CB10B36-3D2D-4324-80EF-8FE7DD045984" + } + ], + "iOS 10.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "27E6DA8D-E9A4-4200-9BCD-57553780D323" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C1993314-1546-45F6-B8EF-164295B293FF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "2802C22F-7C35-4BFC-A87B-A58F4FFDC966" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "B0BD38E7-B2BB-4845-93B1-631CA299788D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "2373B6FA-3212-48A1-9CA4-AB827D67F966" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "601BFAE5-B77A-48B2-8CAF-6268D75B1ADB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "3EA8DF8C-9196-43B2-BCF4-09FB2DFC0E28" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "B7D6D8FE-DC3D-44F6-93C1-527B52AFFBC3" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "366FBEED-A353-4566-BC7A-1EC951E95D0F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7EE6E1AA-DD65-4264-B7F2-3008FED2DA7E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "47CB3EB9-882A-46AD-AD17-1A5074F5D2B1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7-inch)", + "udid" : "10D41027-3CAA-406E-AA8C-258670F125AF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch)", + "udid" : "E6B6A797-6F01-4FEB-A471-D9C3920AA01C" + } + ], + "watchOS 3.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "1BF0C27A-029F-4E65-8158-E82953BBF687" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "2AF2AB04-4C4E-4699-A980-492C6342DFF4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "ECFB70F1-132D-47C6-A6CD-2B54A15316F7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "169E93D8-78A1-4C32-A2D3-E6848B6930B7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "6DDC9D8B-EFA3-4DE7-A1D2-A73E2EDD1385" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "C2C0366D-1E3E-4BBC-9343-E724FA6D581E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "693A7800-C04D-4358-8BE2-F418C3DB3BF0" + } + ], + "watchOS 3.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "C841D536-25FD-429E-823A-1F1C8D10B40C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "22CE8BD7-5B38-41AF-975A-CEFB4F7AFEC7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "0D4596D9-6AF8-4991-B5C0-2CE8CBE8AB88" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "C06F85C1-277B-473F-AC01-896985CD8C54" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "B5A0DFBB-3518-4E92-8255-7A982DE8C0D8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "3F5B4265-9CFF-471C-9337-FDB583D4E13C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "39FCCD77-7FFA-4566-A7E9-C3E09EEB1173" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "879F7D42-DE97-4DD3-9F08-75723A8B14E4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "41642CA8-A26D-4A0F-98D9-48B69E9E932D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "1BA5D988-F8FD-43C8-B441-CBDEA19A105E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm [Titanium]", + "udid" : "F298DFB0-0ACB-48E1-AED0-6E1CB05EF9CB" + } + ] + }, + "pairs" : { + "CA0C766D-EBEE-4F7D-84A9-9B443A32ADE5" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "1BA5D988-F8FD-43C8-B441-CBDEA19A105E", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96", + "state" : "Shutdown" + }, + "state" : "(inactive, disconnected)" + }, + "0C48C036-4CB3-4EE4-8EAC-24C5C5678DA5" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "C2C0366D-1E3E-4BBC-9343-E724FA6D581E", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "A5C83EA9-897C-4A16-A80D-E383E4B153CA", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "D90F7B93-409D-43E7-93E8-E58B1E60AF6C" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "8EEA5302-BF03-4B21-BFA9-54876468FF7D", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "3072B555-6E30-48C9-8CA2-97645EC17FFE", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "3A66DB1E-F4F8-45C6-8478-12DFF45E1FCB" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm [Titanium]", + "udid" : "F298DFB0-0ACB-48E1-AED0-6E1CB05EF9CB", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "87981DB0-3CBD-4A21-96CA-79548CC69AF9" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "DDF101D2-1393-49CC-8C32-98FAA0DD3527", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "C1E83595-4222-43E7-9A6F-5F3A3D3A5E3C", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "79B46C59-F6B7-4841-AE52-DBD90264A181" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "693A7800-C04D-4358-8BE2-F418C3DB3BF0", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "068C81B5-63C9-466B-BE58-D44C527736FF", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "099446B1-948E-4C08-A9F2-EEFF29D6B92B" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "879F7D42-DE97-4DD3-9F08-75723A8B14E4", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "3EA8DF8C-9196-43B2-BCF4-09FB2DFC0E28", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "F652E50B-5B44-4CBC-83E3-1780977E1993" : { + "watch" : { + "name" : "Apple Watch Series 3 - 42mm", + "udid" : "985D823F-A66B-4D3C-9E67-42EF760DC32D", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 8 Plus", + "udid" : "47F4B1D4-9610-4520-A6B1-F155557A89EB", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "0C30FE01-678C-4D75-A0C4-62B541D4A486" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "894DD68F-AF3E-49A5-AB14-151303208531", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "EC223176-FCBC-4C16-BC6F-E519DC2C305C", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "9D136B73-1BDF-4C78-B0DB-E7C425EFDC37" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "B8E6757D-4FB0-4799-8443-1A3282F288F0", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "428DC5AD-5539-4896-A7CC-9900CD53248A", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "BE42E223-3DAF-4186-8315-B0697CDA463B" : { + "watch" : { + "name" : "Apple Watch Series 3 - 38mm", + "udid" : "DD65A7D5-02B8-4B31-A969-1F74E4699505", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 8", + "udid" : "DF7989D2-12CF-48C9-921E-9E5F2A446CCD", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "8ACDD025-872A-4FCE-9414-61FF15986991" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "1BF0C27A-029F-4E65-8158-E82953BBF687", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "FD7D58EF-59FC-4555-8202-59AE10F27860", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "B826FADC-8607-419E-B5B4-05506F65B5D7" : { + "watch" : { + "name" : "bar", + "udid" : "6395E605-1519-4E36-97AB-0EAEAD988DF9", + "state" : "Shutdown" + }, + "phone" : { + "name" : "foo", + "udid" : "EBF60C97-C4EE-43BF-BC70-896080BFF7C8", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "A1EEF25B-1958-4CC7-8A6C-7A0B0AB837DE" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "12C94717-40CC-4DD2-890D-A0C92A827881", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "F645F686-D0FE-48E9-82FF-7E486FA49986", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "4E64AD6A-CB5A-4388-A3F6-3788016902AC" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "6DDC9D8B-EFA3-4DE7-A1D2-A73E2EDD1385", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "159B396D-D61D-4196-BD30-027AE27D2285", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "A87F0119-B2EC-4800-8A09-1ADDC9C2E863" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "2CB10B36-3D2D-4324-80EF-8FE7DD045984", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "BCF6A918-B520-4F09-8602-FDDD78E39D13", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + } + } +}' diff --git a/test/fixtures/Xcode8.app/Contents/Developer/usr/bin/xcodebuild b/test/fixtures/Xcode8.app/Contents/Developer/usr/bin/xcodebuild new file mode 100755 index 0000000..76bc49c --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/Developer/usr/bin/xcodebuild @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from xcodebuild" diff --git a/test/fixtures/Xcode8.app/Contents/version.plist b/test/fixtures/Xcode8.app/Contents/version.plist new file mode 100644 index 0000000..6fa1f4b --- /dev/null +++ b/test/fixtures/Xcode8.app/Contents/version.plist @@ -0,0 +1,18 @@ + + + + + BuildVersion + 12 + CFBundleShortVersionString + 8.3.3 + CFBundleVersion + 12175.1 + ProductBuildVersion + 8E3004b + ProjectName + IDEFrameworks + SourceVersion + 12175001000000000 + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator b/test/fixtures/Xcode9.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator new file mode 100755 index 0000000..25e61d4 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from Simulator" diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Info.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Info.plist new file mode 100644 index 0000000..db63da2 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Info.plist @@ -0,0 +1,46 @@ + + + + + DTPlatformVersion + GM + CFBundleIdentifier + com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus + CFBundleInfoDictionaryVersion + 6.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + CFBundleVersion + 1 + DTPlatformBuild + 9M189u + CFBundleExecutable + iPhone 7 Plus + DTXcodeBuild + 9M189u + DTSDKName + macosx10.12internal + CFBundleShortVersionString + 1.0 + DTXcode + 0900 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleSignature + ???? + CFBundlePackageType + BNDL + BuildMachineOSBuild + 16B2657 + DTSDKBuild + 16B2657 + CFBundleDevelopmentRegion + English + NSHumanReadableCopyright + Copyright Ā© 2013-2016 Apple Inc. All rights reserved. + CFBundleName + iPhone 7 Plus + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/capabilities.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/capabilities.plist new file mode 100644 index 0000000..96cdebc --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/capabilities.plist @@ -0,0 +1,172 @@ + + + + + iconState + + iconLists + + + com.apple.mobileslideshow + com.apple.MobileAddressBook + com.apple.Preferences + com.apple.gamecenter + com.apple.MobileSMS + com.apple.mobilecal + com.apple.camera + com.apple.youtube + com.apple.stocks + com.apple.Maps + com.apple.weather + com.apple.mobilenotes + com.apple.reminders + com.apple.mobiletimer + + listType + newsstand + iconLists + + + + displayName + Newsstand + + + + com.apple.videos + com.apple.MobileStore + com.apple.AppStore + + defaultDisplayName + Utilities + iconLists + + + com.apple.calculator + com.apple.compass + com.apple.VoiceMemos + + + + com.apple.nike + + + buttonBar + + com.apple.mobilephone + com.apple.mobilemail + com.apple.mobilesafari + com.apple.mobileipod + + + capabilities + + cellular-data + + accessibility + + gamekit + + memoryClass + 4 + PiPPinned + + modelIdentifier + iPhone9,2 + displayGamut + P3 + arm64 + + shoebox + + load-thumbnails-while-scrolling + + MLEHW + + idiom + phone + location-services + + hardware-keyboard + + full-6 + + contains-cellular-radio + + opengles-1 + + hidpi + + wifi + + sms + + opengles-2 + + applicationInstallation + + software-dimming-alpha + 0 + ASTC + + graphicsFeatureSetFallbacks + MTL3,1:MTL2,2:MTL1,2:GLES2,0 + IsLargeFormatPhone + + GPSCapability + + HasThinBezel + + armv7s + + telephony + + screenrecorder + + unified-ipod + + bluetooth-le + + watch-companion + + armv6 + + stand-alone-contacts + + microphone + + marketing-name + iPhone 7 Plus + multitasking + + ModelNumber + A1661 + subtype + 570 + ringer-switch + + international-settings + + PiPOverlay + + accelerometer + + SupportsForceTouch + + armv7 + + homescreen-wallpaper + + graphicsClass + 2 + graphicsFeatureSetClass + MTL3,2 + device-name + iPhone Simulator + bluetooth + + touch-id + + + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/profile.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/profile.plist new file mode 100644 index 0000000..a29e5c9 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/DeviceTypes/iPhone 7 Plus.simdevicetype/Contents/Resources/profile.plist @@ -0,0 +1,68 @@ + + + + + mainScreenHeight + 2208 + supportedProductFamilyIDs + + 1 + + modelIdentifier + iPhone9,2 + chromeIdentifier + com.apple.CoreSimulator.SimDeviceChrome.phone + productClass + D11 + mainScreenHeightDPI + 461 + minRuntimeVersion + 10.0 + mainScreenScale + 3 + mainScreenWidth + 1242 + mainScreenWidthDPI + 461 + supportedArchs + + x86_64 + i386 + + springBoardConfigName + iPhone4Simulator + environment + + SIMULATOR_LEGACY_ASSET_SUFFIX + iphone + + supportedFeatures + + com.apple.hid.keyboard + + com.apple.display.integrated + + com.apple.display.supports-external + + com.apple.hid.touch-screen + + + supportedFeaturesConditionalOnRuntime + + com.apple.hid.applepay.authorize + + com.apple.carplay + + com.apple.watch.pairing.qws + + com.apple.touch-id + + com.apple.watch.pairing.companion + + com.apple.hid.touch-pressure + + com.apple.CoreSimulator.pairing + + + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist new file mode 100644 index 0000000..7214024 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Info.plist @@ -0,0 +1,46 @@ + + + + + DTPlatformVersion + GM + CFBundleIdentifier + com.apple.CoreSimulator.SimRuntime.iOS-11-0 + CFBundleInfoDictionaryVersion + 6.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + CFBundleVersion + 1 + DTPlatformBuild + 9M189u + CFBundleExecutable + iOS 11.0 + DTXcodeBuild + 9M189u + DTSDKName + macosx10.12internal + CFBundleShortVersionString + 1.0 + DTXcode + 0900 + CFBundleSupportedPlatforms + + MacOSX + + CFBundleSignature + ???? + CFBundlePackageType + BNDL + BuildMachineOSBuild + 16B2657 + DTSDKBuild + 16B2657 + CFBundleDevelopmentRegion + English + NSHumanReadableCopyright + Copyright Ā© 2013-2017 Apple Inc. All rights reserved. + CFBundleName + iOS 11.0 + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/profile.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/profile.plist new file mode 100644 index 0000000..946dc0b --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/profile.plist @@ -0,0 +1,96 @@ + + + + + supportedFeaturesConditionalOnDeviceType + + com.apple.watch.pairing.qws + + com.apple.touch-id + + com.apple.hid.touch-pressure + + com.apple.hid.applepay.authorize + + com.apple.carplay + + com.apple.CoreSimulator.pairing + + + pairingRequirements + + minOSVersion + 3.2 + maxPairs + 100 + supportedProductFamilies + + 4 + + + minHostVersion + 10.12.1 + forwardHostNotifications + + com.apple.system.clock_set + com.apple.system.clock_set + + supportedProductFamilyIDs + + 2 + 1 + + platformIdentifier + com.apple.platform.iphonesimulator + forwardHostNotificationsWithState + + com.apple.system.thermalpressurelevel + com.apple.system.thermalpressurelevel + + requiredHostServices + + com.apple.PowerManagement.control + com.apple.PowerManagement.control + com.apple.SystemConfiguration.configd_host + com.apple.SystemConfiguration.configd + com.apple.audio.coreaudiod + com.apple.audio.coreaudiod + com.apple.SystemConfiguration.PPPController + com.apple.SystemConfiguration.PPPController + com.apple.audio.audiohald + com.apple.audio.audiohald + com.apple.coreservices.lsuseractivity.simulatorsupport + com.apple.coreservices.lsuseractivity.simulatorsupport + com.apple.SystemConfiguration.configd + com.apple.SystemConfiguration.configd + com.apple.FSEvents + com.apple.FSEvents + + preferredPairingDeviceTypes + + com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus + com.apple.CoreSimulator.SimDeviceType.iPhone-7 + com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus + com.apple.CoreSimulator.SimDeviceType.iPhone-8 + + supportedFeatures + + com.apple.UIKit.SimulatorShakeDarwinNotification + + com.apple.UIKit.SimulatorSlowMotionStateful + + com.apple.CoreSimulator.audio.routable + + com.apple.UIKit.SimulatorGraphicsQualityOverride + + com.apple.fs.apfs + + com.apple.instruments.remoteserver + + com.apple.siri + + + defaultVersionString + 11.0 + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/dummy/.gitignore b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/dummy/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..fb73d81 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,16 @@ + + + + + BuildID + A06794BC-8F97-11E7-9FD5-F742537C7B35 + ProductBuildVersion + 15A372 + ProductCopyright + 1983-2017 Apple Inc. + ProductName + iPhone OS + ProductVersion + 11.0 + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..ac4d1ff --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,14 @@ + + + + + ProductBuildVersion + 14E8301 + ProductCopyright + 1983-2017 Apple Inc. + ProductName + iPhone OS + ProductVersion + 10.3.1 + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneSimulator.platform/SDKs/iPhoneSimulator.sdk/System/Library/CoreServices/SystemVersion.plist b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneSimulator.platform/SDKs/iPhoneSimulator.sdk/System/Library/CoreServices/SystemVersion.plist new file mode 100644 index 0000000..fb73d81 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/Platforms/iPhoneSimulator.platform/SDKs/iPhoneSimulator.sdk/System/Library/CoreServices/SystemVersion.plist @@ -0,0 +1,16 @@ + + + + + BuildID + A06794BC-8F97-11E7-9FD5-F742537C7B35 + ProductBuildVersion + 15A372 + ProductCopyright + 1983-2017 Apple Inc. + ProductName + iPhone OS + ProductVersion + 11.0 + + diff --git a/test/fixtures/Xcode9.app/Contents/Developer/usr/bin/simctl b/test/fixtures/Xcode9.app/Contents/Developer/usr/bin/simctl new file mode 100755 index 0000000..736c8b0 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/usr/bin/simctl @@ -0,0 +1,1738 @@ +#!/bin/sh + +echo '{ + "devicetypes" : [ + { + "name" : "iPhone 4s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-4s" + }, + { + "name" : "iPhone 5", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5" + }, + { + "name" : "iPhone 5s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-5s" + }, + { + "name" : "iPhone 6", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6" + }, + { + "name" : "iPhone 6 Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus" + }, + { + "name" : "iPhone 6s", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s" + }, + { + "name" : "iPhone 6s Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus" + }, + { + "name" : "iPhone 7", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7" + }, + { + "name" : "iPhone 7 Plus", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus" + }, + { + "name" : "iPhone SE", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-SE" + }, + { + "name" : "iPhone2017-A", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8" + }, + { + "name" : "iPhone2017-B", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus" + }, + { + "name" : "iPhone2017-C", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-X" + }, + { + "name" : "iPad 2", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-2" + }, + { + "name" : "iPad Retina", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Retina" + }, + { + "name" : "iPad Air", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air" + }, + { + "name" : "iPad Air 2", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Air-2" + }, + { + "name" : "iPad (5th generation)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad--5th-generation-" + }, + { + "name" : "iPad Pro (9.7-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-" + }, + { + "name" : "iPad Pro (12.9-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro" + }, + { + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-" + }, + { + "name" : "iPad Pro (10.5-inch)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.iPad-Pro--10-5-inch-" + }, + { + "name" : "Apple TV", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p" + }, + { + "name" : "Apple TV 4K", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K" + }, + { + "name" : "Apple TV 4K (at 1080p)", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p" + }, + { + "name" : "Apple Watch - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm" + }, + { + "name" : "Apple Watch - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm" + }, + { + "name" : "Apple Watch Series 2 - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-38mm" + }, + { + "name" : "Apple Watch Series 2 - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm" + }, + { + "name" : "Watch2017 - 38mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-38mm" + }, + { + "name" : "Watch2017 - 42mm", + "identifier" : "com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-3-42mm" + } + ], + "runtimes" : [ + { + "buildversion" : "12B411", + "availability" : "(available)", + "name" : "iOS 8.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-1", + "version" : "8.1" + }, + { + "buildversion" : "12D508", + "availability" : "(available)", + "name" : "iOS 8.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-2", + "version" : "8.2" + }, + { + "buildversion" : "12F70", + "availability" : "(available)", + "name" : "iOS 8.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-3", + "version" : "8.3" + }, + { + "buildversion" : "12H141", + "availability" : "(available)", + "name" : "iOS 8.4", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-8-4", + "version" : "8.4" + }, + { + "buildversion" : "13A344", + "availability" : "(available)", + "name" : "iOS 9.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-0", + "version" : "9.0" + }, + { + "buildversion" : "13B143", + "availability" : "(available)", + "name" : "iOS 9.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-1", + "version" : "9.1" + }, + { + "buildversion" : "13C75", + "availability" : "(available)", + "name" : "iOS 9.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-2", + "version" : "9.2" + }, + { + "buildversion" : "13E233", + "availability" : "(available)", + "name" : "iOS 9.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-9-3", + "version" : "9.3" + }, + { + "buildversion" : "14A345", + "availability" : "(available)", + "name" : "iOS 10.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-0", + "version" : "10.0" + }, + { + "buildversion" : "14B72", + "availability" : "(available)", + "name" : "iOS 10.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-1", + "version" : "10.1" + }, + { + "buildversion" : "14C89", + "availability" : "(available)", + "name" : "iOS 10.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-2", + "version" : "10.2" + }, + { + "buildversion" : "14E8301", + "availability" : "(available)", + "name" : "iOS 10.3", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-10-3", + "version" : "10.3.1" + }, + { + "buildversion" : "15A372", + "availability" : "(available)", + "name" : "iOS 11.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.iOS-11-0", + "version" : "11.0" + }, + { + "buildversion" : "15J380", + "availability" : "(available)", + "name" : "tvOS 11.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.tvOS-11-0", + "version" : "11.0" + }, + { + "buildversion" : "13S343", + "availability" : "(available)", + "name" : "watchOS 2.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-0", + "version" : "2.0" + }, + { + "buildversion" : "13S661", + "availability" : "(available)", + "name" : "watchOS 2.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-1", + "version" : "2.1" + }, + { + "buildversion" : "13V144", + "availability" : "(available)", + "name" : "watchOS 2.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-2-2", + "version" : "2.2" + }, + { + "buildversion" : "14S471a", + "availability" : "(available)", + "name" : "watchOS 3.1", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-3-1", + "version" : "3.1" + }, + { + "buildversion" : "14V243", + "availability" : "(available)", + "name" : "watchOS 3.2", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-3-2", + "version" : "3.2" + }, + { + "buildversion" : "15R372", + "availability" : "(available)", + "name" : "watchOS 4.0", + "identifier" : "com.apple.CoreSimulator.SimRuntime.watchOS-4-0", + "version" : "4.0" + } + ], + "devices" : { + "iOS 8.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "602D7BFD-35E0-4E83-BEA7-6002BA0F4D5E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "5EB5F6ED-1345-47BD-A38E-666E4863240A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "E2693FD7-E671-4753-A438-038B83573D5E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "D42DA841-250C-4DAE-AC2D-5EEBED5E79ED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "85B1F870-73FA-4822-98EF-0F51C374A520" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "CF9F197F-8B2A-4788-8B31-B59008D33D8E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "DB28283A-D837-482F-AB90-91B3665470D0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "28A98C9B-610E-4082-824C-754DEC0348A5" + } + ], + "watchOS 2.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "EA660137-200A-49BD-8096-2771A75CD555" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "294502AF-6DD2-44AB-BD2D-2462237835A0" + } + ], + "watchOS 4.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "894DD68F-AF3E-49A5-AB14-151303208531" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "E2D564D4-C8EF-4D00-9127-AC104FB5E973" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "8A91C961-6862-4AE4-B721-91D07B22A0F5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "6395E605-1519-4E36-97AB-0EAEAD988DF9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "E55F590C-F3F2-4182-AA69-B17683EF9FA4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "DDF101D2-1393-49CC-8C32-98FAA0DD3527" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "B8E6757D-4FB0-4799-8443-1A3282F288F0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "12C94717-40CC-4DD2-890D-A0C92A827881" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 3 - 38mm", + "udid" : "DD65A7D5-02B8-4B31-A969-1F74E4699505" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 3 - 42mm", + "udid" : "985D823F-A66B-4D3C-9E67-42EF760DC32D" + } + ], + "watchOS 2.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "4EC5A8AF-49A7-4EBA-894F-55F2E9A99A8E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "77358FDB-A9EB-4D69-BE96-83C5635C1038" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "3A3230B9-9ADA-4FB3-AB00-FCA272FB483D" + } + ], + "iOS 8.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "AF2D5410-A49C-4791-ADBE-504F2CEA7C21" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "AD2BB11C-61B1-4547-914C-99E8EAE478C5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C5950B80-0986-4009-9A5F-46C70372BDB9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "B45DE89F-AA37-4C60-9117-89FD7B9846CD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A40401A7-AB0B-4336-A7CF-9C0CE4A8CDF9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "4C810BDE-7B4D-45FD-ACFE-4F61A0DE8C60" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "B88124DA-91C2-47BB-8FA0-768D446F8EA9" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "6C348D70-5BC3-4E1A-A42B-835DE7AB517D" + } + ], + "iOS 10.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "8EC1813C-82A2-408F-BB74-93F13BD8280F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "4A2E8159-3A59-4B48-B38D-8E6CEEFA44A7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "3BF8D87C-5583-4356-8639-51C00C81D925" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "BCB2B8F9-65F9-4AC1-B371-F98569B78EE6" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "FD7D58EF-59FC-4555-8202-59AE10F27860" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "asdf", + "udid" : "EB55D699-40BF-40AA-934B-AEADFE9CCF02" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "159B396D-D61D-4196-BD30-027AE27D2285" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "A5C83EA9-897C-4A16-A80D-E383E4B153CA" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "068C81B5-63C9-466B-BE58-D44C527736FF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "C5057256-5EB4-479F-B00C-9E9E6E6F10CD" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "392C0559-F808-4204-A9A9-C71F97715259" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "3347E41C-DB69-432A-9F87-C195FE3CE63B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "BA0BEF0A-168B-4054-BEF7-7878A1936578" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad (5th generation)", + "udid" : "E0E205B5-49BB-4CC2-B775-C0D4363DFE96" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "C3972EDD-9AD7-4A8D-A03B-EBF7EA904C3E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "3F50EE7B-5FA3-4550-B5B1-3ED93ADF5DD2" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "udid" : "9924F372-9CC9-4331-B348-6EA0B62170DE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (10.5-inch)", + "udid" : "A978600A-1BAD-45B4-840D-D9D00820E136" + } + ], + "iOS 8.4" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "4BB61B8A-8A90-4D86-8463-1FC06678FA30" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "EF5AE97B-122C-44E6-A432-1A4B1BCA20EB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "EFF4FA45-6C84-42BE-BE4E-A00946967EB4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "A621FD08-D9E1-461C-9179-F6A8273389BA" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A9FFE7BB-2903-4D82-A53F-2418512640A8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "E6E2D7FF-A5C4-4515-A27A-692D92C5A011" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "71759027-1AC1-4EFB-881E-51BD92C56D87" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "0DC73028-1ED5-4173-9BDC-03426B01D309" + } + ], + "iOS 10.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "1F17E923-8204-4E01-A533-6440F0594358" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "7DB88AAC-0257-4EA3-9561-CCF1938A5A0B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "D2928C8B-C70D-47B0-BE78-18B39556FE32" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "787D25C9-37F8-4A50-883E-46A9D3A8DE20" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "E4F2429C-2F8C-49FB-8E44-210AFB9FBA8A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "D99CA8B4-852E-48D5-A7C1-4446A52716EE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "63D926F7-1D0F-4BCD-8FDB-5E55C731673C" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "60DDBF0F-5D95-452B-9DEE-E9D58FAF2D77" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "5338FB07-5B7F-4703-B2A9-DF6225E41FF1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "0F804774-FD0C-4FB4-9ACF-246F869428EC" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "B9149367-BBE9-4E74-B2DD-8EB544DE04B3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "EBE3692C-D0F8-4E9F-BA1E-19F7B5827D57" + } + ], + "iOS 9.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "4AC3B95D-7F5C-456B-9F8D-6DB82B38278B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "196A0004-0619-496C-A1DB-CAAFEC8E16AC" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "FD19CDCE-6AB8-4956-B64C-5BC7669F4F72" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "62E48B91-6D2A-423A-9C9F-E90508AA9FCE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "883F4526-2800-4864-BB0B-D64CEAE2626A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "0369B028-09EA-40B0-A54E-73A4D88A6563" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "A4F669ED-81B9-48CA-BB0E-E967A2E85B61" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "81F12EAA-0F9E-46AF-82D6-46904280A759" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "0BD1F4FE-6FB9-4C91-A5A7-3D87DB5337CF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "A797F5DA-8F44-4A50-A806-B786294EAA81" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "94D87EF4-9BAB-453C-AAD0-54EC678410AF" + } + ], + "iOS 9.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "61459108-4C89-4A8A-AC16-B1306E52B9F1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "0C5C35E7-237A-470D-9B9E-9F3D9426BC15" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "CF17DD3F-FD3A-4824-90BD-3ACA2F25E981" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "A465611C-C7C1-4EEB-9214-E068BC20CA26" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "56E7D0C9-E7BE-49E9-BD22-033C87C966AD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "FF25A247-1811-47AF-A8B5-19354F2932FE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "712C1CD6-9929-4344-8A9E-EBBBB67DCD67" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "E069DD83-3821-4212-8141-E541FC2A0753" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "733EE770-4BF7-4191-B9E9-E683CE64AE99" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "339D86EB-CC09-4DAB-A37B-7BFA3EB3CC51" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "8345F0DE-245D-4120-9895-C89FF907E3AE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "2527D580-0311-4CFD-9640-CC4E42FA3038" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-2" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D6FAFAE6-E4DF-41D1-A553-5FDF7FC7BDEF" + } + ], + "iOS 10.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "EC865657-ED69-425C-9E10-90BA935A5176" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "DC5D470D-D31C-44E4-B16C-10676862C5F5" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "6C00D239-9CF0-495F-A1C6-72FEDCE410BD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "A1835E96-FE4A-49AA-BB74-D9216AD0E857" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "31B472C4-C5CF-4CA7-A6C9-8857E5F90525" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "808B033A-6E1F-4AB9-A450-E00ADB975C6C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "55E5B6C4-3610-45F0-A47B-49138BB6661C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "62DA6248-7F72-456F-853A-EBC05554840C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "357B5BD2-A691-49A0-B217-3D99AB0C9181" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "EF42ADDA-FC5C-4FF9-B677-783035233F0F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "CEC0C409-FA88-46DD-A102-F60D9FCE20E4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "681C11CE-8A05-4CD3-9768-75609550275F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7-inch)", + "udid" : "D468A10E-D13A-418C-AC23-222158CD5A2A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch)", + "udid" : "BB1F78A3-8459-41C6-B7C1-2EF4531074C5" + } + ], + "tvOS 11.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 1080p", + "udid" : "96387811-0A88-4BCB-BA78-328109EA4F8F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 4K", + "udid" : "420D484F-4487-4FD3-AC3C-62476C823CA7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple TV 4K (at 1080p)", + "udid" : "9CC2EFB1-1BF2-4B2C-B36E-79DD46049A79" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-1" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "69AF1B4F-B6A5-41F2-A2E4-896F7C40FA97" + } + ], + "iOS 9.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "86A9575C-F90D-476C-AEEF-322832FF2685" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "202DBB9D-A5DD-4C09-96DC-693F659A3680" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C7595416-5472-42C2-BDB3-5D9EB9BE8FED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "91A3ED67-AD7B-48F6-8D1A-48EDB1AEA4A2" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "590FAFCF-CCAE-4495-B58C-FBF6731996B0" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "74DC131E-C062-453F-844B-4A6EB5DD1F89" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "72575A2F-F57E-4646-9453-624D42445D2E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "D7E92ACD-AB7F-4FDC-BA79-A73DA2A16035" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "2C1A14EA-EBB1-49A2-ABC5-773673258C6F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7CCB9AF9-42A8-47D3-A0C1-F07625162DBB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "83C6CAD4-6966-4CAD-AF4E-5DDC6A075969" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "99E89AF7-B82D-44ED-B093-76F80193A6D4" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-10-0" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D57C6B4C-E855-4566-AC78-947E6DA8026E" + } + ], + "com.apple.CoreSimulator.SimRuntime.tvOS-9-2" : [ + { + "state" : "Shutdown", + "availability" : " (unavailable, runtime profile not found)", + "name" : "Apple TV 1080p", + "udid" : "D81E4502-0BE4-4738-88D7-11E466BCB529" + } + ], + "iOS 11.0" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "18E43F32-5E3C-4017-AD30-643D9B1B1170" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "98DB2248-F444-4062-AF65-3B177BAADB2B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "B207E003-7A63-4159-A730-E4C591CA63DB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "EC223176-FCBC-4C16-BC6F-E519DC2C305C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "C1E83595-4222-43E7-9A6F-5F3A3D3A5E3C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "foo", + "udid" : "EBF60C97-C4EE-43BF-BC70-896080BFF7C8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "428DC5AD-5539-4896-A7CC-9900CD53248A" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "F645F686-D0FE-48E9-82FF-7E486FA49986" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "4CBA12D8-B011-4FA7-A56C-8FC177861997" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 8", + "udid" : "DF7989D2-12CF-48C9-921E-9E5F2A446CCD" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 8 Plus", + "udid" : "47F4B1D4-9610-4520-A6B1-F155557A89EB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone X", + "udid" : "B184EA2B-0B67-4343-9091-C916B94F038E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "79EC4979-E862-409B-8606-7227219B3F91" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "EC10C053-0894-46A9-9494-A98F666A3890" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad (5th generation)", + "udid" : "55C9796D-850B-4FEA-821C-754E2F687D51" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7 inch)", + "udid" : "22FB5213-E4C1-4023-916B-05F751E5FEF8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9 inch)", + "udid" : "20F90912-5BD3-4FD7-A390-89AF18C4472B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch) (2nd generation)", + "udid" : "9AFA069C-1337-4C85-9892-4F89A8B0DA34" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (10.5-inch)", + "udid" : "5E5076B1-7C61-415A-A330-34FC971DD308" + } + ], + "iOS 8.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "15EF0847-F4EC-4026-B1BF-B24639BF06A3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "C9C8EB05-E129-4ED2-BE6A-D1A324C6B307" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "389F62E9-72BA-478F-9028-D23C0119D3F4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "69E72023-FE03-4651-A912-17FD77051A13" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "7A7C4FDB-7B23-40C2-B85B-0C22C3225EA4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "7CAD91FC-7851-469D-9B2E-537D5E805E1B" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "BEB7A278-0288-48EA-A192-2B85258DD05D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "6025AD0E-7347-4113-ABE3-7DA5B3C2FCC9" + } + ], + "iOS 9.3" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 4s", + "udid" : "C65BF923-9D7F-4809-9DE5-8F57D9E2B499" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "B46677BC-5D56-4F0F-A7C9-391FC741FDD3" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "3D7A6CA5-E8A3-4CCF-911C-32FEDB651ADB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "9B32555B-3FD5-4B90-81ED-C796782921F1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "1C20388A-F192-466A-B43A-AA5EF50E49BB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "3072B555-6E30-48C9-8CA2-97645EC17FFE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "BCF6A918-B520-4F09-8602-FDDD78E39D13" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad 2", + "udid" : "25D8C01D-9584-435B-B762-DA1839486BA8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Retina", + "udid" : "6B035ED4-56A8-4B1D-96A9-F342F15765F8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7CB98A40-8061-486C-99E7-36AC5B97F363" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "4CF5981A-1C94-4925-85C5-70AF1F8B2E07" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro", + "udid" : "5577EC0A-0BAE-44FF-8B2A-92613E04430C" + } + ], + "watchOS 2.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "8EEA5302-BF03-4B21-BFA9-54876468FF7D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "4AAC051C-821E-4688-BF96-E7A480B83EBE" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "6C6CA684-7F33-4242-B970-4B9F14ACE9ED" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "4724C566-9A17-4C45-A0C1-EA728DFD1086" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "2CB10B36-3D2D-4324-80EF-8FE7DD045984" + } + ], + "iOS 10.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5", + "udid" : "27E6DA8D-E9A4-4200-9BCD-57553780D323" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 5s", + "udid" : "C1993314-1546-45F6-B8EF-164295B293FF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6", + "udid" : "2802C22F-7C35-4BFC-A87B-A58F4FFDC966" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6 Plus", + "udid" : "B0BD38E7-B2BB-4845-93B1-631CA299788D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s", + "udid" : "2373B6FA-3212-48A1-9CA4-AB827D67F966" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 6s Plus", + "udid" : "601BFAE5-B77A-48B2-8CAF-6268D75B1ADB" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7", + "udid" : "3EA8DF8C-9196-43B2-BCF4-09FB2DFC0E28" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPhone SE", + "udid" : "B7D6D8FE-DC3D-44F6-93C1-527B52AFFBC3" + }, + { + "state" : "Shutdown", + "availability" : " (unavailable, device type not supported by runtime)", + "name" : "iPad Retina", + "udid" : "366FBEED-A353-4566-BC7A-1EC951E95D0F" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air", + "udid" : "7EE6E1AA-DD65-4264-B7F2-3008FED2DA7E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Air 2", + "udid" : "47CB3EB9-882A-46AD-AD17-1A5074F5D2B1" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (9.7-inch)", + "udid" : "10D41027-3CAA-406E-AA8C-258670F125AF" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "iPad Pro (12.9-inch)", + "udid" : "E6B6A797-6F01-4FEB-A471-D9C3920AA01C" + } + ], + "watchOS 3.2" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "1BF0C27A-029F-4E65-8158-E82953BBF687" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "2AF2AB04-4C4E-4699-A980-492C6342DFF4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "ECFB70F1-132D-47C6-A6CD-2B54A15316F7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "169E93D8-78A1-4C32-A2D3-E6848B6930B7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "6DDC9D8B-EFA3-4DE7-A1D2-A73E2EDD1385" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "C2C0366D-1E3E-4BBC-9343-E724FA6D581E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "693A7800-C04D-4358-8BE2-F418C3DB3BF0" + } + ], + "watchOS 3.1" : [ + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "C841D536-25FD-429E-823A-1F1C8D10B40C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 38mm", + "udid" : "22CE8BD7-5B38-41AF-975A-CEFB4F7AFEC7" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "bar", + "udid" : "0D4596D9-6AF8-4991-B5C0-2CE8CBE8AB88" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "C06F85C1-277B-473F-AC01-896985CD8C54" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch - 42mm", + "udid" : "B5A0DFBB-3518-4E92-8255-7A982DE8C0D8" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "3F5B4265-9CFF-471C-9337-FDB583D4E13C" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "39FCCD77-7FFA-4566-A7E9-C3E09EEB1173" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "879F7D42-DE97-4DD3-9F08-75723A8B14E4" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "41642CA8-A26D-4A0F-98D9-48B69E9E932D" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "1BA5D988-F8FD-43C8-B441-CBDEA19A105E" + }, + { + "state" : "Shutdown", + "availability" : "(available)", + "name" : "Apple Watch Series 2 - 42mm [Titanium]", + "udid" : "F298DFB0-0ACB-48E1-AED0-6E1CB05EF9CB" + } + ] + }, + "pairs" : { + "CA0C766D-EBEE-4F7D-84A9-9B443A32ADE5" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "1BA5D988-F8FD-43C8-B441-CBDEA19A105E", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96", + "state" : "Shutdown" + }, + "state" : "(inactive, disconnected)" + }, + "0C48C036-4CB3-4EE4-8EAC-24C5C5678DA5" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "C2C0366D-1E3E-4BBC-9343-E724FA6D581E", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "A5C83EA9-897C-4A16-A80D-E383E4B153CA", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "D90F7B93-409D-43E7-93E8-E58B1E60AF6C" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "8EEA5302-BF03-4B21-BFA9-54876468FF7D", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "3072B555-6E30-48C9-8CA2-97645EC17FFE", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "3A66DB1E-F4F8-45C6-8478-12DFF45E1FCB" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm [Titanium]", + "udid" : "F298DFB0-0ACB-48E1-AED0-6E1CB05EF9CB", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "7A165B3B-9706-40C0-A4CE-5C13287B1A96", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "87981DB0-3CBD-4A21-96CA-79548CC69AF9" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "DDF101D2-1393-49CC-8C32-98FAA0DD3527", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "C1E83595-4222-43E7-9A6F-5F3A3D3A5E3C", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "79B46C59-F6B7-4841-AE52-DBD90264A181" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "693A7800-C04D-4358-8BE2-F418C3DB3BF0", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "068C81B5-63C9-466B-BE58-D44C527736FF", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "099446B1-948E-4C08-A9F2-EEFF29D6B92B" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "879F7D42-DE97-4DD3-9F08-75723A8B14E4", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "3EA8DF8C-9196-43B2-BCF4-09FB2DFC0E28", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "F652E50B-5B44-4CBC-83E3-1780977E1993" : { + "watch" : { + "name" : "Apple Watch Series 3 - 42mm", + "udid" : "985D823F-A66B-4D3C-9E67-42EF760DC32D", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 8 Plus", + "udid" : "47F4B1D4-9610-4520-A6B1-F155557A89EB", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "0C30FE01-678C-4D75-A0C4-62B541D4A486" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "894DD68F-AF3E-49A5-AB14-151303208531", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "EC223176-FCBC-4C16-BC6F-E519DC2C305C", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "9D136B73-1BDF-4C78-B0DB-E7C425EFDC37" : { + "watch" : { + "name" : "Apple Watch Series 2 - 38mm", + "udid" : "B8E6757D-4FB0-4799-8443-1A3282F288F0", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7", + "udid" : "428DC5AD-5539-4896-A7CC-9900CD53248A", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "BE42E223-3DAF-4186-8315-B0697CDA463B" : { + "watch" : { + "name" : "Apple Watch Series 3 - 38mm", + "udid" : "DD65A7D5-02B8-4B31-A969-1F74E4699505", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 8", + "udid" : "DF7989D2-12CF-48C9-921E-9E5F2A446CCD", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "8ACDD025-872A-4FCE-9414-61FF15986991" : { + "watch" : { + "name" : "Apple Watch - 38mm", + "udid" : "1BF0C27A-029F-4E65-8158-E82953BBF687", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s", + "udid" : "FD7D58EF-59FC-4555-8202-59AE10F27860", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "B826FADC-8607-419E-B5B4-05506F65B5D7" : { + "watch" : { + "name" : "bar", + "udid" : "6395E605-1519-4E36-97AB-0EAEAD988DF9", + "state" : "Shutdown" + }, + "phone" : { + "name" : "foo", + "udid" : "EBF60C97-C4EE-43BF-BC70-896080BFF7C8", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "A1EEF25B-1958-4CC7-8A6C-7A0B0AB837DE" : { + "watch" : { + "name" : "Apple Watch Series 2 - 42mm", + "udid" : "12C94717-40CC-4DD2-890D-A0C92A827881", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 7 Plus", + "udid" : "F645F686-D0FE-48E9-82FF-7E486FA49986", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "4E64AD6A-CB5A-4388-A3F6-3788016902AC" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "6DDC9D8B-EFA3-4DE7-A1D2-A73E2EDD1385", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "159B396D-D61D-4196-BD30-027AE27D2285", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + }, + "A87F0119-B2EC-4800-8A09-1ADDC9C2E863" : { + "watch" : { + "name" : "Apple Watch - 42mm", + "udid" : "2CB10B36-3D2D-4324-80EF-8FE7DD045984", + "state" : "Shutdown" + }, + "phone" : { + "name" : "iPhone 6s Plus", + "udid" : "BCF6A918-B520-4F09-8602-FDDD78E39D13", + "state" : "Shutdown" + }, + "state" : "(active, disconnected)" + } + } +}' diff --git a/test/fixtures/Xcode9.app/Contents/Developer/usr/bin/xcodebuild b/test/fixtures/Xcode9.app/Contents/Developer/usr/bin/xcodebuild new file mode 100755 index 0000000..76bc49c --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/Developer/usr/bin/xcodebuild @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "hi from xcodebuild" diff --git a/test/fixtures/Xcode9.app/Contents/version.plist b/test/fixtures/Xcode9.app/Contents/version.plist new file mode 100644 index 0000000..aebbf11 --- /dev/null +++ b/test/fixtures/Xcode9.app/Contents/version.plist @@ -0,0 +1,20 @@ + + + + + BuildAliasOf + IDEFrameworks + BuildVersion + 26 + CFBundleShortVersionString + 9.0 + CFBundleVersion + 13247 + ProductBuildVersion + 9A235 + ProjectName + IDEFrameworks + SourceVersion + 13247000000000000 + + diff --git a/test/init.js b/test/init.js deleted file mode 100644 index a6d8397..0000000 --- a/test/init.js +++ /dev/null @@ -1,9 +0,0 @@ -global.should = null; -global.should = require('should'); - -var util = require('util'); -global.dump = function () { - for (var i = 0; i < arguments.length; i++) { - console.error(util.inspect(arguments[i], false, null, true)); - } -}; \ No newline at end of file diff --git a/test/test-certs.js b/test/test-certs.js index 46e76d9..b03f8d7 100644 --- a/test/test-certs.js +++ b/test/test-certs.js @@ -1,129 +1,18 @@ -/** - * Tests ioslib's certs module. - * - * @copyright - * Copyright (c) 2014 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const ioslib = require('..'); - -describe('certs', function () { - it('namespace should be an object', function () { - should(ioslib.certs).be.an.Object; - }); - - it('detect certs', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.certs.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('certs', 'issues'); - - should(results.certs).have.keys('keychains', 'wwdr'); - should(results.certs.keychains).be.an.Object; - should(results.certs.wwdr).be.a.Boolean; - - Object.keys(results.certs.keychains).forEach(function (keychain) { - should(results.certs.keychains[keychain]).be.an.Object; - should(results.certs.keychains[keychain]).have.keys('developer', 'distribution'); - should(results.certs.keychains[keychain].developer).be.an.Array; - results.certs.keychains[keychain].developer.forEach(function (d) { - should(d).be.an.Object; - should(d).have.keys('name', 'fullname', 'pem', 'before', 'after', 'expired', 'invalid'); - should(d.name).be.a.String; - should(d.pem).be.a.String; - should(d.before).be.a.Date; - should(d.after).be.a.Date; - should(d.expired).be.a.Boolean; - should(d.invalid).be.a.Boolean; - }); - should(results.certs.keychains[keychain].distribution).be.an.Array; - results.certs.keychains[keychain].distribution.forEach(function (d) { - should(d).be.an.Object; - should(d).have.keys('name', 'fullname', 'pem', 'before', 'after', 'expired', 'invalid'); - should(d.name).be.a.String; - should(d.pem).be.a.String; - should(d.before).be.a.Date; - should(d.after).be.a.Date; - should(d.expired).be.a.Boolean; - should(d.invalid).be.a.Boolean; - }); - }); - - should(results.issues).be.an.Array; - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.keys('id', 'type', 'message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - done(); - }); - }); - - it('return a emitter', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.certs.detect({ bypassCache: true }).on('detected', function (results) { - should(results).be.an.Object; - done(); - }); - }); - - it('return results from cache', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.certs.detect({ bypassCache: false }).on('detected', function (results) { - should(results).be.an.Object; - done(); - }); - }); - - it('watch for changes for 10 seconds', function (done) { - this.timeout(50000); - this.slow(50000); - - ioslib.certs.watch({ watchInterval: 1000 }, function (err, results) { - should(results).be.an.Object; - }); - - setTimeout(function () { - ioslib.certs.unwatch(); - done(); - }, 10000); - }); - - it('stop watching for updates', function (done) { - this.timeout(50000); - this.slow(50000); - - var counter = 0, - unwatch = ioslib.certs.watch({ watchInterval: 4000 }, function (err, results) { - should(results).be.an.Object; - if (++counter > 1) { - done(new Error('Watcher event was fired despite unwatching')); - } - }); - - setTimeout(function () { - unwatch(); - setTimeout(function () { - done(); - }, 6000); - }, 2000); +import * as ioslib from '../dist/index'; + +describe('Certificates', () => { + it('should get all development and distribution certs', async () => { + const certs = await ioslib.certs.getCerts(true); + + expect(certs).to.be.an('object'); + expect(certs).to.have.keys('developer', 'distribution', 'wwdr'); + + for (const cert of certs.developer) { + expect(cert).to.be.an('object'); + expect(cert).to.have.keys('name', 'fullname', 'cert', 'hash', 'before', 'after', 'expired', 'invalid', 'keychain', 'teamId'); + expect(cert.fullname).to.contain(cert.name); + expect(cert.before).to.be.an.instanceof(Date); + expect(cert.after).to.be.an.instanceof(Date); + } }); -}); \ No newline at end of file +}); diff --git a/test/test-device.js b/test/test-device.js deleted file mode 100644 index 3de6c25..0000000 --- a/test/test-device.js +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Tests ioslib's device module. - * - * @copyright - * Copyright (c) 2014 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - appc = require('node-appc'), - exec = require('child_process').exec, - fs = require('fs'), - ioslib = require('..'), - path = require('path'); - -function build(app, provisioningProfileUUID, certName, defs, done){ - if (typeof defs === 'function') { - done = defs; - defs = []; - } - - ioslib.xcode.detect(function (err, env) { - if (err) { - return done(err); - } - - if (env.selectedXcode === null) { - return done(new Error(__('No selected Xcode'))); - } - - var cmd = [ - env.selectedXcode.executables.xcodebuild, - 'clean', 'build', - '-configuration', 'Debug', - '-sdk', 'iphoneos' + appc.version.format(env.selectedXcode.sdks[0], 2, 2), - 'PROVISIONING_PROFILE=' + provisioningProfileUUID, - 'DEPLOYMENT_POSTPROCESSING=YES', - // 'CODE_SIGN_IDENTITY="' + certName + '"', - 'GCC_PREPROCESSOR_DEFINITIONS="' + defs.join(' ') + '"' - ].join(' '); - - exec(cmd, { - cwd: path.join(__dirname, app) - }, function (code, out, err) { - should(out).match(/BUILD SUCCEEDED/); - var appPath = path.join(__dirname, app, 'build', 'Debug-iphoneos', app + '.app'); - should(fs.existsSync(appPath)).be.true; - done(null, appPath); - }); - }); -} - -describe('device', function () { - it('namespace should be an object', function () { - should(ioslib.device).be.an.Object; - }); - - it('detect iOS devices', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.device.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('devices', 'issues'); - - should(results.devices).be.an.Array; - results.devices.forEach(function (dev) { - should(dev).be.an.Object; - should(dev).have.keys('udid', 'name', 'buildVersion', 'cpuArchitecture', 'deviceClass', 'deviceColor', - 'hardwareModel', 'modelNumber', 'productType', 'productVersion', 'serialNumber'); - - should(dev.udid).be.a.String; - should(dev.udid).not.equal(''); - - should(dev.name).be.a.String; - should(dev.name).not.equal(''); - - should(dev.buildVersion).be.a.String; - should(dev.buildVersion).not.equal(''); - - should(dev.cpuArchitecture).be.a.String; - should(dev.cpuArchitecture).not.equal(''); - - should(dev.deviceClass).be.a.String; - should(dev.deviceClass).not.equal(''); - - should(dev.deviceColor).be.a.String; - should(dev.deviceColor).not.equal(''); - - should(dev.hardwareModel).be.a.String; - should(dev.hardwareModel).not.equal(''); - - should(dev.modelNumber).be.a.String; - should(dev.modelNumber).not.equal(''); - - should(dev.productType).be.a.String; - should(dev.productType).not.equal(''); - - should(dev.productVersion).be.a.String; - should(dev.productVersion).not.equal(''); - - should(dev.serialNumber).be.a.String; - should(dev.serialNumber).not.equal(''); - }); - - should(results.issues).be.an.Array; - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.keys('id', 'type', 'message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - done(); - }); - }); - - (process.env.CI ? it.skip : it)('should fail to install app bad app path', function (done) { - this.timeout(30000); - this.slow(30000); - - ioslib.device - .install(null, '/path/to/something/that/does/not/exist', 'foo', function (err) { - done(new Error('Callback was called unexpectedly')); - }) - .on('error', function (err) { - should(err).be.an.instanceOf(Error); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('should be able to install app to device', function (done) { - this.timeout(60000); - this.slow(60000); - - var appId = 'com.appcelerator.testapp3'; - - // find us a device - ioslib.findValidDeviceCertProfileCombos({ - appId: appId, - unmanagedProvisioningProfile: true - }, function (err, results) { - function noop() {} - - if (err) { - return done(err); - } - - if (!results.length) { - return done(new Error('No valid device/cert/provisioning profile combos found')); - } - - build('TestApp', results[0].ppUUID, results[0].certName, ['TEST_BASIC_LOGGING'], function (err, appPath) { - should(err).not.be.ok; - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; - - ioslib.device - .install(results[0].deviceUDID, appPath, appId) - .on('installed', function () { - done(); - }) - .on('error', function (err) { - done(err); - }); - }); - }); - }); -}); diff --git a/test/test-devices.js b/test/test-devices.js new file mode 100644 index 0000000..981638c --- /dev/null +++ b/test/test-devices.js @@ -0,0 +1,25 @@ +import * as ioslib from '../dist/index'; + +describe('Devices', () => { + it('should get all devices', () => { + const devices = ioslib.devices.list(); + expect(devices).to.be.an('array'); + for (const device of devices) { + expect(device).to.be.an('object'); + } + }); + + it('should return a handle when tracking devices', function (done) { + this.slow(3000); + this.timeout(4000); + + const handle = ioslib.devices.watch(); + + handle.on('devices', () => {}); + + setTimeout(() => { + handle.stop(); + done(); + }, 500); + }); +}); diff --git a/test/test-env.js b/test/test-env.js deleted file mode 100644 index be19295..0000000 --- a/test/test-env.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Tests ioslib's env module. - * - * @copyright - * Copyright (c) 2014 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -var fs = require('fs'), - ioslib = require('..'); - -describe('env', function () { - it('namespace should be an object', function () { - should(ioslib.env).be.an.Object; - }); - - it('detect should find dev environment dependencies', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.env.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('executables', 'issues'); - - should(results.executables).be.an.Object; - should(results.executables).have.keys('security', 'xcodeSelect'); - - if (results.executables.security !== null) { - should(results.executables.security).be.a.String; - should(fs.existsSync(results.executables.security)).be.ok; - } - - if (results.executables.xcodeSelect !== null) { - should(results.executables.xcodeSelect).be.a.String; - should(fs.existsSync(results.executables.xcodeSelect)).be.ok; - } - - should(results.issues).be.an.Array; - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.keys('id', 'type', 'message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - done(); - }); - }); -}); \ No newline at end of file diff --git a/test/test-ioslib.js b/test/test-ioslib.js deleted file mode 100644 index 135de4d..0000000 --- a/test/test-ioslib.js +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Tests ioslib main detect function. - * - * @copyright - * Copyright (c) 2014 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -var ioslib = require('..'), - fs = require('fs'); - -describe('ioslib', function () { - it('namespace should be an object', function () { - should(ioslib).be.an.Object; - should(ioslib.detect).be.a.Function; - }); - - it('detect all iOS information', function (done) { - this.timeout(60000); - this.slow(30000); - - ioslib.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('detectVersion', 'issues', 'devices', 'provisioning', 'executables', 'selectedXcode', - 'xcode', 'certs', 'teams', 'simulators'); - - should(results.detectVersion).be.a.String; - - should(results.issues).be.an.Array; - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.property('id'); - should(issue).have.property('type'); - should(issue).have.property('message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - should(results.devices).be.an.Array; - results.devices.forEach(function (dev) { - should(dev).be.an.Object; - should(dev).have.keys('udid', 'name', 'buildVersion', 'cpuArchitecture', 'deviceClass', 'deviceColor', - 'hardwareModel', 'modelNumber', 'productType', 'productVersion', 'serialNumber'); - - should(dev.udid).be.a.String; - should(dev.udid).not.equal(''); - - should(dev.name).be.a.String; - should(dev.name).not.equal(''); - - should(dev.buildVersion).be.a.String; - should(dev.buildVersion).not.equal(''); - - should(dev.cpuArchitecture).be.a.String; - should(dev.cpuArchitecture).not.equal(''); - - should(dev.deviceClass).be.a.String; - should(dev.deviceClass).not.equal(''); - - should(dev.deviceColor).be.a.String; - should(dev.deviceColor).not.equal(''); - - should(dev.hardwareModel).be.a.String; - should(dev.hardwareModel).not.equal(''); - - should(dev.modelNumber).be.a.String; - should(dev.modelNumber).not.equal(''); - - should(dev.productType).be.a.String; - should(dev.productType).not.equal(''); - - should(dev.productVersion).be.a.String; - should(dev.productVersion).not.equal(''); - - should(dev.serialNumber).be.a.String; - should(dev.serialNumber).not.equal(''); - }); - - should(results.provisioning).be.an.Object; - should(results.provisioning).have.keys('profileDir', 'development', 'distribution', 'adhoc'); - - should(results.provisioning.profileDir).be.a.String; - should(results.provisioning.profileDir).not.equal(''); - - function checkProfiles(list) { - list.forEach(function (pp) { - should(pp).be.an.Object; - should(pp).have.keys('file', 'uuid', 'name', 'appPrefix', 'creationDate', 'expirationDate', 'expired', 'certs', 'devices', 'team', 'appId', 'getTaskAllow', 'apsEnvironment'); - - should(pp.file).be.a.String; - should(pp.file).not.equal(''); - - should(pp.uuid).be.a.String; - should(pp.uuid).not.equal(''); - - should(pp.name).be.a.String; - should(pp.name).not.equal(''); - - should(pp.appPrefix).be.a.String; - should(pp.appPrefix).not.equal(''); - - should(pp.creationDate).be.a.Date; - should(pp.expirationDate).be.a.Date; - - should(pp.expired).be.a.Boolean; - - should(pp.certs).be.an.Array; - pp.certs.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); - - if (pp.devices !== null) { - should(pp.devices).be.an.Array; - pp.devices.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); - } - - should(pp.team).be.an.Array; - pp.team.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); - - should(pp.appId).be.a.String; - should(pp.appId).not.equal(''); - - should(pp.getTaskAllow).be.a.Boolean; - - should(pp.apsEnvironment).be.a.String; - }); - } - - should(results.provisioning.development).be.an.Array; - checkProfiles(results.provisioning.development); - - should(results.provisioning.distribution).be.an.Array; - checkProfiles(results.provisioning.distribution); - - should(results.provisioning.adhoc).be.an.Array; - checkProfiles(results.provisioning.adhoc); - - should(results.executables).be.an.Object; - should(results.executables).have.keys('xcodeSelect', 'security'); - - should(results.executables.xcodeSelect).be.a.String; - should(results.executables.xcodeSelect).not.equal(''); - - should(results.executables.security).be.a.String; - should(results.executables.security).not.equal(''); - - function checkXcode(xcode) { - should(xcode).be.an.Object; - should(xcode).have.keys('xcodeapp', 'path', 'selected', 'version', 'build', 'supported', 'eulaAccepted', 'sdks', 'sims', 'simDeviceTypes', 'simRuntimes', 'watchos', 'tvos', 'teams', 'executables'); - - should(xcode.xcodeapp).be.a.String; - should(xcode.xcodeapp).not.equal(''); - should(fs.existsSync(xcode.xcodeapp)).be.true; - should(fs.statSync(xcode.xcodeapp).isDirectory()).be.true; - - should(xcode.path).be.a.String; - should(xcode.path).not.equal(''); - should(fs.existsSync(xcode.path)).be.true; - should(fs.statSync(xcode.path).isDirectory()).be.true; - - should(xcode.selected).be.a.Boolean; - - should(xcode.version).be.a.String; - should(xcode.version).not.equal(''); - - should(xcode.build).be.a.String; - should(xcode.build).not.equal(''); - - should([null, true, false, 'maybe']).containEql(xcode.supported); - - should(xcode.sdks).be.an.Array; - xcode.sdks.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); - - should(xcode.sims).be.an.Array; - xcode.sims.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); - - var keys = ['xcodebuild', 'clang', 'clang_xx', 'libtool', 'lipo', 'otool', 'pngcrush', 'simulator', 'watchsimulator', 'simctl']; - should(xcode.executables).be.an.Object; - keys.forEach(function (key) { - should(xcode.executables).have.property(key); - if (xcode.executables[key] !== null) { - should(xcode.executables[key]).be.a.String; - should(xcode.executables[key]).not.equal(''); - should(fs.existsSync(xcode.executables[key])).be.true; - should(fs.statSync(xcode.executables[key]).isDirectory()).be.false; - } - }); - } - - should(results.selectedXcode).be.an.Object; - checkXcode(results.selectedXcode); - - should(results.xcode).be.an.Object; - Object.keys(results.xcode).forEach(function (ver) { - checkXcode(results.xcode[ver]); - }); - - should(results.certs).have.keys('keychains', 'wwdr'); - should(results.certs.keychains).be.an.Object; - should(results.certs.wwdr).be.a.Boolean; - - Object.keys(results.certs.keychains).forEach(function (keychain) { - should(results.certs.keychains[keychain]).be.an.Object; - should(results.certs.keychains[keychain]).have.keys('developer', 'distribution'); - should(results.certs.keychains[keychain].developer).be.an.Array; - results.certs.keychains[keychain].developer.forEach(function (d) { - should(d).be.an.Object; - should(d).have.keys('name', 'fullname', 'pem', 'before', 'after', 'expired', 'invalid'); - should(d.name).be.a.String; - should(d.pem).be.a.String; - should(d.before).be.a.Date; - should(d.after).be.a.Date; - should(d.expired).be.a.Boolean; - should(d.invalid).be.a.Boolean; - }); - should(results.certs.keychains[keychain].distribution).be.an.Array; - results.certs.keychains[keychain].distribution.forEach(function (d) { - should(d).be.an.Object; - should(d).have.keys('name', 'fullname', 'pem', 'before', 'after', 'expired', 'invalid'); - should(d.name).be.a.String; - should(d.pem).be.a.String; - should(d.before).be.a.Date; - should(d.after).be.a.Date; - should(d.expired).be.a.Boolean; - should(d.invalid).be.a.Boolean; - }); - }); - - done(); - }); - }); - - (process.env.CI ? it.skip : it)('should find a device/cert/profile combination', function (done) { - this.timeout(10000); - this.slow(10000); - - ioslib.findValidDeviceCertProfileCombos({ - appId: 'com.appcelerator.TestApp' - }, function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Array; - results.forEach(function (combo) { - should(combo).be.an.Object; - should(combo).have.keys('ppUUID', 'certName', 'deviceUDID'); - - should(combo.ppUUID).be.a.String; - should(combo.ppUUID).not.equal(''); - - should(combo.certName).be.a.String; - should(combo.certName).not.equal(''); - - should(combo.deviceUDID).be.a.String; - should(combo.deviceUDID).not.equal(''); - }); - - done(); - }); - }); -}); diff --git a/test/test-keychains.js b/test/test-keychains.js new file mode 100644 index 0000000..ef7a171 --- /dev/null +++ b/test/test-keychains.js @@ -0,0 +1,13 @@ +import * as ioslib from '../dist/index'; + +describe('Keychains', () => { + it('should get all keychains', async () => { + const keychains = await ioslib.keychains.getKeychains(true); + expect(keychains).to.be.an('array'); + + for (const keychain of keychains) { + expect(keychain).to.be.an('object'); + expect(keychain).to.have.keys('name', 'path'); + } + }); +}); diff --git a/test/test-provisioning.js b/test/test-provisioning.js index 1754635..b0961ea 100644 --- a/test/test-provisioning.js +++ b/test/test-provisioning.js @@ -1,308 +1,185 @@ -/** - * Tests ioslib's provisioning module. - * - * @copyright - * Copyright (c) 2014 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ +import path from 'path'; -const ioslib = require('..'); +import { isFile } from 'appcd-fs'; -function checkProfiles(list) { - list.forEach(function (pp) { - should(pp).be.an.Object; - should(pp).have.keys('file', 'uuid', 'name', 'appPrefix', 'creationDate', 'expirationDate', 'expired', 'certs', 'devices', 'team', 'appId', 'getTaskAllow', 'apsEnvironment'); +import * as ioslib from '../dist/index'; - should(pp.file).be.a.String; - should(pp.file).not.equal(''); - - should(pp.uuid).be.a.String; - should(pp.uuid).not.equal(''); - - should(pp.name).be.a.String; - should(pp.name).not.equal(''); - - should(pp.appPrefix).be.a.String; - should(pp.appPrefix).not.equal(''); - - should(pp.creationDate).be.a.Date; - should(pp.expirationDate).be.a.Date; - - should(pp.expired).be.a.Boolean; - - should(pp.certs).be.an.Array; - pp.certs.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); - - if (pp.devices !== null) { - should(pp.devices).be.an.Array; - pp.devices.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); +describe('Provisioning Profiles', () => { + it('should find provisioning profile files in default path', async () => { + let files; + try { + files = await ioslib.provisioning.findProvisioningProfileFiles(); + } catch (e) { + if (e.message.startsWith('Provisioning profile directory does not exist:')) { + return; + } } - should(pp.team).be.an.Array; - pp.team.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); + expect(files).to.be.an('array'); - should(pp.appId).be.a.String; - should(pp.appId).not.equal(''); - - should(pp.getTaskAllow).be.a.Boolean; - - should(pp.apsEnvironment).be.a.String; - }); -} - -describe('provisioning', function () { - it('namespace should be an object', function () { - should(ioslib.provisioning).be.an.Object; + for (const file of files) { + expect(isFile(file)).to.be.true; + } }); - it('detect provisioning profiles', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.provisioning.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('provisioning', 'issues'); - - should(results.provisioning).be.an.Object; - should(results.provisioning).have.keys('profileDir', 'development', 'distribution', 'adhoc'); - - should(results.provisioning.profileDir).be.a.String; - should(results.provisioning.profileDir).not.equal(''); - - should(results.provisioning.development).be.an.Array; - checkProfiles(results.provisioning.development); + it('should find provisioning profiles in custom path', async () => { + const dir = path.join(__dirname, 'fixtures', 'Provisioning Profiles'); + const files = await ioslib.provisioning.findProvisioningProfileFiles(dir); - should(results.provisioning.distribution).be.an.Array; - checkProfiles(results.provisioning.distribution); - - should(results.provisioning.adhoc).be.an.Array; - checkProfiles(results.provisioning.adhoc); - - should(results.issues).be.an.Array; - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.keys('id', 'type', 'message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - done(); - }); - }); + expect(files).to.be.an('array'); + expect(files).to.have.lengthOf(2); - it('return a emitter', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.provisioning.detect({ bypassCache: true }).on('detected', function (results) { - should(results).be.an.Object; - done(); - }); + for (const file of files) { + expect(isFile(file)).to.be.true; + } }); - it('return results from cache', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.provisioning.detect({ bypassCache: false }).on('detected', function (results) { - should(results).be.an.Object; - done(); - }); - }); + it('should fail if provisioning profile director does not exist', async () => { + const dir = path.join(__dirname, 'fixtures', 'does_not_exist'); - it('find best provisioning profiles without a cert and without a device', function (done) { - this.timeout(5000); - this.slow(2000); + try { + await ioslib.provisioning.findProvisioningProfileFiles(dir); + } catch (err) { + expect(err).to.be.instanceof(Error); + expect(err.message).to.equal(`Provisioning profile directory does not exist: ${dir}`); + return; + } - ioslib.provisioning.detect({ bypassCache: true }, function (err, all) { - ioslib.provisioning.find(function (err, found) { - if (err) { - done(err); - } else { - should(found).be.an.Array; - should(found).length(all.provisioning.development.length + all.provisioning.distribution.length + all.provisioning.adhoc.length); - checkProfiles(found); - done(); - } - }); - }); + throw new Error('Expected error'); }); - (process.env.CI ? it.skip : it)('find best provisioning profiles with a cert, but without a device', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.provisioning.detect({ bypassCache: true }, function (err, all) { - var pem = null, - matches = 0; - - function fn(pp) { - if (!pp.expired) { - pem || (pem = pp.certs[0]); - if (pp.certs.indexOf(pem) !== -1) { - matches++; - } - } - } - - all.provisioning.development.forEach(fn); - all.provisioning.distribution.forEach(fn); - all.provisioning.adhoc.forEach(fn); - - if (pem === null) { - return done(new Error('No provisioning profiles found to run this test')); - } - - ioslib.provisioning.find({ - certs: { pem: pem } - }, function (err, found) { - if (err) { - done(err); - } else { - should(found).be.an.Array; - should(found).be.length(matches); - checkProfiles(found); - done(); - } - }); - }); + it('should read a provisioning profile file', async () => { + const uuid = '11111111-1111-1111-1111-111111111111'; + const file = path.join(__dirname, 'fixtures', 'Provisioning Profiles', `${uuid}.mobileprovision`); + const profile = await ioslib.provisioning.parseProvisioningProfileFile(file); + + expect(profile).to.be.an('object'); + expect(profile.file).to.equal(file); + expect(profile.name).to.equal('Test App'); + expect(profile.uuid).to.equal(uuid); + expect(profile.type).to.equal('distribution'); + if (profile.creationDate) { + expect(profile.creationDate).to.be.a('date'); + } + if (profile.expirationDate) { + expect(profile.expirationDate).to.be.a('date'); + } + expect(profile.expired).to.be.a('boolean'); + expect(profile.managed).to.equal(false); + expect(profile.certs).to.have.property('6bf1be1240bbc6ceb7d43f9560235e6053aa6f3a', Buffer.from('DEVELOPER_CERT_GOES_HERE').toString('base64')); + expect(profile.devices).to.be.null; + expect(profile.entitlements).to.be.an('object'); + expect(profile.teamIds).to.deep.equal([ 'WP12345678' ]); + expect(profile.teamId).to.equal('WP12345678'); + expect(profile.teamName).to.be.equal('Testco'); }); - (process.env.CI ? it.skip : it)('find best provisioning profiles without a cert, but with a device', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.provisioning.detect({ bypassCache: true }, function (err, all) { - var device = null, - matches = 0; + it('should fail if provisioning profile does not exist', async () => { + const file = path.join(__dirname, 'fixtures', 'does_not_exist'); - function fn(pp) { - if (!pp.expired && pp.devices !== null && pp.devices.length) { - device || (device = pp.devices[0]); - if (pp.devices.indexOf(device) !== -1) { - matches++; - } - } - } - - all.provisioning.development.forEach(fn); - all.provisioning.distribution.forEach(fn); - all.provisioning.adhoc.forEach(fn); - - if (device === null) { - return done(new Error('No provisioning profiles found to run this test')); - } + try { + await ioslib.provisioning.parseProvisioningProfileFile(file); + } catch (err) { + expect(err).to.be.instanceof(Error); + expect(err.message).to.equal(`Provisioning profile does not exist: ${file}`); + return; + } - ioslib.provisioning.find({ - deviceUDIDs: device - }, function (err, found) { - if (err) { - done(err); - } else { - should(found).be.an.Array; - should(found).be.length(matches); - checkProfiles(found); - done(); - } - }); - }); + throw new Error('Expected error'); }); - (process.env.CI ? it.skip : it)('find best provisioning profiles with a cert and a device', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.provisioning.detect({ bypassCache: true }, function (err, all) { - var pem = null, - device = null, - matches = 0; + it('should fail if provisioning profile does not contain a plist', async () => { + const file = path.join(__dirname, 'fixtures', 'Bad Provisioning Profiles', 'no_plist.mobileprovision'); - function fn(pp) { - if (!pp.expired && pp.devices !== null && pp.devices.length) { - pem || (pem = pp.certs[0]); - device || (device = pp.devices[0]); - if (pp.devices.indexOf(device) !== -1 && pp.certs.indexOf(pem) !== -1) { - matches++; - } - } - } - - all.provisioning.development.forEach(fn); - all.provisioning.distribution.forEach(fn); - all.provisioning.adhoc.forEach(fn); - - if (pem === null || device === null) { - return done(new Error('No provisioning profiles found to run this test')); - } + try { + await ioslib.provisioning.parseProvisioningProfileFile(file); + } catch (err) { + expect(err).to.be.instanceof(Error); + expect(err.message).to.equal('Failed to parse provisioning profile: no plist found'); + return; + } - ioslib.provisioning.find({ - certs: { pem: pem }, - deviceUDIDs: device - }, function (err, found) { - if (err) { - done(err); - } else { - should(found).be.an.Array; - should(found).be.length(matches); - checkProfiles(found); - done(); - } - }); - }); + throw new Error('Expected error'); }); - (process.env.CI ? it.skip : it)('watch for changes for 10 seconds', function (done) { - this.timeout(80000); - this.slow(80000); + it('should fail if provisioning profile contains a bad plist', async () => { + const file = path.join(__dirname, 'fixtures', 'Bad Provisioning Profiles', 'bad_plist.mobileprovision'); - ioslib.provisioning.watch(function (err, results) { - should(results).be.an.Object; - }); + try { + await ioslib.provisioning.parseProvisioningProfileFile(file); + } catch (err) { + expect(err).to.be.instanceof(Error); + expect(err.message).to.match(/^Unable to parse provisioning profile: .+$/); + return; + } - setTimeout(function () { - ioslib.certs.unwatch(); - done(); - }, 10000); + throw new Error('Expected error'); }); - (process.env.CI ? it.skip : it)('stop watching for updates', function (done) { - this.timeout(80000); - this.slow(80000); - - var counter = 0; - - ioslib.provisioning.watch(function (err, results) { - should(results).be.an.Object; - if (++counter > 1) { - done(new Error('Watcher event was fired despite unwatching')); - } - }); - - setTimeout(function () { - ioslib.certs.unwatch(); - setTimeout(function () { - done(); - }, 2000); - }, 2000); + it('should get all provisioning profiles', async () => { + const dir = path.join(__dirname, 'fixtures', 'Provisioning Profiles'); + const profiles = await ioslib.provisioning.getProvisioningProfiles(true, dir); + + expect(profiles).to.be.an('object'); + + expect(profiles.adhoc).to.be.an('array'); + expect(profiles.development).to.be.an('array'); + expect(profiles.distribution).to.be.an('array'); + expect(profiles.enterprise).to.be.an('array'); + + expect(profiles.adhoc).to.have.lengthOf(0); + expect(profiles.development).to.have.lengthOf(1); + expect(profiles.distribution).to.have.lengthOf(1); + expect(profiles.enterprise).to.have.lengthOf(0); + + let profile = profiles.distribution[0]; + let uuid = '11111111-1111-1111-1111-111111111111'; + let file = path.join(__dirname, 'fixtures', 'Provisioning Profiles', `${uuid}.mobileprovision`); + + expect(profile).to.be.an('object'); + expect(profile.file).to.equal(file); + expect(profile.name).to.equal('Test App'); + expect(profile.uuid).to.equal(uuid); + expect(profile.type).to.equal('distribution'); + if (profile.creationDate) { + expect(profile.creationDate).to.be.a('date'); + } + if (profile.expirationDate) { + expect(profile.expirationDate).to.be.a('date'); + } + expect(profile.expired).to.be.a('boolean'); + expect(profile.managed).to.equal(false); + expect(profile.certs).to.have.property('6bf1be1240bbc6ceb7d43f9560235e6053aa6f3a', Buffer.from('DEVELOPER_CERT_GOES_HERE').toString('base64')); + expect(profile.devices).to.be.null; + expect(profile.entitlements).to.be.an('object'); + expect(profile.teamIds).to.deep.equal([ 'WP12345678' ]); + expect(profile.teamId).to.equal('WP12345678'); + expect(profile.teamName).to.be.equal('Testco'); + + profile = profiles.development[0]; + uuid = '22222222-2222-2222-2222-222222222222'; + file = path.join(__dirname, 'fixtures', 'Provisioning Profiles', `${uuid}.mobileprovision`); + + expect(profile).to.be.an('object'); + expect(profile.file).to.equal(file); + expect(profile.name).to.equal('Test App'); + expect(profile.uuid).to.equal(uuid); + expect(profile.type).to.equal('development'); + if (profile.creationDate) { + expect(profile.creationDate).to.be.a('date'); + } + if (profile.expirationDate) { + expect(profile.expirationDate).to.be.a('date'); + } + expect(profile.expired).to.be.a('boolean'); + expect(profile.managed).to.equal(false); + expect(profile.certs).to.have.property('6bf1be1240bbc6ceb7d43f9560235e6053aa6f3a', Buffer.from('DEVELOPER_CERT_GOES_HERE').toString('base64')); + expect(profile.devices).to.be.an('array'); + expect(profile.devices).to.have.lengthOf(1); + expect(profile.devices[0]).to.equal('UDID_GOES_HERE'); + expect(profile.entitlements).to.be.an('object'); + expect(profile.teamIds).to.deep.equal([ 'WP12345678' ]); + expect(profile.teamId).to.equal('WP12345678'); + expect(profile.teamName).to.be.equal('Testco'); }); - - // TODO: malformed provisioning profile? }); diff --git a/test/test-simulator.js b/test/test-simulator.js index b634c81..48b576c 100644 --- a/test/test-simulator.js +++ b/test/test-simulator.js @@ -1,838 +1,39 @@ -/** - * Tests ioslib's simulator module. - * - * @copyright - * Copyright (c) 2014-2015 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ +import * as ioslib from '../dist/index'; -/** - * To run these tests do the following: - * 1. Update the xcVersion below - * 2. Update the iphoneSim, ipadSim, and watchosSim to point to valid UDIDs for your machine. The UDIDs should come from the last simulator shown for a version in ti info output - * 3. If you get provisioning profile errors, ensure that the TestApp project is setup correctly -*/ - -const - appc = require('node-appc'), - assert = require('assert'), - async = require('async'), - exec = require('child_process').exec, - fs = require('fs'), - ioslib = require('..'), - path = require('path'), - - // these will vary by machine - xcVersion = '13.0', - iphoneSim = '2A1AB1A5-73BE-4536-93F2-BA20D307E1B4', // iPhone 12 Pro Max - ipadSim = 'F3D0DAA8-7449-4D85-BAE5-278704A432B4', // iPad Pro (12.9-inch) (4th generation) - watchosSim = '0E855BDE-862C-4360-8720-351785A5B201'; // Apple Watch Series 6 - 44mm (WatchOS 7.2) - -function checkSims(sims) { - should(sims).be.an.Array; - sims.forEach(function (sim) { - should(sim).be.an.Object; - should(sim).have.keys('udid', 'name', 'version', 'type', 'deviceType', 'deviceName', 'deviceDir', 'model', 'family', 'supportsXcode', 'supportsWatch', 'watchCompanion', 'runtime', 'runtimeName', 'systemLog', 'dataDir'); - - ['udid', 'name', 'version', 'state', 'deviceType', 'deviceName', 'deviceDir', 'model', 'family', 'runtime', 'runtimeName', 'xcode', 'systemLog', 'dataDir'].forEach(function (key) { - if (sim[key] !== null) { - should(sim[key]).be.a.String; - should(sim[key]).not.equal(''); - } - }); - - if (sim.supportsWatch !== null) { - should(sim.supportsWatch).be.an.Object; - Object.keys(sim.supportsWatch).forEach(function (xcodeId) { - should(sim.supportsWatch[xcodeId]).be.a.Boolean; - }); - } - }); -} - -function build(app, iosVersion, defs, done){ - if (typeof defs === 'function') { - done = defs; - defs = []; - } - - ioslib.xcode.detect(function (err, env) { - if (err) { - return done(err); - } - - var xc = null, - ios; - - Object.keys(env.xcode).sort().reverse().some(function (ver) { - return env.xcode[ver].sdks.some(function (sdk) { - if (!iosVersion || appc.version.satisfies(sdk, iosVersion)) { - xc = env.xcode[ver]; - iosVersion = sdk; - return true; - } - }); - }); - - if (xc === null) { - return done(new Error('No selected Xcode')); - } - - if (!xc.eulaAccepted) { - return done(new Error('Xcode must be launched and the EULA must be accepted before the iOS app can be compiled.')); - } - - var args = [ - xc.executables.xcodebuild, - 'clean', 'build', - '-configuration', 'Debug', - '-scheme', app, - '-destination', "platform='iOS Simulator',OS=" + appc.version.format(iosVersion, 2, 2) + ",name='iPhone 12 Pro Max'", - '-derivedDataPath', path.join(__dirname, app), - 'GCC_PREPROCESSOR_DEFINITIONS="' + defs.join(' ') + '"' - ]; - - exec(args.join(' '), { - cwd: path.join(__dirname, app) - }, function (err, stdout, stderr) { - if (err) { - return done(stdout + '\n' + stderr); - } - should(stdout).match(/BUILD SUCCEEDED/); - var appPath = path.join(__dirname, app, 'build', 'Products', 'Debug-iphonesimulator', app + '.app'); - should(fs.existsSync(appPath)).be.true; - done(null, appPath); - }); - }); -} - -function timochaLogWatcher(emitter, callback) { - typeof callback === 'function' || (callback = function () {}); - - var inTiMochaResult = false, - tiMochaResults = [], - logLevelRegExp = /^\[\w+\]\s*/; - - function watch(line) { - line = line.replace(logLevelRegExp, ''); - - if (line === 'TI_MOCHA_RESULT_START') { - inTiMochaResult = true; - } else if (inTiMochaResult && line === 'TI_MOCHA_RESULT_STOP') { - emitter.removeListener('log', watch); - emitter.removeListener('log-file', watch); - try { - callback(null, tiMochaResults.length ? JSON.parse(tiMochaResults.join('\n').trim()) : {}); - } catch (ex) { - callback(new Error('Results are not valid JSON')); - } - } else if (inTiMochaResult && line) { - tiMochaResults.push(line); - } - } - - emitter.on('log', watch); - emitter.on('log-file', watch); -} - -describe('simulator', function () { - var simHandlesToWipe = []; - var logger = process.env.DEBUG ? console.log : function () {}; - - afterEach(function (done) { +describe('Simulators', () => { + it('should get simualators', async function () { this.timeout(60000); - this.slow(60000); - async.eachSeries(simHandlesToWipe, function (simHandle, next) { - if (simHandle && simHandle.simctl) { - appc.subprocess.run(simHandle.simctl, ['erase', simHandle.udid], function () { - next(); - }); - } else { - next(); - } - }, function () { - simHandlesToWipe = []; - setTimeout(function () { - done(); - }, 1000); - }); - }); + this.slow(10000); - it('namespace should be an object', function () { - should(ioslib.simulator).be.an.Object; - }); - - it('detect iOS Simulators', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('simulators', 'issues'); - - should(results.simulators).be.an.Object; - should(results.simulators).have.keys('ios', 'watchos', 'crashDir'); - - should(results.simulators.ios).be.an.Object; - Object.keys(results.simulators.ios).forEach(function (ver) { - checkSims(results.simulators.ios[ver]); - }); - - should(results.simulators.watchos).be.an.Object; - Object.keys(results.simulators.watchos).forEach(function (ver) { - checkSims(results.simulators.watchos[ver]); - }); - - should(results.simulators.crashDir).be.a.String; - should(results.simulators.crashDir).not.equal(''); - if (fs.existsSync(results.simulators.crashDir)) { - should(fs.statSync(results.simulators.crashDir).isDirectory()).be.true; - } + const simulators = await ioslib.simulator.getSimulators({ force: true }); + expect(simulators).to.be.an('array'); - should(results.issues).be.an.Array; - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.keys('id', 'type', 'message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - done(); - }); - }); - - (process.env.CI ? it.skip : it)('fail with bad iOS Sim UDID', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: 'foo', - watchAppBeingInstalled: false - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - should(err).be.ok; - should(err.message).equal('Unable to find an iOS Simulator with the UDID "foo".'); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iOS Sim + bad Watch Sim UDID + no watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: iphoneSim, - watchAppBeingInstalled: false - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - assert(watchSimHandle === null); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('fail with good iOS Sim UDID + bad Watch Sim UDID + watch app', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: iphoneSim, - watchAppBeingInstalled: true, - watchHandleOrUDID: 'bar' - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - should(err).be.ok; - should(err.message).equal('Unable to find a Watch Simulator with the UDID "bar".'); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iOS Sim + Watch Sim + no watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: iphoneSim, - watchAppBeingInstalled: false, - watchHandleOrUDID: watchosSim - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - assert(watchSimHandle === null); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iOS Sim is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: iphoneSim, - watchAppBeingInstalled: false - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - assert(watchSimHandle === null); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iOS Sim + Watch Sim + watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: iphoneSim, - watchAppBeingInstalled: true, - watchHandleOrUDID: watchosSim - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - should(watchSimHandle).be.ok; - should(watchSimHandle.udid).equal(watchosSim); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iOS Sim + watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - simHandleOrUDID: iphoneSim, - watchAppBeingInstalled: true - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - should(watchSimHandle).be.ok; - should(watchSimHandle.udid).equal(watchosSim); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('no iOS Sim + Watch Sim + no watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - watchAppBeingInstalled: false, - watchHandleOrUDID: watchosSim - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - assert(watchSimHandle === null); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('no iOS Sim + no Watch Sim + no watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - watchAppBeingInstalled: false - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - assert(watchSimHandle === null); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('no iOS Sim + app + no Watch Sim + no watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - appBeingInstalled: true, - watchAppBeingInstalled: false - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - assert(watchSimHandle === null); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('no iOS Sim + app + no Watch Sim + watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - appBeingInstalled: true, - watchAppBeingInstalled: true - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - should(watchSimHandle).be.ok; - should(watchSimHandle.udid).equal(watchosSim); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('no iOS Sim + app + Watch Sim + watch app is valid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - appBeingInstalled: true, - watchAppBeingInstalled: true, - watchHandleOrUDID: watchosSim - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - should(watchSimHandle).be.ok; - should(watchSimHandle.udid).equal(watchosSim); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iPad Sim + Watch Sim + watch app is invalid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - appBeingInstalled: true, - simHandleOrUDID: ipadSim, - watchAppBeingInstalled: true, - watchHandleOrUDID: watchosSim - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - should(err).be.ok; - should(err.message).equal(`Unable to find any Watch Simulators that can be paired with the specified iOS Simulator ${ipadSim}.`); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('iPad Sim + watch app is invalid', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - appBeingInstalled: true, - simHandleOrUDID: ipadSim, - watchAppBeingInstalled: true - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - should(err).be.ok; - should(err.message).equal(`Unable to find any Watch Simulators that can be paired with the specified iOS Simulator ${ipadSim}.`); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('find a iOS and Watch Sim', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.simulator.findSimulators({ - logger: logger, - appBeingInstalled: true, - simType: 'iphone', - watchAppBeingInstalled: true, - watchMinOSVersion: '2.0' - }, function (err, simHandle, watchSimHandle, selectedXcode, simInfo, xcodeInfo) { - if (err) { - return done(err); - } - - should(simHandle).be.ok; - should(simHandle.udid).equal(iphoneSim); - should(watchSimHandle).be.ok; - should(watchSimHandle.udid).equal(watchosSim); - should(selectedXcode).be.ok; - should(selectedXcode.version).equal(xcVersion); - done(); - }); - }); - - (process.env.CI ? it.skip : it)('should launch the default simulator and stop it', function (done) { - this.timeout(120000); - this.slow(60000); - - ioslib.simulator.launch(iphoneSim, null, function (err, simHandle, watchSimHandle) { - simHandlesToWipe.push(simHandle, watchSimHandle); - - if (err) { - return done(err); - } - - appc.subprocess.run('ps', '-ef', function (code, out, err) { - if (code) { - return done(new Error('Failed to get process list: ' + code)); - } - - should(out.split('\n').filter(function (line) { return line.indexOf(simHandle.simulator) !== -1; })).not.length(0); - - ioslib.simulator.stop(simHandle, function () { - done(); - }); - }); - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }); - }); - - (process.env.CI ? it.skip : it)('should be able to launch simulator and log basic logs', function (done) { - this.timeout(120000); - this.slow(60000); - - build('TestApp', null, ['TEST_BASIC_LOGGING'], function (err, appPath) { - if (err) { - return done(err); - } - - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; - - var counter = 0, - launched = false, - started = false; - - ioslib.simulator.launch(null, { - appPath: appPath, - autoExit: true, - hide: true, - logFilename: 'TestApp.log' - }).on('log-file', function (line) { - counter++; - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }).on('launched', function (simHandle, watchSimHandle) { - launched = true; - simHandlesToWipe.push(simHandle, watchSimHandle); - }).on('error', function (err) { - done(err); - }).on('app-started', function (simHandle) { - started = true; - }).on('app-quit', function (err) { - should(err).not.be.ok(); - should(launched).equal(true); - should(started).equal(true); - should(counter).not.equal(0); - done(); - }); - }); - }); - - (process.env.CI ? it.skip : it)('should be able to launch simulator and log ti mocha results', function (done) { - this.timeout(60000); - this.slow(60000); - - build('TestApp', null, ['TEST_TIMOCHA'], function (err, appPath) { - if (err) { - return done(err); - } - - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; - - var simHandle, - n = 0, - emitter = ioslib.simulator.launch(null, { - appPath: appPath, - hide: true, - logFilename: 'TestApp.log' - }); - - function stop() { - if (++n === 2) { - ioslib.simulator.stop(simHandle, function () { - done(); - }); - } - } - - emitter.on('app-started', function (handle) { - simHandle = handle; - stop(); - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }).on('launched', function (simHandle, watchSimHandle) { - simHandlesToWipe.push(simHandle, watchSimHandle); - }).on('error', function (err) { - done(err); - }); - - timochaLogWatcher(emitter, function (err, results) { - should(err).not.be.ok; - should(results).be.an.Object; - should(results).have.property('foo', 'bar'); - stop(); - }); - }); - }); - - (process.env.CI ? it.skip : it)('should be able to launch simulator and log ti mocha results with multiple lines', function (done) { - this.timeout(120000); - this.slow(60000); - - build('TestApp', null, ['TEST_TIMOCHA_MULTIPLE_LINES'], function (err, appPath) { - if (err) { - return done(err); - } - - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; - - var simHandle, - n = 0, - emitter = ioslib.simulator.launch(null, { - appPath: appPath, - hide: true, - logFilename: 'TestApp.log' - }); - - function stop() { - if (++n === 2) { - ioslib.simulator.stop(simHandle, function () { - done(); - }); - } - } - - emitter.on('app-started', function (handle) { - simHandle = handle; - stop(); - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }).on('launched', function (simHandle, watchSimHandle) { - simHandlesToWipe.push(simHandle, watchSimHandle); - }).on('error', function (err) { - done(err); - }); - - timochaLogWatcher(emitter, function (err, results) { - should(err).not.be.ok; - should(results).be.an.Object; - should(results).have.property('foo', 'bar'); - stop(); - }); - }); + for (const sim of simulators) { + expect(sim).to.be.instanceof(ioslib.simulator.Simulator); + } }); - (process.env.CI ? it.skip : it)('should be able to launch simulator and detect crash with Objective-C exception', function (done) { + it('should generate a simulator registry', async function () { this.timeout(60000); - this.slow(60000); - - build('TestApp', null, ['TEST_OBJC_CRASH'], function (err, appPath) { - if (err) { - return done(err); - } - - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; + this.slow(10000); - var simHandle; + const simulators = await ioslib.simulator.getSimulators({ force: true }); + const xcodes = await ioslib.xcode.getXcodes({ force: true }); + const registry = ioslib.simulator.generateSimulatorRegistry({ simulators, xcodes }); - ioslib.simulator.launch(null, { - appPath: appPath, - hide: true, - logFilename: 'TestApp.log' - }).on('app-started', function (handle) { - simHandle = handle; - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }).on('launched', function (simHandle, watchSimHandle) { - simHandlesToWipe.push(simHandle, watchSimHandle); - }).on('error', function (err) { - done(err); - }).on('app-quit', function (crash) { - // stop the simulator before we start throwing exceptions - ioslib.simulator.stop(simHandle, function () { - try { - should(crash).be.an.instanceOf(ioslib.simulator.SimulatorCrash); - should(crash.toString()).eql('SimulatorCrash: App crashed in the iOS Simulator'); - should(crash).have.property('crashFiles'); - should(crash.crashFiles).be.an.Array; - crash.crashFiles.forEach(function (file) { - should(fs.existsSync(file)).be.ok; - }); - } finally { - if (crash && Array.isArray(crash.crashFiles)) { - crash.crashFiles.forEach(function (file) { - fs.existsSync(file) && fs.unlinkSync(file); - }); - } - } + expect(registry).to.be.an('object'); + expect(registry).to.have.keys('ios', 'watchos'); - done(); - }); - }); - }); - }); - - // EH 19/3/2021 - I'm unable to capture the C exception here with the new logfile system, it - // appears that the C exception does not get written to the logfile or the system log. But leaving - // this test here skipped incase someone more familiar wants to poke around - it.skip('should be able to launch simulator and detect crash with C exception', function (done) { - this.timeout(120000); - this.slow(60000); - - build('TestApp', null, ['TEST_C_CRASH'], function (err, appPath) { - if (err) { - return done(err); + for (const version of Object.keys(registry.ios)) { + for (const sim of registry.ios[version]) { + expect(sim).to.be.instanceof(ioslib.simulator.iOSSimulator); } + } - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; - - var simHandle; - - ioslib.simulator.launch(null, { - appPath: appPath, - hide: true, - logFilename: 'TestApp.log' - }).on('app-started', function (handle) { - simHandle = handle; - }).on('launched', function (simHandle, watchSimHandle) { - simHandlesToWipe.push(simHandle, watchSimHandle); - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }).on('error', function (err) { - done(err); - }).on('app-quit', function (crash) { - // stop the simulator before we start throwing exceptions - ioslib.simulator.stop(simHandle, function () { - try { - should(crash).be.an.instanceOf(ioslib.simulator.SimulatorCrash); - should(crash.toString()).eql('SimulatorCrash: App crashed in the iOS Simulator'); - - should(crash).have.property('crashFiles'); - should(crash.crashFiles).be.an.Array; - crash.crashFiles.forEach(function (file) { - should(fs.existsSync(file)).be.ok; - }); - } finally { - if (crash && Array.isArray(crash.crashFiles)) { - crash.crashFiles.forEach(function (file) { - fs.existsSync(file) && fs.unlinkSync(file); - }); - } - } - - done(); - }); - }); - }); - }); - - (process.env.CI ? it.skip : it)('should launch the default simulator and launch the watchOS 2 app', function (done) { - this.timeout(120000); - this.slow(60000); - - build('TestWatchApp2', undefined, ['TEST_BASIC_LOGGING'], function (err, appPath) { - if (err) { - return done(err); + for (const version of Object.keys(registry.watchos)) { + for (const sim of registry.watchos[version]) { + expect(sim).to.be.instanceof(ioslib.simulator.watchOSSimulator); } - - should(appPath).be.a.String; - should(fs.existsSync(appPath)).be.ok; - - ioslib.simulator.detect(function (err, simInfo) { - ioslib.simulator.launch(iphoneSim, { - appPath: appPath, - hide: true, - launchWatchApp: true, - logFilename: 'TestApp.log' - }).on('log-debug', function (line, simHandle) { - logger((simHandle ? '[' + simHandle.family.toUpperCase() + '] ' : '') + '[DEBUG]', line); - }).on('launched', function (simHandle, watchSimHandle) { - simHandlesToWipe.push(simHandle, watchSimHandle); - }).on('app-started', function (simHandle, watchSimHandle) { - ioslib.simulator.stop(simHandle, function () { - if (watchSimHandle) { - ioslib.simulator.stop(watchSimHandle, function () { - done(); - }); - } else { - done(); - } - }); - }).on('error', function (err) { - done(err); - }); - }); - }); + } }); - }); diff --git a/test/test-teams.js b/test/test-teams.js index 4359bf0..7108d51 100644 --- a/test/test-teams.js +++ b/test/test-teams.js @@ -1,59 +1,33 @@ -/** - * Tests ioslib's teams module. - * - * @copyright - * Copyright (c) 2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ +import path from 'path'; -const ioslib = require('..'); +import * as ioslib from '../dist/index'; -describe('teams', function () { - it('namespace should be an object', function () { - should(ioslib.teams).be.an.Object; - }); +describe('Teams', () => { + it('should get all teams from the system provisioning profiles', async () => { + const teams = await ioslib.teams.getTeams(true); - it('detect teams', function (done) { - this.timeout(5000); - this.slow(2000); + expect(teams).to.be.an('object'); + for (const id of Object.keys(teams)) { + expect(teams[id]).to.be.a('string'); + } + }); - ioslib.teams.detect(function (err, results) { - if (err) { - return done(err); - } + it('should get all teams from the mock provisioning profiles', async () => { + const dir = path.join(__dirname, 'fixtures', 'Provisioning Profiles'); + const teams = await ioslib.teams.getTeams(true, dir); - validateResults(results); - done(); + expect(teams).to.deep.equal({ + WP12345678: 'Testco' }); }); - it('return a emitter', function (done) { - this.timeout(30000); - this.slow(10000); + it('should fail to build teams from profiles if profiles is not valid', () => { + expect(() => { + ioslib.teams.buildTeamsFromProvisioningProfiles(); + }).to.throw(TypeError, 'Expected profiles list to be an object'); - ioslib.teams.detect({ bypassCache: true }) - .on('detected', function (results) { - validateResults(results); - done(); - }) - .on('error', done); + expect(() => { + ioslib.teams.buildTeamsFromProvisioningProfiles(123); + }).to.throw(TypeError, 'Expected profiles list to be an object'); }); }); - -function validateResults(results) { - should(results).be.an.Object; - should(results).have.keys('teams'); - should(results.teams).be.an.Array; - - results.teams.forEach(function (team) { - should(team).be.an.Object; - should(team).have.keys('id', 'name'); - should(team.id).be.a.String; - should(team.id).not.equal(''); - should(team.name).be.a.String; - should(team.name).not.equal(''); - }); -} diff --git a/test/test-xcode.js b/test/test-xcode.js index 24823be..04d115e 100644 --- a/test/test-xcode.js +++ b/test/test-xcode.js @@ -1,157 +1,194 @@ -/** - * Tests ioslib's xcode module. - * - * @copyright - * Copyright (c) 2014-2016 by Appcelerator, Inc. All Rights Reserved. - * - * @license - * Licensed under the terms of the Apache Public License. - * Please see the LICENSE included with this distribution for details. - */ - -const - fs = require('fs'), - ioslib = require('..'); - -function checkXcode(xcode) { - should(xcode).be.an.Object; - should(xcode).have.keys('xcodeapp', 'path', 'selected', 'version', 'build', - 'supported', 'eulaAccepted', 'sdks', 'sims', 'simDeviceTypes', - 'simRuntimes', 'watchos', 'tvos', 'teams', 'executables'); - - should(xcode.xcodeapp).be.a.String; - should(xcode.xcodeapp).not.equal(''); - should(fs.existsSync(xcode.xcodeapp)).be.true; - should(fs.statSync(xcode.xcodeapp).isDirectory()).be.true; - - should(xcode.path).be.a.String; - should(xcode.path).not.equal(''); - should(fs.existsSync(xcode.path)).be.true; - should(fs.statSync(xcode.path).isDirectory()).be.true; - - should(xcode.selected).be.a.Boolean; - should(xcode.eulaAccepted).be.a.Boolean; - - should(xcode.version).be.a.String; - should(xcode.version).not.equal(''); - - should(xcode.build).be.a.String; - should(xcode.build).not.equal(''); - - should([null, true, false, 'maybe']).containEql(xcode.supported); - - should(xcode.sdks).be.an.Array; - xcode.sdks.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); +import path from 'path'; + +import * as ioslib from '../dist/index'; + +describe('Xcode', () => { + it('should error if dir is not valid', () => { + expect(() => { + new ioslib.xcode.Xcode(); + }).to.throw(TypeError, 'Expected directory to be a valid string'); + + expect(() => { + new ioslib.xcode.Xcode(''); + }).to.throw(TypeError, 'Expected directory to be a valid string'); }); - should(xcode.sims).be.an.Array; - xcode.sims.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); + it('should error if dir does not exist', () => { + expect(() => { + new ioslib.xcode.Xcode(path.join(__dirname, 'does_not_exist')); + }).to.throw(Error, 'Directory does not exist'); }); - should(xcode.simDeviceTypes).be.an.Object; - Object.keys(xcode.simDeviceTypes).forEach(function (name) { - should(xcode.simDeviceTypes[name]).be.an.Object; - should(xcode.simDeviceTypes[name]).have.keys('name', 'model', 'supportsWatch'); - should(xcode.simDeviceTypes[name].name).be.a.String; - should(xcode.simDeviceTypes[name].name).not.equal(''); - should(xcode.simDeviceTypes[name].model).be.a.String; - should(xcode.simDeviceTypes[name].model).not.equal(''); - should(xcode.simDeviceTypes[name].supportsWatch).be.a.Boolean; + it('should fail if xcodebuild not found', () => { + expect(() => { + new ioslib.xcode.Xcode(path.join(__dirname, 'fixtures', 'BadXcode.app')); + }).to.throw(Error, '"xcodebuild" not found'); }); - should(xcode.simRuntimes).be.an.Object; - Object.keys(xcode.simRuntimes).forEach(function (name) { - should(xcode.simRuntimes[name]).be.an.Object; - should(xcode.simRuntimes[name]).have.keys('name', 'version'); - should(xcode.simRuntimes[name].name).be.a.String; - should(xcode.simRuntimes[name].name).not.equal(''); - should(xcode.simRuntimes[name].version).be.a.String; - should(xcode.simRuntimes[name].version).not.equal(''); + it('should fail if the version.plist is not found', () => { + expect(() => { + new ioslib.xcode.Xcode(path.join(__dirname, 'fixtures', 'IncompleteXcode.app')); + }).to.throw(Error, '"version.plist" not found'); }); - if (xcode.watchos !== null) { - should(xcode.watchos.sdks).be.an.Array; - xcode.watchos.sdks.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); - }); + it('should fail if the Xcode version is too old', () => { + expect(() => { + new ioslib.xcode.Xcode(path.join(__dirname, 'fixtures', 'OldXcode.app')); + }).to.throw(Error, 'Found Xcode 5.0, but it is too old and unsupported'); + }); - should(xcode.watchos.sims).be.an.Array; - xcode.watchos.sims.forEach(function (s) { - should(s).be.a.String; - should(s).not.equal(''); + it('should detect a Xcode 8 install', () => { + const dir = path.join(__dirname, 'fixtures/Xcode8.app'); + const simapp = path.join(dir, 'Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator'); + const simwatchapp = path.join(dir, 'Contents/Developer/Applications/Simulator (Watch).app/Contents/MacOS/Simulator (Watch)'); + const xcode = new ioslib.xcode.Xcode(dir); + + expect(xcode).to.be.an('object'); + + // the Xcode object will merge 'global' sim device types and runtimes with those found in + // the path and this can make testing difficult, so just remove them and manually check + const { simDeviceTypes, simRuntimes } = xcode; + xcode.simDeviceTypes = {}; + xcode.simRuntimes = {}; + xcode.simDevicePairs = {}; + + expect(xcode).to.deep.equal({ + path: path.join(dir, 'Contents/Developer'), + xcodeapp: dir, + version: '8.3.3', + build: '8E3004b', + id: '8.3.3:8E3004b', + executables: { + simctl: path.join(dir, 'Contents/Developer/usr/bin/simctl'), + simulator: simapp, + watchsimulator: simwatchapp, + xcodebuild: path.join(dir, 'Contents/Developer/usr/bin/xcodebuild') + }, + coreSimulatorProfilesPaths: [], + eulaAccepted: true, + sdks: { + ios: [ '10.3.1' ], + watchos: [] + }, + simDeviceTypes: {}, + simRuntimes: {}, + simDevicePairs: {} }); - } - - should(xcode.teams).be.an.Object; - Object.keys(xcode.teams).forEach(function (teamId) { - should(xcode.teams[teamId]).be.an.Object; - should(xcode.teams[teamId]).have.keys('name', 'status', 'type'); - should(xcode.teams[teamId].name).be.a.String(); - should(xcode.teams[teamId].name).not.equal(''); - should(xcode.teams[teamId].status).be.a.String(); - should(xcode.teams[teamId].status).not.equal(''); - should(xcode.teams[teamId].type).be.a.String(); - should(xcode.teams[teamId].type).not.equal(''); - }); - var keys = ['xcodebuild', 'clang', 'clang_xx', 'libtool', 'lipo', 'otool', 'pngcrush', 'simulator', 'watchsimulator', 'simctl']; - should(xcode.executables).be.an.Object; - keys.forEach(function (key) { - should(xcode.executables).have.property(key); - if (xcode.executables[key] !== null) { - should(xcode.executables[key]).be.a.String; - should(xcode.executables[key]).not.equal(''); - should(fs.existsSync(xcode.executables[key])).be.true; - should(fs.statSync(xcode.executables[key]).isDirectory()).be.false; + expect(simDeviceTypes).to.be.an('object'); + for (const id of Object.keys(simDeviceTypes)) { + expect(simDeviceTypes[id]).to.be.an('object'); + expect(simDeviceTypes[id]).to.have.keys('name', 'model', 'supportsWatch'); + } + + expect(simRuntimes).to.be.an('object'); + for (const id of Object.keys(simRuntimes)) { + expect(simRuntimes[id]).to.be.an('object'); + expect(simRuntimes[id]).to.have.keys('name', 'version'); } }); -} -describe('xcode', function () { - it('namespace should be an object', function () { - should(ioslib.xcode).be.an.Object; + it('should detect a Xcode 9 install', () => { + const dir = path.join(__dirname, 'fixtures/Xcode9.app'); + const simapp = path.join(dir, 'Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator'); + const xcode = new ioslib.xcode.Xcode(dir); + + expect(xcode).to.be.an('object'); + + // the Xcode object will merge 'global' sim device types and runtimes with those found in + // the path and this can make testing difficult, so just remove them and manually check + const { simDeviceTypes, simRuntimes } = xcode; + xcode.simDeviceTypes = {}; + xcode.simRuntimes = {}; + xcode.simDevicePairs = {}; + + expect(xcode).to.deep.equal({ + path: path.join(dir, 'Contents/Developer'), + xcodeapp: dir, + version: '9.0', + build: '9A235', + id: '9.0:9A235', + executables: { + simctl: path.join(dir, 'Contents/Developer/usr/bin/simctl'), + simulator: simapp, + watchsimulator: simapp, + xcodebuild: path.join(dir, 'Contents/Developer/usr/bin/xcodebuild') + }, + coreSimulatorProfilesPaths: [ + path.join(dir, 'Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles') + ], + eulaAccepted: true, + sdks: { + ios: [ '11.0', '10.3.1' ], + watchos: [] + }, + simDeviceTypes: {}, + simRuntimes: {}, + simDevicePairs: {} + }); + + expect(simDeviceTypes).to.be.an('object'); + for (const id of Object.keys(simDeviceTypes)) { + expect(simDeviceTypes[id]).to.be.an('object'); + expect(simDeviceTypes[id]).to.have.keys('name', 'model', 'supportsWatch'); + } + + expect(simRuntimes).to.be.an('object'); + for (const id of Object.keys(simRuntimes)) { + expect(simRuntimes[id]).to.be.an('object'); + expect(simRuntimes[id]).to.have.keys('name', 'version'); + } }); - it('detect should find Xcode installations', function (done) { - this.timeout(5000); - this.slow(2000); - - ioslib.xcode.detect(function (err, results) { - if (err) { - return done(err); - } - - should(results).be.an.Object; - should(results).have.keys('selectedXcode', 'xcode', 'issues'); - should(results.selectedXcode).be.an.Object; - should(results.xcode).be.an.Object; - should(results.issues).be.an.Array; - - if (results.selectedXcode !== null) { - checkXcode(results.selectedXcode); - } - - Object.keys(results.xcode).forEach(function (ver) { - checkXcode(results.xcode[ver]); - }); - - results.issues.forEach(function (issue) { - should(issue).be.an.Object; - should(issue).have.property('id'); - should(issue).have.property('type'); - should(issue).have.property('message'); - should(issue.id).be.a.String; - should(issue.type).be.a.String; - should(issue.type).match(/^info|warning|error$/); - should(issue.message).be.a.String; - }); - - done(); + it('should detect a Xcode 11 install', () => { + const dir = path.join(__dirname, 'fixtures/Xcode11.app'); + const simapp = path.join(dir, 'Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator'); + const xcode = new ioslib.xcode.Xcode(dir); + + expect(xcode).to.be.an('object'); + + // the Xcode object will merge 'global' sim device types and runtimes with those found in + // the path and this can make testing difficult, so just remove them and manually check + const { simDeviceTypes, simRuntimes } = xcode; + xcode.simDeviceTypes = {}; + xcode.simRuntimes = {}; + xcode.simDevicePairs = {}; + + expect(xcode).to.deep.equal({ + path: path.join(dir, 'Contents/Developer'), + xcodeapp: dir, + version: '11.0', + build: '11M362v', + id: '11.0:11M362v', + executables: { + simctl: path.join(dir, 'Contents/Developer/usr/bin/simctl'), + simulator: simapp, + watchsimulator: simapp, + xcodebuild: path.join(dir, 'Contents/Developer/usr/bin/xcodebuild') + }, + coreSimulatorProfilesPaths: [ + path.join(dir, 'Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles') + ], + eulaAccepted: true, + sdks: { + ios: [ '13.0' ], + watchos: [] + }, + simDeviceTypes: {}, + simRuntimes: {}, + simDevicePairs: {} }); + + expect(simDeviceTypes).to.be.an('object'); + for (const id of Object.keys(simDeviceTypes)) { + expect(simDeviceTypes[id]).to.be.an('object'); + expect(simDeviceTypes[id]).to.have.keys('name', 'model', 'supportsWatch'); + } + + expect(simRuntimes).to.be.an('object'); + for (const id of Object.keys(simRuntimes)) { + expect(simRuntimes[id]).to.be.an('object'); + expect(simRuntimes[id]).to.have.keys('name', 'version'); + } }); }); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..a8964ca --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7170 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/core@^7.12.10", "@babel/core@^7.7.5": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== + dependencies: + "@babel/types" "^7.12.11" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-create-class-features-plugin@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" + integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" + integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/types" "^7.12.11" + +"@babel/helper-get-function-arity@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-member-expression-to-functions@^7.12.1", "@babel/helper-member-expression-to-functions@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" + integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== + dependencies: + "@babel/types" "^7.12.7" + +"@babel/helper-module-imports@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== + dependencies: + "@babel/types" "^7.12.10" + +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-remap-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" + integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/types" "^7.12.1" + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz#ea511658fc66c7908f923106dd88e08d1997d60d" + integrity sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.7" + "@babel/helper-optimise-call-expression" "^7.12.10" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.11" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" + integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0", "@babel/helper-split-export-declaration@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" + integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== + dependencies: + "@babel/types" "^7.12.11" + +"@babel/helper-validator-identifier@^7.10.4", "@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" + integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.7.0": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== + +"@babel/plugin-proposal-class-properties@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" + integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" + integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-destructuring@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" + integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" + integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== + dependencies: + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.12.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-parameters@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" + integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/register@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.12.10.tgz#19b87143f17128af4dbe7af54c735663b3999f60" + integrity sha512-EvX/BvMMJRAA3jZgILWgbsrHwBQvllC5T8B29McyME8DvkdOxk4ujESfrMvME8IHSDvWXrmMXxPvA/lx2gqPLQ== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.19" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/template@^7.10.4", "@babel/template@^7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" + +"@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.7.0": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" + integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== + dependencies: + "@babel/code-frame" "^7.12.11" + "@babel/generator" "^7.12.11" + "@babel/helper-function-name" "^7.12.11" + "@babel/helper-split-export-declaration" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/types" "^7.12.12" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.10.4", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.7.0": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@eslint/eslintrc@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz#d01fc791e2fc33e88a29d6f3dc7e93d0cd784b76" + integrity sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + lodash "^4.17.19" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@gulp-sourcemaps/identity-map@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz#a6e8b1abec8f790ec6be2b8c500e6e68037c0019" + integrity sha512-Tb+nSISZku+eQ4X1lAkevcQa+jknn/OVUgZ3XCxEKIsLsqYuPoJwJOPQeaOk75X3WPftb29GWY1eqE7GLsXb1Q== + dependencies: + acorn "^6.4.1" + normalize-path "^3.0.0" + postcss "^7.0.16" + source-map "^0.6.0" + through2 "^3.0.1" + +"@gulp-sourcemaps/map-sources@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o= + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/formatio@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-5.0.1.tgz#f13e713cb3313b1ab965901b01b0828ea6b77089" + integrity sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^5.0.2" + +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.0.tgz#1d2f0743dc54bf13fe9d508baefacdffa25d4329" + integrity sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + +"@types/eslint-scope@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" + integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.2.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" + integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.45": + version "0.0.45" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" + integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/node@*": + version "14.14.20" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340" + integrity sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@webassemblyjs/ast@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.1.tgz#76c6937716d68bf1484c15139f5ed30b9abc8bb4" + integrity sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.1" + "@webassemblyjs/helper-wasm-bytecode" "1.9.1" + "@webassemblyjs/wast-parser" "1.9.1" + +"@webassemblyjs/floating-point-hex-parser@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz#9eb0ff90a1cdeef51f36ba533ed9f06b5cdadd09" + integrity sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg== + +"@webassemblyjs/helper-api-error@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz#ad89015c4246cd7f5ed0556700237f8b9c2c752f" + integrity sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA== + +"@webassemblyjs/helper-buffer@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz#186e67ac25f9546ea7939759413987f157524133" + integrity sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w== + +"@webassemblyjs/helper-code-frame@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz#aab177b7cc87a318a8f8664ad68e2c3828ebc42b" + integrity sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.1" + +"@webassemblyjs/helper-fsm@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz#527e91628e84d13d3573884b3dc4c53a81dcb911" + integrity sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw== + +"@webassemblyjs/helper-module-context@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz#778670b3d471f7cf093d1e7c0dde431b54310e16" + integrity sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg== + dependencies: + "@webassemblyjs/ast" "1.9.1" + +"@webassemblyjs/helper-wasm-bytecode@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz#563f59bcf409ccf469edde168b9426961ffbf6df" + integrity sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ== + +"@webassemblyjs/helper-wasm-section@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz#f7988f94c12b01b99a16120cb01dc099b00e4798" + integrity sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/helper-buffer" "1.9.1" + "@webassemblyjs/helper-wasm-bytecode" "1.9.1" + "@webassemblyjs/wasm-gen" "1.9.1" + +"@webassemblyjs/ieee754@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz#3b715871ca7d75784717cf9ceca9d7b81374b8af" + integrity sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.1.tgz#b2ecaa39f9e8277cc9c707c1ca8b2aa7b27d0b72" + integrity sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.1.tgz#d02d9daab85cda3211e43caf31dca74c260a73b0" + integrity sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg== + +"@webassemblyjs/wasm-edit@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz#e27a6bdbf78e5c72fa812a2fc3cbaad7c3e37578" + integrity sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/helper-buffer" "1.9.1" + "@webassemblyjs/helper-wasm-bytecode" "1.9.1" + "@webassemblyjs/helper-wasm-section" "1.9.1" + "@webassemblyjs/wasm-gen" "1.9.1" + "@webassemblyjs/wasm-opt" "1.9.1" + "@webassemblyjs/wasm-parser" "1.9.1" + "@webassemblyjs/wast-printer" "1.9.1" + +"@webassemblyjs/wasm-gen@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz#56a0787d1fa7994fdc7bea59004e5bec7189c5fc" + integrity sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/helper-wasm-bytecode" "1.9.1" + "@webassemblyjs/ieee754" "1.9.1" + "@webassemblyjs/leb128" "1.9.1" + "@webassemblyjs/utf8" "1.9.1" + +"@webassemblyjs/wasm-opt@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz#fbdf8943a825e6dcc4cd69c3e092289fa4aec96c" + integrity sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/helper-buffer" "1.9.1" + "@webassemblyjs/wasm-gen" "1.9.1" + "@webassemblyjs/wasm-parser" "1.9.1" + +"@webassemblyjs/wasm-parser@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz#5e8352a246d3f605312c8e414f7990de55aaedfa" + integrity sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/helper-api-error" "1.9.1" + "@webassemblyjs/helper-wasm-bytecode" "1.9.1" + "@webassemblyjs/ieee754" "1.9.1" + "@webassemblyjs/leb128" "1.9.1" + "@webassemblyjs/utf8" "1.9.1" + +"@webassemblyjs/wast-parser@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz#e25ef13585c060073c1db0d6bd94340fdeee7596" + integrity sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/floating-point-hex-parser" "1.9.1" + "@webassemblyjs/helper-api-error" "1.9.1" + "@webassemblyjs/helper-code-frame" "1.9.1" + "@webassemblyjs/helper-fsm" "1.9.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz#b9f38e93652037d4f3f9c91584635af4191ed7c1" + integrity sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w== + dependencies: + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/wast-parser" "1.9.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= + +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8= + dependencies: + acorn "^2.1.0" + +acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" + integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +appcd-fs@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/appcd-fs/-/appcd-fs-2.0.2.tgz#e88601695291da7585e44fe1eba4302f7dbcc5e3" + integrity sha512-UW0OkezNxBfX6dUs+Ik+RxdUoPwG3UXBasSm/+7N5kHxrFPZrABWvh2NSVdVT9yOodEbbDXt+NQd6cRJVJ7XFA== + dependencies: + source-map-support "^0.5.19" + +appcd-gulp@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/appcd-gulp/-/appcd-gulp-3.1.1.tgz#4af4399d673bf31c4e5b618264bd5925e2c5404b" + integrity sha512-+a4Ezm4FgZoSf1TTivAsHFICQQLktamG0FgNXlz2pIxYw8uHtZBBIzHsoTg1UyrAKGctyhiOt5qipXUApOLRrg== + dependencies: + "@babel/core" "^7.12.10" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/register" "^7.12.10" + ansi-colors "^4.1.1" + babel-eslint "^10.1.0" + babel-loader "^8.2.2" + babel-plugin-dynamic-import-node "^2.3.3" + chai "^4.2.0" + chai-as-promised "^7.1.1" + core-js "^3.8.2" + esdoc "^1.1.0" + esdoc-ecmascript-proposal-plugin "^1.0.0" + esdoc-standard-plugin "^1.0.0" + eslint "^7.17.0" + eslint-config-axway "^5.0.0" + eslint-plugin-chai-friendly "^0.6.0" + eslint-plugin-mocha "^8.0.0" + eslint-plugin-node "^11.1.0" + fancy-log "^1.3.3" + fs-extra "^9.0.1" + gulp "^4.0.2" + gulp-babel "^8.0.0" + gulp-chug "^0.5.1" + gulp-debug "^4.0.0" + gulp-eslint "^6.0.0" + gulp-load-plugins "^2.0.6" + gulp-plumber "^1.2.1" + gulp-sourcemaps "^3.0.0" + mocha "^8.2.1" + mocha-jenkins-reporter "^0.4.5" + nyc "^15.1.0" + sinon "^9.2.2" + sinon-chai "^3.5.0" + webpack "^5.11.1" + +appcd-logger@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/appcd-logger/-/appcd-logger-3.0.2.tgz#a7294e8ed24c1bc5646bcd77bb85d9aac4920888" + integrity sha512-xDYxNWg2OH4i3sKAeTmAdmfnTucw92BtDU59+BEq19kphCD06l8aFsMEusMerPPEUeYs5yDZLcLDlMssL7iLtQ== + dependencies: + snooplogg "^3.0.2" + source-map-support "^0.5.19" + +appcd-path@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/appcd-path/-/appcd-path-2.0.3.tgz#e6c315fc7abb07a9c63193d9db8a5b0f2f5bf5ed" + integrity sha512-CuNo+9ghG+PhJiZpR1hJ86yzxjfCQpaIri7t3Xqk37+syYsNzAOpMBII6Iq9XJuQ1cr6eJBOnMi0Hw41C1SrQg== + dependencies: + source-map-support "^0.5.19" + +appcd-response@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/appcd-response/-/appcd-response-3.0.2.tgz#5b7db7dbe745a13a911618149858f21987f3e47c" + integrity sha512-Grd5LWUOy3oeT1u1nxmINM2kLdebVQNWDKanuAdjtp4x89jGo2LU77P8kpFy5K1HZzxratAlBwqo4jPb2yRXQg== + dependencies: + appcd-fs "^2.0.2" + appcd-path "^2.0.3" + source-map-support "^0.5.19" + sprintf-js "^1.1.2" + +appcd-subprocess@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/appcd-subprocess/-/appcd-subprocess-5.0.1.tgz#6cf924b3a70a0f3e6f55fab62824e4f78dea5280" + integrity sha512-bPNMNOq/egPF2wYaPcTZRxRYjMkUv2pVo9g1OIvK0QZ4eElkWNv9YhLbX+wptM5N+zVyXCNzOPydHUo5oAdToQ== + dependencies: + appcd-logger "^3.0.2" + appcd-response "^3.0.2" + source-map-support "^0.5.19" + which "^2.0.2" + +appcd-util@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/appcd-util/-/appcd-util-3.1.1.tgz#e3e11c9f57a93b539b537363df591fb43b14276e" + integrity sha512-a/CiK7mdGa6qleRH5REVC9u5wn9+IbqeA/7oVBTSbLKwTc+QCYp8bkotymV0cfBjtBlH7TxjvLZUg6KjLRT1JQ== + dependencies: + appcd-fs "^2.0.2" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + semver "^7.3.4" + source-map-support "^0.5.19" + +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argv-split@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argv-split/-/argv-split-2.0.1.tgz#be264117790dbd5ccd63ec3f449a1804814ac4c5" + integrity sha1-viZBF3kNvVzNY+w/RJoYBIFKxMU= + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + +array-each@^1.0.0, array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + +array-includes@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" + integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + get-intrinsic "^1.0.1" + is-string "^1.0.5" + +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flat@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" + integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^2.0.0" + stream-exhaust "^1.0.1" + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= + dependencies: + async-done "^1.2.2" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-generator@6.11.4: + version "6.11.4" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.11.4.tgz#14f6933abb20c62666d27e3b7b9f5b9dc0712a9a" + integrity sha1-FPaTOrsgxiZm0n47e59bncBxKpo= + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.10.2" + detect-indent "^3.0.1" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-generator@6.26.1: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-loader@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-messages@^6.23.0, babel-messages@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-traverse@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.10.2, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@6.18.0, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.1.2, base64-js@^1.2.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= + +big-integer@^1.6.44: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bplist-creator@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" + integrity sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA== + dependencies: + stream-buffers "~2.2.0" + +bplist-parser@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brotli@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.2.tgz#525a9cad4fcba96475d7d388f6aecb13eed52f46" + integrity sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y= + dependencies: + base64-js "^1.1.2" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +bryt@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bryt/-/bryt-1.0.2.tgz#041b58d0038aabb7517920e4d7ccad27f172cdd3" + integrity sha512-K/qt3xOAOU71q5Y2yJKOqleBwfeJ3J5tOn1pds9b/iQvQ/cq984oSzuv6iOXRxoTdZH3WGOazX1HXu0+sLU7VA== + dependencies: + brotli "^1.3.2" + +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" + +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +cheerio@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" + integrity sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^4.1.0" + optionalDependencies: + jsdom "^7.0.2" + +cheerio@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +cheerio@1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + +chokidar@3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^2.0.0: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-kit@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/cli-kit/-/cli-kit-1.9.2.tgz#f0984d33f80bf5dcba8b1711bfa47c28f6e35938" + integrity sha512-V6BHZgUEkcILME5FRGeyISUs/VibZtXG7QKcis7/RLwJs5uye9cJ/2RUhQ94W9za8UrqvFMlocgid5rVv6s71A== + dependencies: + argv-split "^2.0.1" + fastest-levenshtein "^1.0.12" + fs-extra "^9.0.1" + hook-emitter "^4.1.1" + lodash.camelcase "^4.3.0" + pkg-dir "^5.0.0" + pluralize "^8.0.0" + semver "^7.3.4" + snooplogg "^3.0.1" + source-map-support "^0.5.19" + which "^2.0.2" + ws "^7.4.2" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-logger@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + integrity sha1-2bIt0dlz4Waxi/MT+fSBu6TfIBg= + +color-logger@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.6.tgz#e56245ef29822657110c7cb75a9cd786cb69ed1b" + integrity sha1-5WJF7ymCJlcRDHy3WpzXhstp7Rs= + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + +convert-source-map@^1.0.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" + integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +"cssstyle@>= 0.2.29 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= + dependencies: + cssom "0.3.x" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= + +debug-fabulous@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" + integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg== + dependencies: + debug "3.X" + memoizee "0.4.X" + object-assign "4.X" + +debug@3.X: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + dependencies: + strip-bom "^4.0.0" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + integrity sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U= + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-newline@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +diff@4.0.2, diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= + dependencies: + domelementtype "1" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5, domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-props@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +electron-to-chromium@^1.3.723: + version "1.3.738" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.738.tgz#aec24b091c82acbfabbdcce08076a703941d17ca" + integrity sha512-vCMf4gDOpEylPSLPLSwAEsz+R3ShP02Y3cAKMZvTqule3XcPp7tgc/0ESI7IS6ZeyBlGClE50N53fIOkcIVnpw== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.3.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz#c89b0c34f17f931902ef2913a125d4b825b49b6f" + integrity sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.6.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esdoc-accessor-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" + integrity sha1-eRukhy5sQDUVznSbE0jW8Ck62es= + +esdoc-brand-plugin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esdoc-brand-plugin/-/esdoc-brand-plugin-1.0.1.tgz#7c0e1ae90e84c30b2d3369d3a6449f9dc9f8d511" + integrity sha512-Yv9j3M7qk5PSLmSeD6MbPsfIsEf8K43EdH8qZpE/GZwnJCRVmDPrZJ1cLDj/fPu6P35YqgcEaJK4E2NL/CKA7g== + dependencies: + cheerio "0.22.0" + +esdoc-coverage-plugin@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc-coverage-plugin/-/esdoc-coverage-plugin-1.1.0.tgz#3869869cd7f87891f972625787695a299aece45c" + integrity sha1-OGmGnNf4eJH5cmJXh2laKZrs5Fw= + +esdoc-ecmascript-proposal-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-ecmascript-proposal-plugin/-/esdoc-ecmascript-proposal-plugin-1.0.0.tgz#390dc5656ba8a2830e39dba3570d79138df2ffd9" + integrity sha1-OQ3FZWuoooMOOdujVw15E43y/9k= + +esdoc-external-ecmascript-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-external-ecmascript-plugin/-/esdoc-external-ecmascript-plugin-1.0.0.tgz#78f565d4a0c5185ac63152614dce1fe1a86688db" + integrity sha1-ePVl1KDFGFrGMVJhTc4f4ahmiNs= + dependencies: + fs-extra "1.0.0" + +esdoc-integrate-manual-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-integrate-manual-plugin/-/esdoc-integrate-manual-plugin-1.0.0.tgz#1854a6aa1c081035d7c8c51e3bdd4fb65aa4711c" + integrity sha1-GFSmqhwIEDXXyMUeO91PtlqkcRw= + +esdoc-integrate-test-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-integrate-test-plugin/-/esdoc-integrate-test-plugin-1.0.0.tgz#e2d0d00090f7f0c35e5d2f2c033327a79e53e409" + integrity sha1-4tDQAJD38MNeXS8sAzMnp55T5Ak= + +esdoc-lint-plugin@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/esdoc-lint-plugin/-/esdoc-lint-plugin-1.0.2.tgz#4962930c6dc5b25d80cf6eff1b0f3c24609077f7" + integrity sha512-24AYqD2WbZI9We02I7/6dzAa7yUliRTFUaJCZAcYJMQicJT5gUrNFVaI8XmWEN/mhF3szIn1uZBNWeLul4CmNw== + +esdoc-publish-html-plugin@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/esdoc-publish-html-plugin/-/esdoc-publish-html-plugin-1.1.2.tgz#bdece7bc7a0a3e419933503252db7a6772879dab" + integrity sha512-hG1fZmTcEp3P/Hv/qKiMdG1qSp8MjnVZMMkxL5P5ry7I2sX0HQ4P9lt2lms+90Lt0r340HHhSuVx107UL7dphg== + dependencies: + babel-generator "6.11.4" + cheerio "0.22.0" + escape-html "1.0.3" + fs-extra "1.0.0" + ice-cap "0.0.4" + marked "0.3.19" + taffydb "2.7.2" + +esdoc-standard-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-standard-plugin/-/esdoc-standard-plugin-1.0.0.tgz#661201cac7ef868924902446fdac1527253c5d4d" + integrity sha1-ZhIBysfvhokkkCRG/awVJyU8XU0= + dependencies: + esdoc-accessor-plugin "^1.0.0" + esdoc-brand-plugin "^1.0.0" + esdoc-coverage-plugin "^1.0.0" + esdoc-external-ecmascript-plugin "^1.0.0" + esdoc-integrate-manual-plugin "^1.0.0" + esdoc-integrate-test-plugin "^1.0.0" + esdoc-lint-plugin "^1.0.0" + esdoc-publish-html-plugin "^1.0.0" + esdoc-type-inference-plugin "^1.0.0" + esdoc-undocumented-identifier-plugin "^1.0.0" + esdoc-unexported-identifier-plugin "^1.0.0" + +esdoc-type-inference-plugin@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/esdoc-type-inference-plugin/-/esdoc-type-inference-plugin-1.0.2.tgz#916e3f756de1d81d9c0dbe1c008e8dafd322cfaf" + integrity sha512-tMIcEHNe1uhUGA7lT1UTWc9hs2dzthnTgmqXpmeUhurk7fL2tinvoH+IVvG/sLROzwOGZQS9zW/F9KWnpMzLIQ== + +esdoc-undocumented-identifier-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-undocumented-identifier-plugin/-/esdoc-undocumented-identifier-plugin-1.0.0.tgz#82e05d371c32d12871140f1d5c81ec99fd9cc2c8" + integrity sha1-guBdNxwy0ShxFA8dXIHsmf2cwsg= + +esdoc-unexported-identifier-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-unexported-identifier-plugin/-/esdoc-unexported-identifier-plugin-1.0.0.tgz#1f9874c6a7c2bebf9ad397c3ceb75c9c69dabab1" + integrity sha1-H5h0xqfCvr+a05fDzrdcnGnaurE= + +esdoc@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-1.1.0.tgz#07d40ebf791764cd537929c29111e20a857624f3" + integrity sha512-vsUcp52XJkOWg9m1vDYplGZN2iDzvmjDL5M/Mp8qkoDG3p2s0yIQCIjKR5wfPBaM3eV14a6zhQNYiNTCVzPnxA== + dependencies: + babel-generator "6.26.1" + babel-traverse "6.26.0" + babylon "6.18.0" + cheerio "1.0.0-rc.2" + color-logger "0.0.6" + escape-html "1.0.3" + fs-extra "5.0.0" + ice-cap "0.0.4" + marked "0.3.19" + minimist "1.2.0" + taffydb "2.7.3" + +eslint-config-axway@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-axway/-/eslint-config-axway-5.0.0.tgz#beea66ebd46a94d294045557bc387d64b6861c52" + integrity sha512-r7GqGGJI68vD8foYLE6qCXNVTn44LGWjJkwNg4nQHvjWT5MDamd4PofXBtPTfFOtp4rY38bDH+S5pvwef71ovA== + dependencies: + eslint-plugin-chai-expect "^2.1.0" + eslint-plugin-import "^2.20.2" + eslint-plugin-node "^11.1.0" + eslint-plugin-promise "^4.2.1" + eslint-plugin-security "^1.4.0" + find-root "^1.1.0" + semver "^7.3.2" + +eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-chai-expect@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-2.2.0.tgz#ff41fb00067fe6ff26e72b04ab1011ecaf3cb249" + integrity sha512-ExTJKhgeYMfY8wDj3UiZmgpMKJOUHGNHmWMlxT49JUDB1vTnw0sSNfXJSxnX+LcebyBD/gudXzjzD136WqPJrQ== + +eslint-plugin-chai-friendly@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.6.0.tgz#54052fab79302ed0cea76ab997351ea4809bfb77" + integrity sha512-Uvvv1gkbRGp/qfN15B0kQyQWg+oFA8buDSqrwmW3egNSk/FpqH2MjQqKOuKwmEL6w4QIQrIjDp+gg6kGGmD3oQ== + +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.20.2: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== + dependencies: + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.4" + eslint-module-utils "^2.6.0" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.1" + read-pkg-up "^2.0.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" + +eslint-plugin-mocha@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-8.0.0.tgz#7ec5d228bcb3735301701dfbc3376320a1ca3791" + integrity sha512-n67etbWDz6NQM+HnTwZHyBwz/bLlYPOxUbw7bPuCyFujv7ZpaT/Vn6KTAbT02gf7nRljtYIjWcTxK/n8a57rQQ== + dependencies: + eslint-utils "^2.1.0" + ramda "^0.27.1" + +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-security@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz#d4f314484a80b1b613b8c8886e84f52efe1526c2" + integrity sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA== + dependencies: + safe-regex "^1.1.0" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@^6.0.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +eslint@^7.17.0: + version "7.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.17.0.tgz#4ccda5bf12572ad3bf760e6f195886f50569adb0" + integrity sha512-zJk08MiBgwuGoxes5sSQhOtibZ75pz0J35XTRlZOk9xMffhpA9BTbQZxoXZzOl5zMbleShbGwtw+1kGferfFwQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^6.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.4" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1, esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +events@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fancy-log@^1.1.0, fancy-log@^1.2.0, fancy-log@^1.3.2, fancy-log@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz#e6a754cc8f15e58987aa9cbd27af66fd6f4e5af9" + integrity sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk= + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-entry-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" + integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + dependencies: + flat-cache "^3.0.4" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatted@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" + integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + +flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + +fs-extra@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob-watcher@^5.0.3: + version "5.0.5" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.5.tgz#aa6bce648332924d9a8489be41e3e5c52d4186dc" + integrity sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw== + dependencies: + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + normalize-path "^3.0.0" + object.defaults "^1.1.0" + +glob@7.1.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +glogg@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== + dependencies: + sparkles "^1.0.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +gulp-babel@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-8.0.0.tgz#e0da96f4f2ec4a88dd3a3030f476e38ab2126d87" + integrity sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ== + dependencies: + plugin-error "^1.0.1" + replace-ext "^1.0.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-chug@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/gulp-chug/-/gulp-chug-0.5.1.tgz#b1918881b2bb52fd47e3cb2371587fca4c45e5c6" + integrity sha1-sZGIgbK7Uv1H48sjcVh/ykxF5cY= + dependencies: + gulp-util "^3.0.7" + lodash "^4.0.0" + resolve "^1.1.6" + through2 "^2.0.0" + +gulp-cli@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" + integrity sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.4.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.2.0" + yargs "^7.1.0" + +gulp-debug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-debug/-/gulp-debug-4.0.0.tgz#036f9539c3fb6af720e01a9ea5c195fc73f29d5b" + integrity sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g== + dependencies: + chalk "^2.3.0" + fancy-log "^1.3.2" + plur "^3.0.0" + stringify-object "^3.0.0" + through2 "^2.0.0" + tildify "^1.1.2" + +gulp-eslint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-6.0.0.tgz#7d402bb45f8a67652b868277011812057370a832" + integrity sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig== + dependencies: + eslint "^6.0.0" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + +gulp-load-plugins@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/gulp-load-plugins/-/gulp-load-plugins-2.0.6.tgz#e4d34b614de93775ad2ed80fd145dcf1eaba0482" + integrity sha512-HP5jUhPzvib37kWYLFvhDQJpBar2pXG7diFOFI4/PgCrQWobV5/MfnU0dMx0d5NfyJGcRrpUI1E0MROlLvNO4A== + dependencies: + array-unique "^0.3.2" + fancy-log "^1.2.0" + findup-sync "^4.0.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + micromatch "^4.0.2" + resolve "^1.17.0" + +gulp-plumber@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.1.tgz#d38700755a300b9d372318e4ffb5ff7ced0b2c84" + integrity sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ== + dependencies: + chalk "^1.1.3" + fancy-log "^1.3.2" + plugin-error "^0.1.2" + through2 "^2.0.3" + +gulp-sourcemaps@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-3.0.0.tgz#2e154e1a2efed033c0e48013969e6f30337b2743" + integrity sha512-RqvUckJkuYqy4VaIH60RMal4ZtG0IbQ6PXMNkNsshEGJ9cldUPRb/YCgboYae+CLAs1HQNb4ADTKCx65HInquQ== + dependencies: + "@gulp-sourcemaps/identity-map" "^2.0.1" + "@gulp-sourcemaps/map-sources" "^1.0.0" + acorn "^6.4.1" + convert-source-map "^1.0.0" + css "^3.0.0" + debug-fabulous "^1.0.0" + detect-newline "^2.0.0" + graceful-fs "^4.0.0" + source-map "^0.6.0" + strip-bom-string "^1.0.0" + through2 "^2.0.0" + +gulp-util@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" + integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== + dependencies: + glob-watcher "^5.0.3" + gulp-cli "^2.2.0" + undertaker "^1.2.1" + vinyl-fs "^3.0.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= + dependencies: + glogg "^1.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= + dependencies: + sparkles "^1.0.0" + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hook-emitter@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/hook-emitter/-/hook-emitter-4.1.1.tgz#b0c5a14d99382d64cad7f3ddb48a3a85e746793a" + integrity sha512-atobP7v7JN3Q4exr9L88YyEWjtFD9Ua31tlUckjBtn5/vHcYlXrEupZmF38SSAZpQlyC/tY5MR0Aq1xrEcKVMg== + dependencies: + source-map-support "^0.5.19" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +ice-cap@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + integrity sha1-im0xq0ysjUtW3k+pRt8zUlYbbhg= + dependencies: + cheerio "0.20.0" + color-logger "0.0.3" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +interpret@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +irregular-plurals@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" + integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + +is-negative-zero@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" + integrity sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.0" + istanbul-lib-coverage "^3.0.0-alpha.1" + make-dir "^3.0.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^3.3.3" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-worker@^26.6.1: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@3.14.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^7.0.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + integrity sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4= + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.29 < 0.3.0" + escodegen "^1.6.1" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^2.0.0" + whatwg-url-compat "~0.6.5" + xml-name-validator ">= 2.0.1 < 3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + +just-extend@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" + integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +liftoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + dependencies: + extend "^3.0.0" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.1.0.tgz#f70bc0c29edbabdf2043e7ee73ccc3fe1c96b42d" + integrity sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA== + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= + dependencies: + lodash._root "^3.0.0" + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.merge@^4.4.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.2.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +marked@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== + +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + +memoizee@0.4.X: + version "0.4.14" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mocha-jenkins-reporter@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/mocha-jenkins-reporter/-/mocha-jenkins-reporter-0.4.5.tgz#d12865e0d991afbaa1d011b966195ebb8936850f" + integrity sha512-QoKXaxWz3gpzCBgfaqu2OZKVyibAwRTD/BF7ApMfNgafzzch9s8hMNVPTxRom9smmUAfaDfzARWKvrQMK7XACA== + dependencies: + diff "4.0.1" + mkdirp "^0.5.4" + xml "^1.0.1" + +mocha@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.1.tgz#f2fa68817ed0e53343d989df65ccd358bc3a4b39" + integrity sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.4.3" + debug "4.2.0" + diff "4.0.2" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.6" + growl "1.10.5" + he "1.2.0" + js-yaml "3.14.0" + log-symbols "4.0.0" + minimatch "3.0.4" + ms "2.1.2" + nanoid "3.1.12" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "7.2.0" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.0.2" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= + dependencies: + duplexer2 "0.0.2" + +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanobuffer@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/nanobuffer/-/nanobuffer-1.1.7.tgz#d81b71411c1dc47af58c4c5f864cd2b0eb0bf404" + integrity sha512-LP1JYWQh4qFmpLaauE3mWuOjGJSxts+wnYeTlSb4zurdn8xIhJ906oyb7M7Ih6EiImaUskFdHfYx9gyijf1FLA== + dependencies: + source-map-support "^0.5.19" + +nanoid@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +napi-macros@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^6.0.0" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gyp-build@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + +node-ios-device@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-ios-device/-/node-ios-device-3.1.1.tgz#a242fa0e38487d47f1bd50717e7b2d49845d995a" + integrity sha512-HO+leQf9x7WVs3SWcvPce3q3oIDEVMZAdPgBfZhsVdPuR7Hf/9B7KbnDQStzgcQbvvmcVbIfX0B+qHLvV87U2Q== + dependencies: + cli-kit "^1.9.2" + napi-macros "^2.0.0" + node-gyp-build "^4.2.3" + snooplogg "^3.0.2" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== + +nyc@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@4.X: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.0.4, object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.defaults@^1.0.0, object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.values@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has "^1.0.3" + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1, optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + +plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plur@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b" + integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w== + dependencies: + irregular-plurals "^2.0.0" + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss@^7.0.16: + version "7.0.35" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" + integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-limit@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/promise-limit/-/promise-limit-2.7.0.tgz#eb5737c33342a030eaeaecea9b3d3a93cb592b26" + integrity sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw== + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +ramda@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@2 || 3", readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + dependencies: + es6-error "^4.0.1" + +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + integrity sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw= + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= + +replace-ext@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== + +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + +request@^2.55.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.4.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.1.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@5.0.1, serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +simple-plist@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.1.1.tgz#54367ca28bc5996a982c325c1c4a4c1a05f4047c" + integrity sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg== + dependencies: + bplist-creator "0.0.8" + bplist-parser "0.2.0" + plist "^3.0.1" + +sinon-chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.5.0.tgz#c9a78304b0e15befe57ef68e8a85a00553f5c60e" + integrity sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg== + +sinon@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.2.tgz#b83cf5d43838f99cfa3644453f4c7db23e7bd535" + integrity sha512-9Owi+RisvCZpB0bdOVFfL314I6I4YoRlz6Isi4+fr8q8YQsDPoCe5UnmNtKHRThX3negz2bXHWIuiPa42vM8EQ== + dependencies: + "@sinonjs/commons" "^1.8.1" + "@sinonjs/fake-timers" "^6.0.1" + "@sinonjs/formatio" "^5.0.1" + "@sinonjs/samsam" "^5.3.0" + diff "^4.0.2" + nise "^4.0.4" + supports-color "^7.1.0" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +snooplogg@^3.0.1, snooplogg@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/snooplogg/-/snooplogg-3.0.2.tgz#86f38bd06254c90c91e3df565face959e16b976e" + integrity sha512-WIeAbTRd64HEtkdoqwK8i9A+anSp1FZXai31fxBzcW8ESvg9wsBuD8+XPVNpX4i6ASUqH73NvXOUVeXzEb0Bcg== + dependencies: + bryt "^1.0.2" + chalk "^4.1.0" + nanobuffer "^1.1.7" + source-map-support "^0.5.19" + supports-color "^8.1.0" + +source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== + dependencies: + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-buffers@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= + +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-json-comments@3.1.1, strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@7.2.0, supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.0.tgz#7f8e6d289ded5a27b7f1b76f6a68cf7ad48cdf0e" + integrity sha512-7McmmMM5pLe5fDX7vzhZB1dv4a3ZS0POhSoiNINQ/xSonu3oBWxAstLrtgj/rUq0pIGo3AU0ZhLUxy5u20EamA== + dependencies: + has-flag "^4.0.0" + +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +"symbol-tree@>= 3.1.0 < 4.0.0": + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +table@^6.0.4: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +taffydb@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" + integrity sha1-e/gQalwaSCUbPjvAoOFzJIn9Dcg= + +taffydb@2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.3.tgz#2ad37169629498fca5bc84243096d3cde0ec3a34" + integrity sha1-KtNxaWKUmPylvIQkMJbTzeDsOjQ= + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== + +terser-webpack-plugin@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz#ec60542db2421f45735c719d2e17dabfbb2e3e42" + integrity sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ== + dependencies: + jest-worker "^26.6.1" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.8" + +terser@^5.3.8: + version "5.5.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" + integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== + dependencies: + inherits "^2.0.4" + readable-stream "2 || 3" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tildify@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timers-ext@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + +tough-cookie@^2.2.0, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.1: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tsconfig-paths@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.0, type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.3.0.tgz#363a6e541f27954d5791d6fa3c1d321666f86d18" + integrity sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg== + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + fast-levenshtein "^1.0.0" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2, uuid@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +v8flags@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + dependencies: + homedir-polyfill "^1.0.1" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= + dependencies: + source-map "^0.5.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" + integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +watchpack@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.0.tgz#e63194736bf3aa22026f7b191cd57907b0f9f696" + integrity sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + integrity sha1-O/glj30xjHRDw28uFpQCoaZwNQY= + +webpack-sources@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" + integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack@^5.11.1: + version "5.11.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.11.1.tgz#39b2b9daeb5c6c620e03b7556ec674eaed4016b4" + integrity sha512-tNUIdAmYJv+nupRs/U/gqmADm6fgrf5xE+rSlSsf2PgsGO7j2WG7ccU6AWNlOJlHFl+HnmXlBmHIkiLf+XA9mQ== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.45" + "@webassemblyjs/ast" "1.9.1" + "@webassemblyjs/helper-module-context" "1.9.1" + "@webassemblyjs/wasm-edit" "1.9.1" + "@webassemblyjs/wasm-parser" "1.9.1" + acorn "^8.0.4" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.3.1" + eslint-scope "^5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.1.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + pkg-dir "^5.0.0" + schema-utils "^3.0.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.0.3" + watchpack "^2.0.0" + webpack-sources "^2.1.1" + +whatwg-url-compat@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + integrity sha1-AImBEa9om7CXVBzVpFymyHmERb8= + dependencies: + tr46 "~0.0.1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@2.0.2, which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" + integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q== + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== + +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= + +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldom@0.1.x: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +xtend@~4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@5.0.0-security.0: + version "5.0.0-security.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz#4ff7271d25f90ac15643b86076a2ab499ec9ee24" + integrity sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ== + dependencies: + camelcase "^3.0.0" + object.assign "^4.1.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.1.tgz#67f0ef52e228d4ee0d6311acede8850f53464df6" + integrity sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g== + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "5.0.0-security.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==