From b84afe6e96c0236b9166abf59ab413eedacd6153 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Tue, 6 Nov 2018 14:09:11 +0100 Subject: [PATCH 01/10] Extract CLI out and fix call-sites (some of them) --- Libraries/Image/AssetSourceResolver.js | 2 +- jest/hasteImpl.js | 2 +- local-cli/.npmignore | 2 - local-cli/__mocks__/beeper.js | 15 - local-cli/__mocks__/fs.js | 61 - local-cli/__mocks__/path.js | 22 - local-cli/bundle/__mocks__/sign.js | 16 - .../filterPlatformAssetScales-test.js | 42 - .../__tests__/getAssetDestPathAndroid-test.js | 75 - .../__tests__/getAssetDestPathIOS-test.js | 45 - local-cli/bundle/assetPathUtils.js | 85 - local-cli/bundle/buildBundle.js | 78 - local-cli/bundle/bundle.js | 34 - local-cli/bundle/bundleCommandLineArgs.js | 96 -- local-cli/bundle/filterPlatformAssetScales.js | 46 - local-cli/bundle/getAssetDestPathAndroid.js | 27 - local-cli/bundle/getAssetDestPathIOS.js | 23 - local-cli/bundle/ramBundle.js | 34 - local-cli/bundle/saveAssets.js | 84 - local-cli/bundle/types.flow.js | 13 - local-cli/cli.js | 19 +- local-cli/cliEntry.js | 169 -- local-cli/commands.js | 79 - local-cli/core/Constants.js | 20 - local-cli/core/__fixtures__/android.js | 93 - local-cli/core/__fixtures__/commands.js | 27 - local-cli/core/__fixtures__/dependencies.js | 36 - .../files/AndroidManifest-debug.xml | 3 - .../__fixtures__/files/AndroidManifest.xml | 4 - local-cli/core/__fixtures__/files/Main.java | 15 - .../core/__fixtures__/files/ReactPackage.java | 34 - .../core/__fixtures__/files/ReactPackage.kt | 26 - .../core/__fixtures__/files/package.json | 62 - .../core/__fixtures__/files/project.pbxproj | 804 --------- local-cli/core/__fixtures__/ios.js | 32 - local-cli/core/__fixtures__/projects.js | 37 - .../android/findAndroidAppFolder.spec.js | 43 - .../__tests__/android/findManifest.spec.js | 37 - .../android/findPackageClassName.spec.js | 58 - .../android/getDependencyConfig.spec.js | 62 - .../android/getProjectConfig.spec.js | 89 - .../__tests__/android/readManifest.spec.js | 45 - local-cli/core/__tests__/findAssets.spec.js | 43 - local-cli/core/__tests__/findPlugins.spec.js | 84 - .../__tests__/ios/findPodfilePath.spec.js | 31 - .../__tests__/ios/findPodspecName.spec.js | 55 - .../core/__tests__/ios/findProject.spec.js | 94 -- .../__tests__/ios/getProjectConfig.spec.js | 52 - local-cli/core/__tests__/makeCommand.spec.js | 47 - .../core/android/findAndroidAppFolder.js | 32 - local-cli/core/android/findManifest.js | 28 - .../core/android/findPackageClassName.js | 31 - local-cli/core/android/index.js | 136 -- local-cli/core/android/readManifest.js | 21 - local-cli/core/findAssets.js | 32 - local-cli/core/findPlugins.js | 133 -- local-cli/core/index.js | 174 -- local-cli/core/ios/findPodfilePath.js | 20 - local-cli/core/ios/findPodspecName.js | 34 - local-cli/core/ios/findProject.js | 61 - local-cli/core/ios/index.js | 62 - local-cli/core/makeCommand.js | 38 - local-cli/core/wrapCommands.js | 20 - local-cli/dependencies/dependencies.js | 111 -- local-cli/eject/eject.js | 111 -- .../copyProjectTemplateAndReplace.js | 178 -- local-cli/generator/printRunInstructions.js | 39 - local-cli/generator/promptSync.js | 144 -- local-cli/generator/templates.js | 199 --- local-cli/info/info.js | 85 - local-cli/init/init.js | 122 -- local-cli/install/install.js | 44 - local-cli/install/uninstall.js | 44 - local-cli/library/library.js | 87 - local-cli/link/__fixtures__/Info.plist | 12 - .../android/0.17/MainActivity.java | 85 - .../android/0.17/patchedMainActivity.java | 87 - .../android/0.18/MainActivity.java | 46 - .../android/0.18/patchedMainActivity.java | 48 - .../android/0.20/MainActivity.java | 47 - .../link/__fixtures__/android/build.gradle | 12 - .../__fixtures__/android/patchedBuild.gradle | 16 - .../android/patchedSettings.gradle | 12 - .../link/__fixtures__/android/settings.gradle | 10 - .../link/__fixtures__/linearGradient.pbxproj | 258 --- .../link/__fixtures__/pods/PodfileSimple | 8 - .../__fixtures__/pods/PodfileWithFunction | 30 - .../link/__fixtures__/pods/PodfileWithMarkers | 34 - .../link/__fixtures__/pods/PodfileWithTarget | 32 - local-cli/link/__fixtures__/project.pbxproj | 1011 ----------- .../link/__tests__/android/applyPatch.spec.js | 25 - .../__tests__/android/isInstalled.spec.js | 31 - .../__tests__/android/makeBuildPatch.spec.js | 52 - .../__tests__/android/makeImportPatch.spec.js | 29 - .../android/makePackagePatch.spec.js | 35 - .../android/makeSettingsPatch.spec.js | 83 - .../android/makeStringsPatch.spec.js | 29 - .../android/normalizeProjectName.spec.js | 23 - .../__tests__/getDependencyConfig.spec.js | 34 - .../__tests__/getProjectDependencies.spec.js | 35 - .../link/__tests__/groupFilesByType.spec.js | 25 - .../__tests__/ios/addFileToProject.spec.js | 36 - .../ios/addProjectToLibraries.spec.js | 38 - .../__tests__/ios/addSharedLibraries.spec.js | 51 - .../link/__tests__/ios/createGroup.spec.js | 57 - .../__tests__/ios/getBuildProperty.spec.js | 30 - local-cli/link/__tests__/ios/getGroup.spec.js | 49 - .../__tests__/ios/getHeaderSearchPath.spec.js | 110 -- .../__tests__/ios/getHeadersInFolder.spec.js | 48 - local-cli/link/__tests__/ios/getPlist.spec.js | 32 - .../link/__tests__/ios/getPlistPath.spec.js | 30 - .../link/__tests__/ios/getTargets.spec.js | 32 - .../__tests__/ios/hasLibraryImported.spec.js | 35 - .../link/__tests__/ios/isInstalled.spec.js | 39 - .../ios/mapHeaderSearchPaths.spec.js | 47 - .../ios/removeProjectFromLibraries.js | 44 - .../ios/removeProjectFromProject.spec.js | 45 - .../__tests__/ios/removeSharedLibrary.spec.js | 43 - .../link/__tests__/ios/writePlist.spec.js | 62 - local-cli/link/__tests__/link.spec.js | 249 --- .../__tests__/pods/findLineToAddPod.spec.js | 50 - .../pods/findMarkedLinesInPodfile.spec.js | 43 - .../__tests__/pods/findPodTargetLine.spec.js | 34 - .../link/__tests__/pods/isInstalled.spec.js | 42 - .../__tests__/pods/removePodEntry.spec.js | 52 - .../link/__tests__/promiseWaterfall.spec.js | 48 - local-cli/link/android/copyAssets.js | 29 - local-cli/link/android/fs.js | 17 - local-cli/link/android/index.js | 18 - local-cli/link/android/isInstalled.js | 16 - local-cli/link/android/patches/applyParams.js | 18 - local-cli/link/android/patches/applyPatch.js | 19 - .../link/android/patches/makeBuildPatch.js | 23 - .../link/android/patches/makeImportPatch.js | 15 - .../link/android/patches/makePackagePatch.js | 19 - .../link/android/patches/makeSettingsPatch.js | 31 - .../link/android/patches/makeStringsPatch.js | 27 - .../android/patches/normalizeProjectName.js | 12 - local-cli/link/android/patches/revokePatch.js | 17 - .../link/android/registerNativeModule.js | 42 - local-cli/link/android/unlinkAssets.js | 33 - .../link/android/unregisterNativeModule.js | 53 - local-cli/link/commandStub.js | 10 - local-cli/link/getDependencyConfig.js | 26 - local-cli/link/getProjectDependencies.js | 20 - local-cli/link/groupFilesByType.js | 36 - local-cli/link/ios/addFileToProject.js | 23 - local-cli/link/ios/addProjectToLibraries.js | 22 - local-cli/link/ios/addSharedLibraries.js | 25 - local-cli/link/ios/addToHeaderSearchPaths.js | 14 - local-cli/link/ios/common/isInstalled.js | 18 - .../link/ios/common/registerNativeModule.js | 24 - .../link/ios/common/unregisterNativeModule.js | 30 - local-cli/link/ios/copyAssets.js | 51 - local-cli/link/ios/createGroup.js | 34 - local-cli/link/ios/createGroupWithMessage.js | 34 - local-cli/link/ios/getBuildProperty.js | 31 - local-cli/link/ios/getGroup.js | 44 - local-cli/link/ios/getHeaderSearchPath.js | 62 - local-cli/link/ios/getHeadersInFolder.js | 32 - local-cli/link/ios/getPlist.js | 27 - local-cli/link/ios/getPlistPath.js | 24 - local-cli/link/ios/getTargets.js | 37 - local-cli/link/ios/hasLibraryImported.js | 20 - local-cli/link/ios/index.js | 18 - local-cli/link/ios/isInstalled.js | 27 - local-cli/link/ios/mapHeaderSearchPaths.js | 48 - local-cli/link/ios/registerNativeModule.js | 87 - .../link/ios/removeFromHeaderSearchPaths.js | 19 - .../removeFromPbxItemContainerProxySection.js | 28 - .../ios/removeFromPbxReferenceProxySection.js | 24 - .../link/ios/removeFromProjectReferences.js | 37 - .../link/ios/removeFromStaticLibraries.js | 30 - local-cli/link/ios/removeProductGroup.js | 20 - .../link/ios/removeProjectFromLibraries.js | 21 - .../link/ios/removeProjectFromProject.js | 35 - local-cli/link/ios/removeSharedLibraries.js | 20 - local-cli/link/ios/unlinkAssets.js | 62 - local-cli/link/ios/unregisterNativeModule.js | 75 - local-cli/link/ios/writePlist.js | 33 - local-cli/link/link.js | 186 -- local-cli/link/pods/addPodEntry.js | 35 - local-cli/link/pods/findLineToAddPod.js | 34 - .../link/pods/findMarkedLinesInPodfile.js | 21 - local-cli/link/pods/findPodTargetLine.js | 26 - local-cli/link/pods/isInstalled.js | 31 - local-cli/link/pods/readPodfile.js | 17 - local-cli/link/pods/registerNativeModule.js | 38 - local-cli/link/pods/removePodEntry.js | 21 - local-cli/link/pods/savePodFile.js | 17 - local-cli/link/pods/unregisterNativeModule.js | 22 - local-cli/link/pollParams.js | 19 - local-cli/link/promiseWaterfall.js | 23 - local-cli/link/promisify.js | 13 - local-cli/link/unlink.js | 167 -- local-cli/logAndroid/logAndroid.js | 53 - local-cli/logIOS/logIOS.js | 91 - local-cli/runAndroid/adb.js | 49 - local-cli/runAndroid/runAndroid.js | 491 ------ .../__tests__/findMatchingSimulator-test.js | 717 -------- .../runIOS/__tests__/findXcodeProject-test.js | 65 - .../__tests__/parseIOSDevicesList-test.js | 48 - local-cli/runIOS/findMatchingSimulator.js | 93 - local-cli/runIOS/findXcodeProject.js | 43 - local-cli/runIOS/parseIOSDevicesList.js | 38 - local-cli/runIOS/runIOS.js | 455 ----- local-cli/server/checkNodeVersion.js | 46 - .../server/middleware/MiddlewareManager.js | 71 - .../middleware/copyToClipBoardMiddleware.js | 29 - .../middleware/getDevToolsMiddleware.js | 70 - .../getSecurityHeadersMiddleware.js | 27 - local-cli/server/middleware/index.html | 10 - local-cli/server/middleware/indexPage.js | 21 - .../middleware/loadRawBodyMiddleware.js | 23 - .../openStackFrameInEditorMiddleware.js | 24 - .../server/middleware/statusPageMiddleware.js | 22 - .../middleware/systraceProfileMiddleware.js | 32 - local-cli/server/middleware/unless.js | 20 - local-cli/server/runServer.js | 129 -- local-cli/server/server.js | 129 -- local-cli/server/util/copyToClipBoard.js | 41 - .../server/util/debugger-ui/DeltaPatcher.js | 127 -- .../server/util/debugger-ui/debuggerWorker.js | 86 - .../util/debugger-ui/deltaUrlToBlobUrl.js | 75 - local-cli/server/util/debugger-ui/index.html | 280 --- local-cli/server/util/external/xsel | Bin 129416 -> 0 bytes local-cli/server/util/jsPackagerClient.js | 122 -- local-cli/server/util/launchChrome.js | 62 - local-cli/server/util/launchEditor.js | 247 --- local-cli/server/util/messageSocket.js | 235 --- local-cli/server/util/webSocketProxy.js | 75 - local-cli/setup_env.bat | 4 - local-cli/setup_env.sh | 8 - local-cli/templates/HelloWorld/App.js | 50 - .../templates/HelloWorld/__tests__/App.js | 15 - local-cli/templates/HelloWorld/_babelrc | 3 - local-cli/templates/HelloWorld/_buckconfig | 6 - local-cli/templates/HelloWorld/_flowconfig | 70 - local-cli/templates/HelloWorld/_gitattributes | 1 - local-cli/templates/HelloWorld/_gitignore | 56 - .../templates/HelloWorld/_watchmanconfig | 1 - .../templates/HelloWorld/android/app/_BUCK | 55 - .../HelloWorld/android/app/build.gradle | 147 -- .../HelloWorld/android/app/build_defs.bzl | 19 - .../HelloWorld/android/app/proguard-rules.pro | 17 - .../android/app/src/main/AndroidManifest.xml | 27 - .../java/com/helloworld/MainActivity.java | 15 - .../java/com/helloworld/MainApplication.java | 45 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3056 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5024 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2096 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2858 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4569 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7098 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6464 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10676 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9250 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15523 -> 0 bytes .../app/src/main/res/values/strings.xml | 3 - .../app/src/main/res/values/styles.xml | 8 - .../templates/HelloWorld/android/build.gradle | 39 - .../HelloWorld/android/gradle.properties | 18 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - .../templates/HelloWorld/android/gradlew | 172 -- .../templates/HelloWorld/android/gradlew.bat | 84 - .../HelloWorld/android/keystores/_BUCK | 8 - .../keystores/debug.keystore.properties | 4 - .../HelloWorld/android/settings.gradle | 3 - local-cli/templates/HelloWorld/app.json | 4 - local-cli/templates/HelloWorld/index.js | 10 - .../HelloWorld/ios/HelloWorld-tvOS/Info.plist | 54 - .../ios/HelloWorld-tvOSTests/Info.plist | 24 - .../ios/HelloWorld.xcodeproj/project.pbxproj | 1502 ----------------- .../xcschemes/HelloWorld-tvOS.xcscheme | 129 -- .../xcschemes/HelloWorld.xcscheme | 129 -- .../HelloWorld/ios/HelloWorld/AppDelegate.h | 14 - .../HelloWorld/ios/HelloWorld/AppDelegate.m | 35 - .../HelloWorld/Base.lproj/LaunchScreen.xib | 42 - .../AppIcon.appiconset/Contents.json | 38 - .../HelloWorld/Images.xcassets/Contents.json | 6 - .../HelloWorld/ios/HelloWorld/Info.plist | 60 - .../HelloWorld/ios/HelloWorld/main.m | 16 - .../ios/HelloWorldTests/HelloWorldTests.m | 68 - .../HelloWorld/ios/HelloWorldTests/Info.plist | 24 - local-cli/templates/README.md | 48 - local-cli/upgrade/upgrade.js | 172 -- local-cli/util/Config.js | 98 -- local-cli/util/PackageManager.js | 74 - local-cli/util/__mocks__/log.js | 13 - .../__tests__/findSymlinkedModules-test.js | 353 ---- local-cli/util/assertRequiredOptions.js | 33 - local-cli/util/copyAndReplace.js | 140 -- local-cli/util/findReactNativeScripts.js | 28 - local-cli/util/findSymlinkedModules.js | 108 -- local-cli/util/findSymlinksPaths.js | 60 - local-cli/util/isPackagerRunning.js | 36 - local-cli/util/isValidPackageName.js | 16 - local-cli/util/log.js | 30 - local-cli/util/parseCommandLine.js | 81 - local-cli/util/walk.js | 27 - local-cli/util/yarn.js | 60 - package.json | 1 + 303 files changed, 5 insertions(+), 19327 deletions(-) delete mode 100644 local-cli/.npmignore delete mode 100644 local-cli/__mocks__/beeper.js delete mode 100644 local-cli/__mocks__/fs.js delete mode 100644 local-cli/__mocks__/path.js delete mode 100644 local-cli/bundle/__mocks__/sign.js delete mode 100644 local-cli/bundle/__tests__/filterPlatformAssetScales-test.js delete mode 100644 local-cli/bundle/__tests__/getAssetDestPathAndroid-test.js delete mode 100644 local-cli/bundle/__tests__/getAssetDestPathIOS-test.js delete mode 100644 local-cli/bundle/assetPathUtils.js delete mode 100644 local-cli/bundle/buildBundle.js delete mode 100644 local-cli/bundle/bundle.js delete mode 100644 local-cli/bundle/bundleCommandLineArgs.js delete mode 100644 local-cli/bundle/filterPlatformAssetScales.js delete mode 100644 local-cli/bundle/getAssetDestPathAndroid.js delete mode 100644 local-cli/bundle/getAssetDestPathIOS.js delete mode 100644 local-cli/bundle/ramBundle.js delete mode 100644 local-cli/bundle/saveAssets.js delete mode 100644 local-cli/bundle/types.flow.js delete mode 100644 local-cli/cliEntry.js delete mode 100644 local-cli/commands.js delete mode 100644 local-cli/core/Constants.js delete mode 100644 local-cli/core/__fixtures__/android.js delete mode 100644 local-cli/core/__fixtures__/commands.js delete mode 100644 local-cli/core/__fixtures__/dependencies.js delete mode 100644 local-cli/core/__fixtures__/files/AndroidManifest-debug.xml delete mode 100644 local-cli/core/__fixtures__/files/AndroidManifest.xml delete mode 100644 local-cli/core/__fixtures__/files/Main.java delete mode 100644 local-cli/core/__fixtures__/files/ReactPackage.java delete mode 100644 local-cli/core/__fixtures__/files/ReactPackage.kt delete mode 100644 local-cli/core/__fixtures__/files/package.json delete mode 100644 local-cli/core/__fixtures__/files/project.pbxproj delete mode 100644 local-cli/core/__fixtures__/ios.js delete mode 100644 local-cli/core/__fixtures__/projects.js delete mode 100644 local-cli/core/__tests__/android/findAndroidAppFolder.spec.js delete mode 100644 local-cli/core/__tests__/android/findManifest.spec.js delete mode 100644 local-cli/core/__tests__/android/findPackageClassName.spec.js delete mode 100644 local-cli/core/__tests__/android/getDependencyConfig.spec.js delete mode 100644 local-cli/core/__tests__/android/getProjectConfig.spec.js delete mode 100644 local-cli/core/__tests__/android/readManifest.spec.js delete mode 100644 local-cli/core/__tests__/findAssets.spec.js delete mode 100644 local-cli/core/__tests__/findPlugins.spec.js delete mode 100644 local-cli/core/__tests__/ios/findPodfilePath.spec.js delete mode 100644 local-cli/core/__tests__/ios/findPodspecName.spec.js delete mode 100644 local-cli/core/__tests__/ios/findProject.spec.js delete mode 100644 local-cli/core/__tests__/ios/getProjectConfig.spec.js delete mode 100644 local-cli/core/__tests__/makeCommand.spec.js delete mode 100644 local-cli/core/android/findAndroidAppFolder.js delete mode 100644 local-cli/core/android/findManifest.js delete mode 100644 local-cli/core/android/findPackageClassName.js delete mode 100644 local-cli/core/android/index.js delete mode 100644 local-cli/core/android/readManifest.js delete mode 100644 local-cli/core/findAssets.js delete mode 100644 local-cli/core/findPlugins.js delete mode 100644 local-cli/core/index.js delete mode 100644 local-cli/core/ios/findPodfilePath.js delete mode 100644 local-cli/core/ios/findPodspecName.js delete mode 100644 local-cli/core/ios/findProject.js delete mode 100644 local-cli/core/ios/index.js delete mode 100644 local-cli/core/makeCommand.js delete mode 100644 local-cli/core/wrapCommands.js delete mode 100644 local-cli/dependencies/dependencies.js delete mode 100644 local-cli/eject/eject.js delete mode 100644 local-cli/generator/copyProjectTemplateAndReplace.js delete mode 100644 local-cli/generator/printRunInstructions.js delete mode 100644 local-cli/generator/promptSync.js delete mode 100644 local-cli/generator/templates.js delete mode 100644 local-cli/info/info.js delete mode 100644 local-cli/init/init.js delete mode 100644 local-cli/install/install.js delete mode 100644 local-cli/install/uninstall.js delete mode 100644 local-cli/library/library.js delete mode 100644 local-cli/link/__fixtures__/Info.plist delete mode 100644 local-cli/link/__fixtures__/android/0.17/MainActivity.java delete mode 100644 local-cli/link/__fixtures__/android/0.17/patchedMainActivity.java delete mode 100644 local-cli/link/__fixtures__/android/0.18/MainActivity.java delete mode 100644 local-cli/link/__fixtures__/android/0.18/patchedMainActivity.java delete mode 100644 local-cli/link/__fixtures__/android/0.20/MainActivity.java delete mode 100644 local-cli/link/__fixtures__/android/build.gradle delete mode 100644 local-cli/link/__fixtures__/android/patchedBuild.gradle delete mode 100644 local-cli/link/__fixtures__/android/patchedSettings.gradle delete mode 100644 local-cli/link/__fixtures__/android/settings.gradle delete mode 100644 local-cli/link/__fixtures__/linearGradient.pbxproj delete mode 100644 local-cli/link/__fixtures__/pods/PodfileSimple delete mode 100644 local-cli/link/__fixtures__/pods/PodfileWithFunction delete mode 100644 local-cli/link/__fixtures__/pods/PodfileWithMarkers delete mode 100644 local-cli/link/__fixtures__/pods/PodfileWithTarget delete mode 100644 local-cli/link/__fixtures__/project.pbxproj delete mode 100644 local-cli/link/__tests__/android/applyPatch.spec.js delete mode 100644 local-cli/link/__tests__/android/isInstalled.spec.js delete mode 100644 local-cli/link/__tests__/android/makeBuildPatch.spec.js delete mode 100644 local-cli/link/__tests__/android/makeImportPatch.spec.js delete mode 100644 local-cli/link/__tests__/android/makePackagePatch.spec.js delete mode 100644 local-cli/link/__tests__/android/makeSettingsPatch.spec.js delete mode 100644 local-cli/link/__tests__/android/makeStringsPatch.spec.js delete mode 100644 local-cli/link/__tests__/android/normalizeProjectName.spec.js delete mode 100644 local-cli/link/__tests__/getDependencyConfig.spec.js delete mode 100644 local-cli/link/__tests__/getProjectDependencies.spec.js delete mode 100644 local-cli/link/__tests__/groupFilesByType.spec.js delete mode 100644 local-cli/link/__tests__/ios/addFileToProject.spec.js delete mode 100644 local-cli/link/__tests__/ios/addProjectToLibraries.spec.js delete mode 100644 local-cli/link/__tests__/ios/addSharedLibraries.spec.js delete mode 100644 local-cli/link/__tests__/ios/createGroup.spec.js delete mode 100644 local-cli/link/__tests__/ios/getBuildProperty.spec.js delete mode 100644 local-cli/link/__tests__/ios/getGroup.spec.js delete mode 100644 local-cli/link/__tests__/ios/getHeaderSearchPath.spec.js delete mode 100644 local-cli/link/__tests__/ios/getHeadersInFolder.spec.js delete mode 100644 local-cli/link/__tests__/ios/getPlist.spec.js delete mode 100644 local-cli/link/__tests__/ios/getPlistPath.spec.js delete mode 100644 local-cli/link/__tests__/ios/getTargets.spec.js delete mode 100644 local-cli/link/__tests__/ios/hasLibraryImported.spec.js delete mode 100644 local-cli/link/__tests__/ios/isInstalled.spec.js delete mode 100644 local-cli/link/__tests__/ios/mapHeaderSearchPaths.spec.js delete mode 100644 local-cli/link/__tests__/ios/removeProjectFromLibraries.js delete mode 100644 local-cli/link/__tests__/ios/removeProjectFromProject.spec.js delete mode 100644 local-cli/link/__tests__/ios/removeSharedLibrary.spec.js delete mode 100644 local-cli/link/__tests__/ios/writePlist.spec.js delete mode 100644 local-cli/link/__tests__/link.spec.js delete mode 100644 local-cli/link/__tests__/pods/findLineToAddPod.spec.js delete mode 100644 local-cli/link/__tests__/pods/findMarkedLinesInPodfile.spec.js delete mode 100644 local-cli/link/__tests__/pods/findPodTargetLine.spec.js delete mode 100644 local-cli/link/__tests__/pods/isInstalled.spec.js delete mode 100644 local-cli/link/__tests__/pods/removePodEntry.spec.js delete mode 100644 local-cli/link/__tests__/promiseWaterfall.spec.js delete mode 100644 local-cli/link/android/copyAssets.js delete mode 100644 local-cli/link/android/fs.js delete mode 100644 local-cli/link/android/index.js delete mode 100644 local-cli/link/android/isInstalled.js delete mode 100644 local-cli/link/android/patches/applyParams.js delete mode 100644 local-cli/link/android/patches/applyPatch.js delete mode 100644 local-cli/link/android/patches/makeBuildPatch.js delete mode 100644 local-cli/link/android/patches/makeImportPatch.js delete mode 100644 local-cli/link/android/patches/makePackagePatch.js delete mode 100644 local-cli/link/android/patches/makeSettingsPatch.js delete mode 100644 local-cli/link/android/patches/makeStringsPatch.js delete mode 100644 local-cli/link/android/patches/normalizeProjectName.js delete mode 100644 local-cli/link/android/patches/revokePatch.js delete mode 100644 local-cli/link/android/registerNativeModule.js delete mode 100644 local-cli/link/android/unlinkAssets.js delete mode 100644 local-cli/link/android/unregisterNativeModule.js delete mode 100644 local-cli/link/commandStub.js delete mode 100644 local-cli/link/getDependencyConfig.js delete mode 100644 local-cli/link/getProjectDependencies.js delete mode 100644 local-cli/link/groupFilesByType.js delete mode 100644 local-cli/link/ios/addFileToProject.js delete mode 100644 local-cli/link/ios/addProjectToLibraries.js delete mode 100644 local-cli/link/ios/addSharedLibraries.js delete mode 100644 local-cli/link/ios/addToHeaderSearchPaths.js delete mode 100644 local-cli/link/ios/common/isInstalled.js delete mode 100644 local-cli/link/ios/common/registerNativeModule.js delete mode 100644 local-cli/link/ios/common/unregisterNativeModule.js delete mode 100644 local-cli/link/ios/copyAssets.js delete mode 100644 local-cli/link/ios/createGroup.js delete mode 100644 local-cli/link/ios/createGroupWithMessage.js delete mode 100644 local-cli/link/ios/getBuildProperty.js delete mode 100644 local-cli/link/ios/getGroup.js delete mode 100644 local-cli/link/ios/getHeaderSearchPath.js delete mode 100644 local-cli/link/ios/getHeadersInFolder.js delete mode 100644 local-cli/link/ios/getPlist.js delete mode 100644 local-cli/link/ios/getPlistPath.js delete mode 100644 local-cli/link/ios/getTargets.js delete mode 100644 local-cli/link/ios/hasLibraryImported.js delete mode 100644 local-cli/link/ios/index.js delete mode 100644 local-cli/link/ios/isInstalled.js delete mode 100644 local-cli/link/ios/mapHeaderSearchPaths.js delete mode 100644 local-cli/link/ios/registerNativeModule.js delete mode 100644 local-cli/link/ios/removeFromHeaderSearchPaths.js delete mode 100644 local-cli/link/ios/removeFromPbxItemContainerProxySection.js delete mode 100644 local-cli/link/ios/removeFromPbxReferenceProxySection.js delete mode 100644 local-cli/link/ios/removeFromProjectReferences.js delete mode 100644 local-cli/link/ios/removeFromStaticLibraries.js delete mode 100644 local-cli/link/ios/removeProductGroup.js delete mode 100644 local-cli/link/ios/removeProjectFromLibraries.js delete mode 100644 local-cli/link/ios/removeProjectFromProject.js delete mode 100644 local-cli/link/ios/removeSharedLibraries.js delete mode 100644 local-cli/link/ios/unlinkAssets.js delete mode 100644 local-cli/link/ios/unregisterNativeModule.js delete mode 100644 local-cli/link/ios/writePlist.js delete mode 100644 local-cli/link/link.js delete mode 100644 local-cli/link/pods/addPodEntry.js delete mode 100644 local-cli/link/pods/findLineToAddPod.js delete mode 100644 local-cli/link/pods/findMarkedLinesInPodfile.js delete mode 100644 local-cli/link/pods/findPodTargetLine.js delete mode 100644 local-cli/link/pods/isInstalled.js delete mode 100644 local-cli/link/pods/readPodfile.js delete mode 100644 local-cli/link/pods/registerNativeModule.js delete mode 100644 local-cli/link/pods/removePodEntry.js delete mode 100644 local-cli/link/pods/savePodFile.js delete mode 100644 local-cli/link/pods/unregisterNativeModule.js delete mode 100644 local-cli/link/pollParams.js delete mode 100644 local-cli/link/promiseWaterfall.js delete mode 100644 local-cli/link/promisify.js delete mode 100644 local-cli/link/unlink.js delete mode 100644 local-cli/logAndroid/logAndroid.js delete mode 100644 local-cli/logIOS/logIOS.js delete mode 100644 local-cli/runAndroid/adb.js delete mode 100644 local-cli/runAndroid/runAndroid.js delete mode 100644 local-cli/runIOS/__tests__/findMatchingSimulator-test.js delete mode 100644 local-cli/runIOS/__tests__/findXcodeProject-test.js delete mode 100644 local-cli/runIOS/__tests__/parseIOSDevicesList-test.js delete mode 100644 local-cli/runIOS/findMatchingSimulator.js delete mode 100644 local-cli/runIOS/findXcodeProject.js delete mode 100644 local-cli/runIOS/parseIOSDevicesList.js delete mode 100644 local-cli/runIOS/runIOS.js delete mode 100644 local-cli/server/checkNodeVersion.js delete mode 100644 local-cli/server/middleware/MiddlewareManager.js delete mode 100644 local-cli/server/middleware/copyToClipBoardMiddleware.js delete mode 100644 local-cli/server/middleware/getDevToolsMiddleware.js delete mode 100644 local-cli/server/middleware/getSecurityHeadersMiddleware.js delete mode 100644 local-cli/server/middleware/index.html delete mode 100644 local-cli/server/middleware/indexPage.js delete mode 100644 local-cli/server/middleware/loadRawBodyMiddleware.js delete mode 100644 local-cli/server/middleware/openStackFrameInEditorMiddleware.js delete mode 100644 local-cli/server/middleware/statusPageMiddleware.js delete mode 100644 local-cli/server/middleware/systraceProfileMiddleware.js delete mode 100644 local-cli/server/middleware/unless.js delete mode 100644 local-cli/server/runServer.js delete mode 100644 local-cli/server/server.js delete mode 100644 local-cli/server/util/copyToClipBoard.js delete mode 100644 local-cli/server/util/debugger-ui/DeltaPatcher.js delete mode 100644 local-cli/server/util/debugger-ui/debuggerWorker.js delete mode 100644 local-cli/server/util/debugger-ui/deltaUrlToBlobUrl.js delete mode 100644 local-cli/server/util/debugger-ui/index.html delete mode 100755 local-cli/server/util/external/xsel delete mode 100644 local-cli/server/util/jsPackagerClient.js delete mode 100644 local-cli/server/util/launchChrome.js delete mode 100644 local-cli/server/util/launchEditor.js delete mode 100644 local-cli/server/util/messageSocket.js delete mode 100644 local-cli/server/util/webSocketProxy.js delete mode 100755 local-cli/setup_env.bat delete mode 100755 local-cli/setup_env.sh delete mode 100644 local-cli/templates/HelloWorld/App.js delete mode 100644 local-cli/templates/HelloWorld/__tests__/App.js delete mode 100644 local-cli/templates/HelloWorld/_babelrc delete mode 100644 local-cli/templates/HelloWorld/_buckconfig delete mode 100644 local-cli/templates/HelloWorld/_flowconfig delete mode 100644 local-cli/templates/HelloWorld/_gitattributes delete mode 100644 local-cli/templates/HelloWorld/_gitignore delete mode 100644 local-cli/templates/HelloWorld/_watchmanconfig delete mode 100644 local-cli/templates/HelloWorld/android/app/_BUCK delete mode 100644 local-cli/templates/HelloWorld/android/app/build.gradle delete mode 100644 local-cli/templates/HelloWorld/android/app/build_defs.bzl delete mode 100644 local-cli/templates/HelloWorld/android/app/proguard-rules.pro delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/AndroidManifest.xml delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainActivity.java delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainApplication.java delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/values/strings.xml delete mode 100644 local-cli/templates/HelloWorld/android/app/src/main/res/values/styles.xml delete mode 100644 local-cli/templates/HelloWorld/android/build.gradle delete mode 100644 local-cli/templates/HelloWorld/android/gradle.properties delete mode 100644 local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 local-cli/templates/HelloWorld/android/gradlew delete mode 100644 local-cli/templates/HelloWorld/android/gradlew.bat delete mode 100644 local-cli/templates/HelloWorld/android/keystores/_BUCK delete mode 100644 local-cli/templates/HelloWorld/android/keystores/debug.keystore.properties delete mode 100644 local-cli/templates/HelloWorld/android/settings.gradle delete mode 100644 local-cli/templates/HelloWorld/app.json delete mode 100644 local-cli/templates/HelloWorld/index.js delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld-tvOS/Info.plist delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld-tvOSTests/Info.plist delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/project.pbxproj delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld-tvOS.xcscheme delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.h delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.m delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/Base.lproj/LaunchScreen.xib delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/Contents.json delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/Info.plist delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorld/main.m delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorldTests/HelloWorldTests.m delete mode 100644 local-cli/templates/HelloWorld/ios/HelloWorldTests/Info.plist delete mode 100644 local-cli/templates/README.md delete mode 100644 local-cli/upgrade/upgrade.js delete mode 100644 local-cli/util/Config.js delete mode 100644 local-cli/util/PackageManager.js delete mode 100644 local-cli/util/__mocks__/log.js delete mode 100644 local-cli/util/__tests__/findSymlinkedModules-test.js delete mode 100644 local-cli/util/assertRequiredOptions.js delete mode 100644 local-cli/util/copyAndReplace.js delete mode 100644 local-cli/util/findReactNativeScripts.js delete mode 100644 local-cli/util/findSymlinkedModules.js delete mode 100644 local-cli/util/findSymlinksPaths.js delete mode 100644 local-cli/util/isPackagerRunning.js delete mode 100644 local-cli/util/isValidPackageName.js delete mode 100644 local-cli/util/log.js delete mode 100644 local-cli/util/parseCommandLine.js delete mode 100644 local-cli/util/walk.js delete mode 100644 local-cli/util/yarn.js diff --git a/Libraries/Image/AssetSourceResolver.js b/Libraries/Image/AssetSourceResolver.js index b5650620ae1481..e441803d0a7cb1 100644 --- a/Libraries/Image/AssetSourceResolver.js +++ b/Libraries/Image/AssetSourceResolver.js @@ -22,7 +22,7 @@ import type {PackagerAsset} from 'AssetRegistry'; const PixelRatio = require('PixelRatio'); const Platform = require('Platform'); -const assetPathUtils = require('../../local-cli/bundle/assetPathUtils'); +const assetPathUtils = require('react-native-local-cli/bundle/assetPathUtils'); const invariant = require('fbjs/lib/invariant'); /** diff --git a/jest/hasteImpl.js b/jest/hasteImpl.js index f2b8abae5213dc..fda5a20dd97812 100644 --- a/jest/hasteImpl.js +++ b/jest/hasteImpl.js @@ -11,7 +11,7 @@ 'use strict'; const path = require('path'); -const findPlugins = require('../local-cli/core/findPlugins'); +const findPlugins = require('react-native-local-cli/core/findPlugins'); const REACT_NATIVE_CI = process.cwd() === path.resolve(__dirname, '..'); diff --git a/local-cli/.npmignore b/local-cli/.npmignore deleted file mode 100644 index e40506d719b298..00000000000000 --- a/local-cli/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -__fixtures__ -__tests__ diff --git a/local-cli/__mocks__/beeper.js b/local-cli/__mocks__/beeper.js deleted file mode 100644 index 9fbb40caad1604..00000000000000 --- a/local-cli/__mocks__/beeper.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -// beeper@1.1.0 has a return statement outside of a function -// and therefore doesn't parse. Let's mock it so that we can -// run the tests. -module.exports = function() {}; diff --git a/local-cli/__mocks__/fs.js b/local-cli/__mocks__/fs.js deleted file mode 100644 index a3691e3f38bd72..00000000000000 --- a/local-cli/__mocks__/fs.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const path = require('path'); -const MemoryFS = require('metro-memory-fs'); -let fs; - -function setMockFilesystem(object, platform) { - reset(platform); - const root = platform === 'win32' ? 'c:\\' : '/'; - mockDir(root, {...object}); - return root; -} - -function mockDir(dirPath, desc) { - for (const entName in desc) { - const ent = desc[entName]; - const entPath = path.join(dirPath, entName); - if (typeof ent === 'string' || ent instanceof Buffer) { - fs.writeFileSync(entPath, ent); - continue; - } - if (typeof ent !== 'object') { - throw new Error(require('util').format('invalid entity:', ent)); - } - if (ent.SYMLINK != null) { - fs.symlinkSync(ent.SYMLINK, entPath); - continue; - } - fs.mkdirSync(entPath); - mockDir(entPath, ent); - } -} - -function reset(platform) { - if (path.mock == null) { - throw new Error( - 'to use this "fs" module mock, you must also mock the "path" module', - ); - } - path.mock.reset(platform); - const cwd = () => (platform === 'win32' ? 'c:\\' : '/'); - fs = new MemoryFS({platform, cwd}); - Object.assign(mockFs, fs); -} - -const mockFs = {}; -mockFs.__setMockFilesystem = setMockFilesystem; -mockFs.mock = {clear: reset}; - -reset('posix'); - -module.exports = mockFs; diff --git a/local-cli/__mocks__/path.js b/local-cli/__mocks__/path.js deleted file mode 100644 index 813a2525c6bfdf..00000000000000 --- a/local-cli/__mocks__/path.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const mockPath = {}; - -function reset(platform) { - Object.assign(mockPath, jest.requireActual('path')[platform]); -} - -mockPath.mock = {reset}; - -reset('posix'); - -module.exports = mockPath; diff --git a/local-cli/bundle/__mocks__/sign.js b/local-cli/bundle/__mocks__/sign.js deleted file mode 100644 index 31fda82f57ca30..00000000000000 --- a/local-cli/bundle/__mocks__/sign.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -function sign(source) { - return source; -} - -module.exports = sign; diff --git a/local-cli/bundle/__tests__/filterPlatformAssetScales-test.js b/local-cli/bundle/__tests__/filterPlatformAssetScales-test.js deleted file mode 100644 index ca336d8fdcc70e..00000000000000 --- a/local-cli/bundle/__tests__/filterPlatformAssetScales-test.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.dontMock('../filterPlatformAssetScales').dontMock('../assetPathUtils'); - -const filterPlatformAssetScales = require('../filterPlatformAssetScales'); - -describe('filterPlatformAssetScales', () => { - it('removes everything but 2x and 3x for iOS', () => { - expect(filterPlatformAssetScales('ios', [1, 1.5, 2, 3, 4])).toEqual([ - 1, - 2, - 3, - ]); - expect(filterPlatformAssetScales('ios', [3, 4])).toEqual([3]); - }); - - it('keeps closest largest one if nothing matches', () => { - expect(filterPlatformAssetScales('ios', [0.5, 4, 100])).toEqual([4]); - expect(filterPlatformAssetScales('ios', [0.5, 100])).toEqual([100]); - expect(filterPlatformAssetScales('ios', [0.5])).toEqual([0.5]); - expect(filterPlatformAssetScales('ios', [])).toEqual([]); - }); - - it('keeps all scales for unknown platform', () => { - expect(filterPlatformAssetScales('freebsd', [1, 1.5, 2, 3.7])).toEqual([ - 1, - 1.5, - 2, - 3.7, - ]); - }); -}); diff --git a/local-cli/bundle/__tests__/getAssetDestPathAndroid-test.js b/local-cli/bundle/__tests__/getAssetDestPathAndroid-test.js deleted file mode 100644 index 792e2676ceff1e..00000000000000 --- a/local-cli/bundle/__tests__/getAssetDestPathAndroid-test.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.dontMock('../getAssetDestPathAndroid').dontMock('../assetPathUtils'); - -const getAssetDestPathAndroid = require('../getAssetDestPathAndroid'); - -const path = require('path'); - -describe('getAssetDestPathAndroid', () => { - it('should use the right destination folder', () => { - const asset = { - name: 'icon', - type: 'png', - httpServerLocation: '/assets/test', - }; - - const expectDestPathForScaleToStartWith = (scale, path) => { - if (!getAssetDestPathAndroid(asset, scale).startsWith(path)) { - throw new Error( - `asset for scale ${scale} should start with path '${path}'`, - ); - } - }; - - expectDestPathForScaleToStartWith(1, 'drawable-mdpi'); - expectDestPathForScaleToStartWith(1.5, 'drawable-hdpi'); - expectDestPathForScaleToStartWith(2, 'drawable-xhdpi'); - expectDestPathForScaleToStartWith(3, 'drawable-xxhdpi'); - expectDestPathForScaleToStartWith(4, 'drawable-xxxhdpi'); - }); - - it('should lowercase path', () => { - const asset = { - name: 'Icon', - type: 'png', - httpServerLocation: '/assets/App/Test', - }; - - expect(getAssetDestPathAndroid(asset, 1)).toBe( - path.normalize('drawable-mdpi/app_test_icon.png'), - ); - }); - - it('should remove `assets/` prefix', () => { - const asset = { - name: 'icon', - type: 'png', - httpServerLocation: '/assets/RKJSModules/Apps/AndroidSample/Assets', - }; - - expect(getAssetDestPathAndroid(asset, 1).startsWith('assets_')).toBeFalsy(); - }); - - it('should put non-drawable resources to `raw/`', () => { - const asset = { - name: 'video', - type: 'mp4', - httpServerLocation: '/assets/app/test', - }; - - expect(getAssetDestPathAndroid(asset, 1)).toBe( - path.normalize('raw/app_test_video.mp4'), - ); - }); -}); diff --git a/local-cli/bundle/__tests__/getAssetDestPathIOS-test.js b/local-cli/bundle/__tests__/getAssetDestPathIOS-test.js deleted file mode 100644 index fb05ba3fb31792..00000000000000 --- a/local-cli/bundle/__tests__/getAssetDestPathIOS-test.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.dontMock('../getAssetDestPathIOS'); - -const getAssetDestPathIOS = require('../getAssetDestPathIOS'); -const path = require('path'); - -describe('getAssetDestPathIOS', () => { - it('should build correct path', () => { - const asset = { - name: 'icon', - type: 'png', - httpServerLocation: '/assets/test', - }; - - expect(getAssetDestPathIOS(asset, 1)).toBe( - path.normalize('assets/test/icon.png'), - ); - }); - - it('should consider scale', () => { - const asset = { - name: 'icon', - type: 'png', - httpServerLocation: '/assets/test', - }; - - expect(getAssetDestPathIOS(asset, 2)).toBe( - path.normalize('assets/test/icon@2x.png'), - ); - expect(getAssetDestPathIOS(asset, 3)).toBe( - path.normalize('assets/test/icon@3x.png'), - ); - }); -}); diff --git a/local-cli/bundle/assetPathUtils.js b/local-cli/bundle/assetPathUtils.js deleted file mode 100644 index 9e98ba684a9756..00000000000000 --- a/local-cli/bundle/assetPathUtils.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -'use strict'; - -import type {PackagerAsset} from '../../Libraries/Image/AssetRegistry'; - -/** - * FIXME: using number to represent discrete scale numbers is fragile in essence because of - * floating point numbers imprecision. - */ -function getAndroidAssetSuffix(scale: number): string { - switch (scale) { - case 0.75: - return 'ldpi'; - case 1: - return 'mdpi'; - case 1.5: - return 'hdpi'; - case 2: - return 'xhdpi'; - case 3: - return 'xxhdpi'; - case 4: - return 'xxxhdpi'; - } - throw new Error('no such scale'); -} - -// See https://developer.android.com/guide/topics/resources/drawable-resource.html -const drawableFileTypes = new Set([ - 'gif', - 'jpeg', - 'jpg', - 'png', - 'svg', - 'webp', - 'xml', -]); - -function getAndroidResourceFolderName(asset: PackagerAsset, scale: number) { - if (!drawableFileTypes.has(asset.type)) { - return 'raw'; - } - var suffix = getAndroidAssetSuffix(scale); - if (!suffix) { - throw new Error( - "Don't know which android drawable suffix to use for asset: " + - JSON.stringify(asset), - ); - } - const androidFolder = 'drawable-' + suffix; - return androidFolder; -} - -function getAndroidResourceIdentifier(asset: PackagerAsset) { - var folderPath = getBasePath(asset); - return (folderPath + '/' + asset.name) - .toLowerCase() - .replace(/\//g, '_') // Encode folder structure in file name - .replace(/([^a-z0-9_])/g, '') // Remove illegal chars - .replace(/^assets_/, ''); // Remove "assets_" prefix -} - -function getBasePath(asset: PackagerAsset) { - var basePath = asset.httpServerLocation; - if (basePath[0] === '/') { - basePath = basePath.substr(1); - } - return basePath; -} - -module.exports = { - getAndroidAssetSuffix: getAndroidAssetSuffix, - getAndroidResourceFolderName: getAndroidResourceFolderName, - getAndroidResourceIdentifier: getAndroidResourceIdentifier, - getBasePath: getBasePath, -}; diff --git a/local-cli/bundle/buildBundle.js b/local-cli/bundle/buildBundle.js deleted file mode 100644 index b81b7432951f6b..00000000000000 --- a/local-cli/bundle/buildBundle.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -const log = require('../util/log').out('bundle'); -const Server = require('metro/src/Server'); - -/* $FlowFixMe(site=react_native_oss) */ -const outputBundle = require('metro/src/shared/output/bundle'); -const path = require('path'); -const saveAssets = require('./saveAssets'); - -import type {RequestOptions, OutputOptions} from './types.flow'; -import type {ConfigT} from 'metro-config/src/configTypes.flow'; - -async function buildBundle( - args: OutputOptions & { - assetsDest: mixed, - entryFile: string, - maxWorkers: number, - resetCache: boolean, - transformer: string, - minify: boolean, - }, - configPromise: Promise, - /* $FlowFixMe(>=0.85.0 site=react_native_fb) This comment suppresses an error - * found when Flow v0.85 was deployed. To see the error, delete this comment - * and run Flow. */ - output = outputBundle, -) { - // This is used by a bazillion of npm modules we don't control so we don't - // have other choice than defining it as an env variable here. - process.env.NODE_ENV = args.dev ? 'development' : 'production'; - const config = await configPromise; - - let sourceMapUrl = args.sourcemapOutput; - if (sourceMapUrl && !args.sourcemapUseAbsolutePath) { - sourceMapUrl = path.basename(sourceMapUrl); - } - - const requestOpts: RequestOptions = { - entryFile: args.entryFile, - sourceMapUrl, - dev: args.dev, - minify: args.minify !== undefined ? args.minify : !args.dev, - platform: args.platform, - }; - - const server = new Server({...config, resetCache: args.resetCache}); - - try { - const bundle = await output.build(server, requestOpts); - - await output.save(bundle, args, log); - - // Save the assets of the bundle - const outputAssets = await server.getAssets({ - ...Server.DEFAULT_BUNDLE_OPTIONS, - ...requestOpts, - bundleType: 'todo', - }); - - // When we're done saving bundle output and the assets, we're done. - return await saveAssets(outputAssets, args.platform, args.assetsDest); - } finally { - server.end(); - } -} - -module.exports = buildBundle; diff --git a/local-cli/bundle/bundle.js b/local-cli/bundle/bundle.js deleted file mode 100644 index 8c42982b47b005..00000000000000 --- a/local-cli/bundle/bundle.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const buildBundle = require('./buildBundle'); -const bundleCommandLineArgs = require('./bundleCommandLineArgs'); -const outputBundle = require('metro/src/shared/output/bundle'); - -/** - * Builds the bundle starting to look for dependencies at the given entry path. - */ -function bundleWithOutput(argv, configPromise, args, output) { - if (!output) { - output = outputBundle; - } - return buildBundle(args, configPromise, output); -} - -module.exports = { - name: 'bundle', - description: 'builds the javascript bundle for offline use', - func: bundleWithOutput, - options: bundleCommandLineArgs, - - // not used by the CLI itself - withOutput: bundleWithOutput, -}; diff --git a/local-cli/bundle/bundleCommandLineArgs.js b/local-cli/bundle/bundleCommandLineArgs.js deleted file mode 100644 index ef95e2a9fea2c2..00000000000000 --- a/local-cli/bundle/bundleCommandLineArgs.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = [ - { - command: '--entry-file ', - description: - 'Path to the root JS file, either absolute or relative to JS root', - }, - { - command: '--platform [string]', - description: 'Either "ios" or "android"', - default: 'ios', - }, - { - command: '--transformer [string]', - description: 'Specify a custom transformer to be used', - }, - { - command: '--dev [boolean]', - description: 'If false, warnings are disabled and the bundle is minified', - parse: val => (val === 'false' ? false : true), - default: true, - }, - { - command: '--minify [boolean]', - description: - 'Allows overriding whether bundle is minified. This defaults to ' + - 'false if dev is true, and true if dev is false. Disabling minification ' + - 'can be useful for speeding up production builds for testing purposes.', - parse: val => (val === 'false' ? false : true), - }, - { - command: '--bundle-output ', - description: - 'File name where to store the resulting bundle, ex. /tmp/groups.bundle', - }, - { - command: '--bundle-encoding [string]', - description: - 'Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).', - default: 'utf8', - }, - { - command: '--max-workers [number]', - description: - 'Specifies the maximum number of workers the worker-pool ' + - 'will spawn for transforming files. This defaults to the number of the ' + - 'cores available on your machine.', - parse: (workers: string) => Number(workers), - }, - { - command: '--sourcemap-output [string]', - description: - 'File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map', - }, - { - command: '--sourcemap-sources-root [string]', - description: - "Path to make sourcemap's sources entries relative to, ex. /root/dir", - }, - { - command: '--sourcemap-use-absolute-path', - description: 'Report SourceMapURL using its full path', - default: false, - }, - { - command: '--assets-dest [string]', - description: - 'Directory name where to store assets referenced in the bundle', - }, - { - command: '--verbose', - description: 'Enables logging', - default: false, - }, - { - command: '--reset-cache', - description: 'Removes cached files', - default: false, - }, - { - command: '--read-global-cache', - description: - 'Try to fetch transformed JS code from the global cache, if configured.', - default: false, - }, -]; diff --git a/local-cli/bundle/filterPlatformAssetScales.js b/local-cli/bundle/filterPlatformAssetScales.js deleted file mode 100644 index d75512e86886f1..00000000000000 --- a/local-cli/bundle/filterPlatformAssetScales.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict - * @format - */ - -'use strict'; - -const ALLOWED_SCALES = { - ios: [1, 2, 3], -}; - -function filterPlatformAssetScales( - platform: string, - scales: $ReadOnlyArray, -): $ReadOnlyArray { - const whitelist = ALLOWED_SCALES[platform]; - if (!whitelist) { - return scales; - } - const result = scales.filter(scale => whitelist.indexOf(scale) > -1); - if (result.length === 0 && scales.length > 0) { - // No matching scale found, but there are some available. Ideally we don't - // want to be in this situation and should throw, but for now as a fallback - // let's just use the closest larger image - const maxScale = whitelist[whitelist.length - 1]; - for (const scale of scales) { - if (scale > maxScale) { - result.push(scale); - break; - } - } - - // There is no larger scales available, use the largest we have - if (result.length === 0) { - result.push(scales[scales.length - 1]); - } - } - return result; -} - -module.exports = filterPlatformAssetScales; diff --git a/local-cli/bundle/getAssetDestPathAndroid.js b/local-cli/bundle/getAssetDestPathAndroid.js deleted file mode 100644 index 36e54f94e292ad..00000000000000 --- a/local-cli/bundle/getAssetDestPathAndroid.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -'use strict'; - -const assetPathUtils = require('./assetPathUtils'); -const path = require('path'); - -import type {PackagerAsset} from '../../Libraries/Image/AssetRegistry'; - -function getAssetDestPathAndroid(asset: PackagerAsset, scale: number): string { - const androidFolder = assetPathUtils.getAndroidResourceFolderName( - asset, - scale, - ); - const fileName = assetPathUtils.getAndroidResourceIdentifier(asset); - return path.join(androidFolder, fileName + '.' + asset.type); -} - -module.exports = getAssetDestPathAndroid; diff --git a/local-cli/bundle/getAssetDestPathIOS.js b/local-cli/bundle/getAssetDestPathIOS.js deleted file mode 100644 index 55479c2568c230..00000000000000 --- a/local-cli/bundle/getAssetDestPathIOS.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -'use strict'; - -const path = require('path'); - -import type {PackagerAsset} from '../../Libraries/Image/AssetRegistry'; - -function getAssetDestPathIOS(asset: PackagerAsset, scale: number): string { - const suffix = scale === 1 ? '' : '@' + scale + 'x'; - const fileName = asset.name + suffix + '.' + asset.type; - return path.join(asset.httpServerLocation.substr(1), fileName); -} - -module.exports = getAssetDestPathIOS; diff --git a/local-cli/bundle/ramBundle.js b/local-cli/bundle/ramBundle.js deleted file mode 100644 index 796389034ff073..00000000000000 --- a/local-cli/bundle/ramBundle.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const bundleWithOutput = require('./bundle').withOutput; -const bundleCommandLineArgs = require('./bundleCommandLineArgs'); -const outputUnbundle = require('metro/src/shared/output/RamBundle'); - -/** - * Builds the bundle starting to look for dependencies at the given entry path. - */ -function ramBundle(argv, config, args) { - return bundleWithOutput(argv, config, args, outputUnbundle); -} - -module.exports = { - name: 'ram-bundle', - description: - 'builds javascript as a "Random Access Module" bundle for offline use', - func: ramBundle, - options: bundleCommandLineArgs.concat({ - command: '--indexed-ram-bundle', - description: - 'Force the "Indexed RAM" bundle file format, even when building for android', - default: false, - }), -}; diff --git a/local-cli/bundle/saveAssets.js b/local-cli/bundle/saveAssets.js deleted file mode 100644 index d43197ec573fb7..00000000000000 --- a/local-cli/bundle/saveAssets.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const filterPlatformAssetScales = require('./filterPlatformAssetScales'); -const fs = require('fs'); -const getAssetDestPathAndroid = require('./getAssetDestPathAndroid'); -const getAssetDestPathIOS = require('./getAssetDestPathIOS'); -const log = require('../util/log').out('bundle'); -const mkdirp = require('mkdirp'); -const path = require('path'); - -function saveAssets(assets, platform, assetsDest) { - if (!assetsDest) { - console.warn('Assets destination folder is not set, skipping...'); - return Promise.resolve(); - } - - const getAssetDestPath = - platform === 'android' ? getAssetDestPathAndroid : getAssetDestPathIOS; - - const filesToCopy = Object.create(null); // Map src -> dest - assets.forEach(asset => { - const validScales = new Set( - filterPlatformAssetScales(platform, asset.scales), - ); - asset.scales.forEach((scale, idx) => { - if (!validScales.has(scale)) { - return; - } - const src = asset.files[idx]; - const dest = path.join(assetsDest, getAssetDestPath(asset, scale)); - filesToCopy[src] = dest; - }); - }); - - return copyAll(filesToCopy); -} - -function copyAll(filesToCopy) { - const queue = Object.keys(filesToCopy); - if (queue.length === 0) { - return Promise.resolve(); - } - - log('Copying ' + queue.length + ' asset files'); - return new Promise((resolve, reject) => { - const copyNext = error => { - if (error) { - return reject(error); - } - if (queue.length === 0) { - log('Done copying assets'); - resolve(); - } else { - const src = queue.shift(); - const dest = filesToCopy[src]; - copy(src, dest, copyNext); - } - }; - copyNext(); - }); -} - -function copy(src, dest, callback) { - const destDir = path.dirname(dest); - mkdirp(destDir, err => { - if (err) { - return callback(err); - } - fs.createReadStream(src) - .pipe(fs.createWriteStream(dest)) - .on('finish', callback); - }); -} - -module.exports = saveAssets; diff --git a/local-cli/bundle/types.flow.js b/local-cli/bundle/types.flow.js deleted file mode 100644 index 04bc1c38508bb5..00000000000000 --- a/local-cli/bundle/types.flow.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -export type {OutputOptions, RequestOptions} from 'metro/src/shared/types.flow'; diff --git a/local-cli/cli.js b/local-cli/cli.js index f34d5742915be5..c2f05e0d1d82fb 100644 --- a/local-cli/cli.js +++ b/local-cli/cli.js @@ -7,21 +7,6 @@ * @format */ -'use strict'; +var cli = require('react-native-local-cli'); -// gracefulify() has to be called before anything else runs -require('graceful-fs').gracefulify(require('fs')); - -// This file must be able to run in node 0.12 without babel so we can show that -// it is not supported. This is why the rest of the cli code is in `cliEntry.js`. -require('./server/checkNodeVersion')(); - -require('../setupBabel')(); - -var cliEntry = require('./cliEntry'); - -if (require.main === module) { - cliEntry.run(); -} - -module.exports = cliEntry; +cli.run(); diff --git a/local-cli/cliEntry.js b/local-cli/cliEntry.js deleted file mode 100644 index e53356220d9793..00000000000000 --- a/local-cli/cliEntry.js +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -const {configPromise} = require('./core'); - -const assertRequiredOptions = require('./util/assertRequiredOptions'); -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const chalk = require('chalk'); -const childProcess = require('child_process'); -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const commander = require('commander'); -const commands = require('./commands'); -const init = require('./init/init'); -const path = require('path'); -const pkg = require('../package.json'); - -import type {CommandT} from './commands'; -import type {RNConfig} from './core'; - -commander.version(pkg.version); - -const defaultOptParser = val => val; - -const handleError = err => { - console.error(); - console.error(err.message || err); - console.error(); - if (err.stack) { - console.error(err.stack); - console.error(); - } - process.exit(1); -}; - -// Custom printHelpInformation command inspired by internal Commander.js -// one modified to suit our needs -function printHelpInformation() { - let cmdName = this._name; - if (this._alias) { - cmdName = cmdName + '|' + this._alias; - } - - const sourceInformation = this.pkg - ? [` ${chalk.bold('Source:')} ${this.pkg.name}@${this.pkg.version}`, ''] - : []; - - let output = [ - '', - chalk.bold(chalk.cyan(` react-native ${cmdName} ${this.usage()}`)), - this._description ? ` ${this._description}` : '', - '', - ...sourceInformation, - ` ${chalk.bold('Options:')}`, - '', - this.optionHelp().replace(/^/gm, ' '), - '', - ]; - - if (this.examples && this.examples.length > 0) { - const formattedUsage = this.examples - .map(example => ` ${example.desc}: \n ${chalk.cyan(example.cmd)}`) - .join('\n\n'); - - output = output.concat([ - chalk.bold(' Example usage:'), - '', - formattedUsage, - ]); - } - - return output.concat(['', '']).join('\n'); -} - -function printUnknownCommand(cmdName) { - console.log( - [ - '', - cmdName - ? chalk.red(` Unrecognized command '${cmdName}'`) - : chalk.red(" You didn't pass any command"), - ` Run ${chalk.cyan( - 'react-native --help', - )} to see list of all available commands`, - '', - ].join('\n'), - ); -} - -const addCommand = (command: CommandT, cfg: RNConfig) => { - const options = command.options || []; - - const cmd = commander - .command(command.name, undefined, { - noHelp: !command.description, - }) - .description(command.description) - .action(function runAction() { - const passedOptions = this.opts(); - const argv: Array = Array.from(arguments).slice(0, -1); - - Promise.resolve() - .then(() => { - assertRequiredOptions(options, passedOptions); - return command.func(argv, cfg, passedOptions); - }) - .catch(handleError); - }); - - cmd.helpInformation = printHelpInformation.bind(cmd); - cmd.examples = command.examples; - cmd.pkg = command.pkg; - - options.forEach(opt => - cmd.option( - opt.command, - opt.description, - opt.parse || defaultOptParser, - typeof opt.default === 'function' ? opt.default(cfg) : opt.default, - ), - ); - - // Placeholder option for --config, which is parsed before any other option, - // but needs to be here to avoid "unknown option" errors when specified - cmd.option('--config [string]', 'Path to the CLI configuration file'); -}; - -async function run() { - const config = await configPromise; - const setupEnvScript = /^win/.test(process.platform) - ? 'setup_env.bat' - : 'setup_env.sh'; - - childProcess.execFileSync(path.join(__dirname, setupEnvScript)); - - commands.forEach(cmd => addCommand(cmd, config)); - - commander.parse(process.argv); - - const isValidCommand = commands.find( - cmd => cmd.name.split(' ')[0] === process.argv[2], - ); - - if (!isValidCommand) { - printUnknownCommand(process.argv[2]); - return; - } - - if (!commander.args.length) { - commander.help(); - } -} - -module.exports = { - run: run, - init: init, -}; diff --git a/local-cli/commands.js b/local-cli/commands.js deleted file mode 100644 index 35a7f74def1fff..00000000000000 --- a/local-cli/commands.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -const {getProjectCommands} = require('./core'); - -import type {RNConfig} from './core'; - -export type CommandT = { - name: string, - description?: string, - usage?: string, - func: (argv: Array, config: RNConfig, args: Object) => ?Promise, - options?: Array<{ - command: string, - description?: string, - parse?: (val: string) => any, - default?: ((config: RNConfig) => mixed) | mixed, - }>, - examples?: Array<{ - desc: string, - cmd: string, - }>, - pkg?: { - version: string, - name: string, - }, -}; - -const documentedCommands = [ - require('./server/server'), - require('./runIOS/runIOS'), - require('./runAndroid/runAndroid'), - require('./library/library'), - require('./bundle/bundle'), - require('./bundle/ramBundle'), - require('./eject/eject'), - require('./link/link'), - require('./link/unlink'), - require('./install/install'), - require('./install/uninstall'), - require('./upgrade/upgrade'), - require('./logAndroid/logAndroid'), - require('./logIOS/logIOS'), - require('./dependencies/dependencies'), - require('./info/info'), -]; - -// The user should never get here because projects are inited by -// using `react-native-cli` from outside a project directory. -const undocumentedCommands = [ - { - name: 'init', - func: () => { - console.log( - [ - 'Looks like React Native project already exists in the current', - 'folder. Run this command from a different folder or remove node_modules/react-native', - ].join('\n'), - ); - }, - }, -]; - -const commands: Array = [ - ...documentedCommands, - ...undocumentedCommands, - ...getProjectCommands(), -]; - -module.exports = commands; diff --git a/local-cli/core/Constants.js b/local-cli/core/Constants.js deleted file mode 100644 index edf9cd51799592..00000000000000 --- a/local-cli/core/Constants.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict - * @format - */ - -'use strict'; - -const ASSET_REGISTRY_PATH = 'react-native/Libraries/Image/AssetRegistry'; -const ASSET_SOURCE_RESOLVER_PATH = - 'react-native/Libraries/Image/AssetSourceResolver'; - -module.exports = { - ASSET_REGISTRY_PATH, - ASSET_SOURCE_RESOLVER_PATH, -}; diff --git a/local-cli/core/__fixtures__/android.js b/local-cli/core/__fixtures__/android.js deleted file mode 100644 index d5f603069fc446..00000000000000 --- a/local-cli/core/__fixtures__/android.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = jest.requireActual('fs'); -const path = jest.requireActual('path'); - -const manifest = fs.readFileSync( - path.join(__dirname, './files/AndroidManifest.xml'), -); -const mainJavaClass = fs.readFileSync( - path.join(__dirname, './files/Main.java'), -); - -function generateValidFileStructure(classFileName) { - return { - src: { - 'AndroidManifest.xml': manifest, - main: { - com: { - some: { - example: { - 'Main.java': mainJavaClass, - [classFileName]: fs.readFileSync( - path.join(__dirname, `./files/${classFileName}`), - ), - }, - }, - }, - }, - }, - }; -} - -exports.valid = generateValidFileStructure('ReactPackage.java'); - -exports.validKotlin = generateValidFileStructure('ReactPackage.kt'); - -exports.userConfigManifest = { - src: { - main: { - 'AndroidManifest.xml': manifest, - com: { - some: { - example: { - 'Main.java': mainJavaClass, - 'ReactPackage.java': fs.readFileSync( - path.join(__dirname, './files/ReactPackage.java'), - ), - }, - }, - }, - }, - debug: { - 'AndroidManifest.xml': fs.readFileSync( - path.join(__dirname, './files/AndroidManifest-debug.xml'), - ), - }, - }, -}; - -exports.corrupted = { - src: { - 'AndroidManifest.xml': manifest, - main: { - com: { - some: { - example: {}, - }, - }, - }, - }, -}; - -exports.noPackage = { - src: { - 'AndroidManifest.xml': manifest, - main: { - com: { - some: { - example: { - 'Main.java': mainJavaClass, - }, - }, - }, - }, - }, -}; diff --git a/local-cli/core/__fixtures__/commands.js b/local-cli/core/__fixtures__/commands.js deleted file mode 100644 index 5331649a7bd5a2..00000000000000 --- a/local-cli/core/__fixtures__/commands.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -exports.single = { - func: () => {}, - description: 'Test action', - name: 'test', -}; - -exports.multiple = [ - { - func: () => {}, - description: 'Test action #1', - name: 'test1', - }, - { - func: () => {}, - description: 'Test action #2', - name: 'test2', - }, -]; diff --git a/local-cli/core/__fixtures__/dependencies.js b/local-cli/core/__fixtures__/dependencies.js deleted file mode 100644 index f5a3c1c333e389..00000000000000 --- a/local-cli/core/__fixtures__/dependencies.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = jest.requireActual('fs'); -const path = require('path'); -const android = require('./android'); - -const pjson = fs.readFileSync(path.join(__dirname, 'files', 'package.json')); - -module.exports = { - valid: { - 'package.json': pjson, - android: android.valid, - }, - withAssets: { - 'package.json': pjson, - android: android.valid, - fonts: { - 'A.ttf': '', - 'B.ttf': '', - }, - images: { - 'C.jpg': '', - }, - }, - noPackage: { - 'package.json': pjson, - android: android.noPackage, - }, -}; diff --git a/local-cli/core/__fixtures__/files/AndroidManifest-debug.xml b/local-cli/core/__fixtures__/files/AndroidManifest-debug.xml deleted file mode 100644 index 0c29eab6721a39..00000000000000 --- a/local-cli/core/__fixtures__/files/AndroidManifest-debug.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/local-cli/core/__fixtures__/files/AndroidManifest.xml b/local-cli/core/__fixtures__/files/AndroidManifest.xml deleted file mode 100644 index 83cf6c79916298..00000000000000 --- a/local-cli/core/__fixtures__/files/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/local-cli/core/__fixtures__/files/Main.java b/local-cli/core/__fixtures__/files/Main.java deleted file mode 100644 index 5ddddfae8e40ea..00000000000000 --- a/local-cli/core/__fixtures__/files/Main.java +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.some.example; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SomeExamplePackage {} diff --git a/local-cli/core/__fixtures__/files/ReactPackage.java b/local-cli/core/__fixtures__/files/ReactPackage.java deleted file mode 100644 index 08695ebb760816..00000000000000 --- a/local-cli/core/__fixtures__/files/ReactPackage.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.some.example; - -import com.facebook.react.ReactPackage; -import com.facebook.react.bridge.NativeModule; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.uimanager.ViewManager; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class SomeExampleJavaPackage implements ReactPackage { - - @Override - public List createNativeModules( - ReactApplicationContext reactContext) { - List modules = new ArrayList<>(); - modules.add(new SomeExampleModule(reactContext)); - return modules; - } - - @Override - public List createViewManagers(ReactApplicationContext reactContext) { - return Collections.emptyList(); - } -} diff --git a/local-cli/core/__fixtures__/files/ReactPackage.kt b/local-cli/core/__fixtures__/files/ReactPackage.kt deleted file mode 100644 index 17b0db22bd9187..00000000000000 --- a/local-cli/core/__fixtures__/files/ReactPackage.kt +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.some.example; - -import android.view.View -import com.facebook.react.ReactPackage -import com.facebook.react.bridge.NativeModule -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.uimanager.ReactShadowNode -import com.facebook.react.uimanager.ViewManager -import java.util.* - -class SomeExampleKotlinPackage : ReactPackage { - - override fun createNativeModules(reactContext: ReactApplicationContext): MutableList - = mutableListOf(MaterialPaletteModule(reactContext)) - - override fun createViewManagers(reactContext: ReactApplicationContext?): - MutableList> = Collections.emptyList() - -} diff --git a/local-cli/core/__fixtures__/files/package.json b/local-cli/core/__fixtures__/files/package.json deleted file mode 100644 index 5c197853c521ae..00000000000000 --- a/local-cli/core/__fixtures__/files/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "react-native-vector-icons", - "version": "1.0.0", - "description": "Customizable Icons for React Native with support for NavBar/TabBar, image source and full styling. Choose from 3000+ bundled icons or use your own.", - "main": "index.js", - "bin": { - "generate-icon": "./generate-icon.js" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "rm -rf {Fonts,Entypo.js,EvilIcons.js,FontAwesome.js,Foundation.js,Ionicons.js,MaterialIcons.js,Octicons.js,Zocial.js} && mkdir Fonts && npm run build-entypo && npm run build-evilicons && npm run build-fontawesome && npm run build-foundation && npm run build-ionicons && npm run build-materialicons && npm run build-octicons && npm run build-zocial", - "build-entypo": "mkdir -p tmp/svg && curl https://dl.dropboxusercontent.com/u/4339492/entypo.zip > tmp/entypo.zip && unzip -j tmp/entypo.zip *.svg -x __MACOSX/* -d tmp/svg && fontcustom compile tmp/svg -o tmp -n Entypo -t css -h && node generate-icon tmp/Entypo.css --componentName=Entypo --fontFamily=Entypo > Entypo.js && cp tmp/Entypo.ttf Fonts && rm -rf {tmp,.fontcustom-manifest.json}", - "build-evilicons": "fontcustom compile node_modules/evil-icons/assets/icons -o tmp -n EvilIcons -t css -h && node generate-icon tmp/EvilIcons.css --prefix=.icon-ei- --componentName=EvilIcons --fontFamily=EvilIcons > EvilIcons.js && cp tmp/EvilIcons.ttf Fonts && rm -rf {tmp,.fontcustom-manifest.json}", - "build-fontawesome": "node generate-icon node_modules/font-awesome/css/font-awesome.css --prefix=.fa- --componentName=FontAwesome --fontFamily=FontAwesome > FontAwesome.js && cp node_modules/font-awesome/fonts/fontawesome-webfont.ttf Fonts/FontAwesome.ttf", - "build-foundation": "node generate-icon bower_components/foundation-icon-fonts/foundation-icons.css --prefix=.fi- --componentName=Foundation --fontFamily=fontcustom > Foundation.js && cp bower_components/foundation-icon-fonts/foundation-icons.ttf Fonts/Foundation.ttf", - "build-ionicons": "node generate-icon bower_components/ionicons/css/ionicons.css --prefix=.ion- --componentName=Ionicons --fontFamily=Ionicons > Ionicons.js && cp bower_components/ionicons/fonts/ionicons.ttf Fonts/Ionicons.ttf", - "build-materialicons": "mkdir -p tmp/svg && for f in ./node_modules/material-design-icons/*/svg/production/ic_*_48px.svg; do t=${f/*\\/ic_/}; t=${t/_48px/}; cp \"$f\" \"./tmp/svg/${t//_/-}\"; done && fontcustom compile tmp/svg -o tmp -n MaterialIcons -t css -h && node generate-icon tmp/MaterialIcons.css --componentName=MaterialIcons --fontFamily=MaterialIcons > MaterialIcons.js && cp tmp/MaterialIcons.ttf Fonts && rm -rf {tmp,.fontcustom-manifest.json}", - "build-octicons": "node generate-icon bower_components/octicons/octicons/octicons.css --prefix=.octicon- --componentName=Octicons --fontFamily=octicons > Octicons.js && cp bower_components/octicons/octicons/octicons.ttf Fonts/Octicons.ttf", - "build-zocial": "node generate-icon bower_components/css-social-buttons/css/zocial.css --prefix=.zocial. --componentName=Zocial --fontFamily=zocial > Zocial.js && cp bower_components/css-social-buttons/css/zocial.ttf Fonts/Zocial.ttf" - }, - "keywords": [ - "react-native", - "react-component", - "react-native-component", - "react", - "mobile", - "ios", - "android", - "ui", - "icon", - "icons", - "vector", - "retina", - "font" - ], - "author": { - "name": "Joel Arvidsson", - "email": "joel@oblador.se" - }, - "homepage": "https://github.com/oblador/react-native-vector-icons", - "bugs": { - "url": "https://github.com/oblador/react-native-vector-icons/issues" - }, - "repository": { - "type": "git", - "url": "git://github.com/oblador/react-native-vector-icons.git" - }, - "license": "MIT", - "peerDependencies": { - "react-native": ">=0.4.0 || 0.5.0-rc1 || 0.6.0-rc || 0.7.0-rc || 0.7.0-rc.2 || 0.8.0-rc || 0.8.0-rc.2 || 0.9.0-rc || 0.10.0-rc || 0.11.0-rc || 0.12.0-rc || 0.13.0-rc || 0.14.0-rc || 0.15.0-rc || 0.16.0-rc" - }, - "dependencies": { - "lodash": "^4.17.10", - "yargs": "^3.30.0", - "rnpm-plugin-test": "*" - }, - "devDependencies": { - "evil-icons": "^1.7.6", - "font-awesome": "^4.4.0", - "material-design-icons": "^2.1.1" - } -} diff --git a/local-cli/core/__fixtures__/files/project.pbxproj b/local-cli/core/__fixtures__/files/project.pbxproj deleted file mode 100644 index b27d06606be3c2..00000000000000 --- a/local-cli/core/__fixtures__/files/project.pbxproj +++ /dev/null @@ -1,804 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { -/* Begin PBXBuildFile section */ - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; - 00E356F31AD99517003FC87E /* androidTestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* androidTestTests.m */; }; - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 672DE8B31B124B8088D0D29F /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B5255B7628A54AC2A9B4B2A0 /* libBVLinearGradient.a */; }; - 68FEB18F24414EF981BD7940 /* libCodePush.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C67FE8F7294B7A83790610 /* libCodePush.a */; }; - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - C6C437D070BA42D6BE39198B /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A7396DFBAFA4CA092E367F5 /* libRCTVideo.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTActionSheet; - }; - 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTGeolocation; - }; - 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5115D1A9E6B3D00147676; - remoteInfo = RCTImage; - }; - 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B511DB1A9E6C8500147676; - remoteInfo = RCTNetwork; - }; - 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; - remoteInfo = RCTVibration; - }; - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = androidTest; - }; - 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTSettings; - }; - 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3C86DF461ADF2C930047B81A; - remoteInfo = RCTWebSocket; - }; - 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; - remoteInfo = React; - }; - 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTLinking; - }; - 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5119B1A9E6C1200147676; - remoteInfo = RCTText; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* androidTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = androidTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* androidTestTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = androidTestTests.m; sourceTree = ""; }; - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* androidTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = androidTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = androidTest/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = androidTest/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = androidTest/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = androidTest/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = androidTest/main.m; sourceTree = ""; }; - 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 53C67FE8F7294B7A83790610 /* libCodePush.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libCodePush.a; sourceTree = ""; }; - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - B5255B7628A54AC2A9B4B2A0 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; - 467A6CBCB2164E7D9B673D4C /* CodePush.xcodeproj */ = {isa = PBXFileReference; name = "CodePush.xcodeproj"; path = "../node_modules/react-native-code-push/CodePush.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - FD7121847BA447D8B737F22A /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; name = "BVLinearGradient.xcodeproj"; path = "../node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - 409DA945815C46DEB4F254DB /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; name = "RCTVideo.xcodeproj"; path = "../node_modules/react-native-video/RCTVideo.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - 3A7396DFBAFA4CA092E367F5 /* libRCTVideo.a */ = {isa = PBXFileReference; name = "libRCTVideo.a"; path = "libRCTVideo.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 146834051AC3E58100842450 /* libReact.a in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 672DE8B31B124B8088D0D29F /* libBVLinearGradient.a in Frameworks */, - 68FEB18F24414EF981BD7940 /* libCodePush.a in Frameworks */, - C6C437D070BA42D6BE39198B /* libRCTVideo.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00C302A81ABCB8CE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302B61ABCB90400DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302BC1ABCB91800DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302D41ABCB9D200DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302E01ABCB9EE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, - ); - name = Products; - sourceTree = ""; - }; - 00E356EF1AD99517003FC87E /* androidTestTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* androidTestTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = androidTestTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 139105B71AF99BAD00B5F7CC /* Products */ = { - isa = PBXGroup; - children = ( - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, - ); - name = Products; - sourceTree = ""; - }; - 139FDEE71B06529A00C62182 /* Products */ = { - isa = PBXGroup; - children = ( - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, - ); - name = Products; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* androidTest */ = { - isa = PBXGroup; - children = ( - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = androidTest; - sourceTree = ""; - }; - 146834001AC3E56700842450 /* Products */ = { - isa = PBXGroup; - children = ( - 146834041AC3E56700842450 /* libReact.a */, - ); - name = Products; - sourceTree = ""; - }; - 78C398B11ACF4ADC00677621 /* Products */ = { - isa = PBXGroup; - children = ( - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, - ); - name = Products; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - 146833FF1AC3E56700842450 /* React.xcodeproj */, - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - 467A6CBCB2164E7D9B673D4C /* CodePush.xcodeproj */, - FD7121847BA447D8B737F22A /* BVLinearGradient.xcodeproj */, - 409DA945815C46DEB4F254DB /* RCTVideo.xcodeproj */, - ); - name = Libraries; - sourceTree = ""; - }; - 832341B11AAA6A8300B99B32 /* Products */ = { - isa = PBXGroup; - children = ( - 832341B51AAA6A8300B99B32 /* libRCTText.a */, - ); - name = Products; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* androidTest */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* androidTestTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* androidTest.app */, - 00E356EE1AD99517003FC87E /* androidTestTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* androidTestTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "androidTestTests" */; - buildPhases = ( - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = androidTestTests; - productName = androidTestTests; - productReference = 00E356EE1AD99517003FC87E /* androidTestTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* androidTest */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "androidTest" */; - buildPhases = ( - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = androidTest; - productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* androidTest.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 610; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "androidTest" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; - ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - }, - { - ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; - ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - }, - { - ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; - ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - }, - { - ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; - ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - }, - { - ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; - ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - }, - { - ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; - ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - }, - { - ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; - ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - }, - { - ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; - ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - }, - { - ProductGroup = 139FDEE71B06529A00C62182 /* Products */; - ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - }, - { - ProductGroup = 146834001AC3E56700842450 /* Products */; - ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* androidTest */, - 00E356ED1AD99517003FC87E /* androidTestTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTActionSheet.a; - remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTGeolocation.a; - remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTImage.a; - remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTNetwork.a; - remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTVibration.a; - remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTSettings.a; - remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebSocket.a; - remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 146834041AC3E56700842450 /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTLinking.a; - remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTText.a; - remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "../node_modules/react-native/scripts/react-native-xcode.sh"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* androidTestTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* androidTest */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = androidTest; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = androidTestTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidTest.app/androidTest"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = androidTestTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidTest.app/androidTest"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEAD_CODE_STRIPPING = NO; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)", - "$(SRCROOT)/../node_modules/react-native-code-push", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/**", - "$(SRCROOT)/../node_modules/react-native-video", - ); - INFOPLIST_FILE = androidTest/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = androidTest; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)", - "$(SRCROOT)/../node_modules/react-native-code-push", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/**", - "$(SRCROOT)/../node_modules/react-native-video", - ); - INFOPLIST_FILE = androidTest/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = androidTest; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* 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; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)", - "$(SRCROOT)/../node_modules/react-native-code-push", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/**", - "$(SRCROOT)/../node_modules/react-native-video", - ); - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* 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 = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)", - "$(SRCROOT)/../node_modules/react-native-code-push", - "$(SRCROOT)/../node_modules/react-native-linear-gradient/**", - "$(SRCROOT)/../node_modules/react-native-video", - ); - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "androidTestTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "androidTest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "androidTest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/local-cli/core/__fixtures__/ios.js b/local-cli/core/__fixtures__/ios.js deleted file mode 100644 index 1792f67309ed25..00000000000000 --- a/local-cli/core/__fixtures__/ios.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = jest.requireActual('fs'); -const path = require('path'); - -exports.valid = { - 'demoProject.xcodeproj': { - 'project.pbxproj': fs.readFileSync( - path.join(__dirname, './files/project.pbxproj'), - ), - }, - 'TestPod.podspec': 'empty', -}; - -exports.validTestName = { - 'MyTestProject.xcodeproj': { - 'project.pbxproj': fs.readFileSync( - path.join(__dirname, './files/project.pbxproj'), - ), - }, -}; - -exports.pod = { - 'TestPod.podspec': 'empty', -}; diff --git a/local-cli/core/__fixtures__/projects.js b/local-cli/core/__fixtures__/projects.js deleted file mode 100644 index c3d42d693ba6eb..00000000000000 --- a/local-cli/core/__fixtures__/projects.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const android = require('./android'); -const ios = require('./ios'); - -const flat = { - android: android.valid, - ios: ios.valid, - Podfile: 'empty', -}; - -const nested = { - android: { - app: android.valid, - }, - ios: ios.valid, -}; - -const withExamples = { - Examples: flat, - ios: ios.valid, - android: android.valid, -}; - -const withPods = { - Podfile: 'content', - ios: ios.pod, -}; - -module.exports = {flat, nested, withExamples, withPods}; diff --git a/local-cli/core/__tests__/android/findAndroidAppFolder.spec.js b/local-cli/core/__tests__/android/findAndroidAppFolder.spec.js deleted file mode 100644 index 331dfe8e178c64..00000000000000 --- a/local-cli/core/__tests__/android/findAndroidAppFolder.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const fs = require('fs'); -const findAndroidAppFolder = require('../../android/findAndroidAppFolder'); -const mocks = require('../../__fixtures__/android'); - -describe('android::findAndroidAppFolder', () => { - beforeAll(() => { - fs.__setMockFilesystem({ - empty: {}, - nested: { - android: { - app: mocks.valid, - }, - }, - flat: { - android: mocks.valid, - }, - }); - }); - - it('returns an android app folder if it exists in the given folder', () => { - expect(findAndroidAppFolder('/flat')).toBe('android'); - expect(findAndroidAppFolder('/nested')).toBe('android/app'); - }); - - it('returns `null` if there is no android app folder', () => { - expect(findAndroidAppFolder('/empty')).toBeNull(); - }); -}); diff --git a/local-cli/core/__tests__/android/findManifest.spec.js b/local-cli/core/__tests__/android/findManifest.spec.js deleted file mode 100644 index 242b20a7471347..00000000000000 --- a/local-cli/core/__tests__/android/findManifest.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const findManifest = require('../../android/findManifest'); -const fs = require('fs'); -const mocks = require('../../__fixtures__/android'); - -describe('android::findManifest', () => { - beforeAll(() => { - fs.__setMockFilesystem({ - empty: {}, - flat: { - android: mocks.valid, - }, - }); - }); - - it('returns a manifest path if file exists in the folder', () => { - expect(typeof findManifest('/flat')).toBe('string'); - }); - - it('returns `null` if there is no manifest in the folder', () => { - expect(findManifest('/empty')).toBeNull(); - }); -}); diff --git a/local-cli/core/__tests__/android/findPackageClassName.spec.js b/local-cli/core/__tests__/android/findPackageClassName.spec.js deleted file mode 100644 index 5c15fd658bb6e3..00000000000000 --- a/local-cli/core/__tests__/android/findPackageClassName.spec.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const mocks = require('../../__fixtures__/android'); -const findPackageClassName = require('../../android/findPackageClassName'); -const fs = require('fs'); - -['posix', 'win32'].forEach(platform => { - let root; - describe(`android::findPackageClassName (${platform})`, () => { - beforeAll(() => { - root = fs.__setMockFilesystem( - { - empty: {}, - flatJava: { - android: mocks.valid, - }, - flatKotlin: { - android: mocks.validKotlin, - }, - }, - platform, - ); - }); - - it('returns manifest content if file exists in the folder', () => { - expect(typeof findPackageClassName(root + 'flatJava')).toBe('string'); - }); - - it('returns the name of the java class implementing ReactPackage', () => { - expect(findPackageClassName(root + 'flatJava')).toBe( - 'SomeExampleJavaPackage', - ); - }); - - it('returns the name of the kotlin class implementing ReactPackage', () => { - expect(findPackageClassName(root + 'flatKotlin')).toBe( - 'SomeExampleKotlinPackage', - ); - }); - - it('returns `null` if there are no matches', () => { - expect(findPackageClassName(root + 'empty')).toBeNull(); - }); - }); -}); diff --git a/local-cli/core/__tests__/android/getDependencyConfig.spec.js b/local-cli/core/__tests__/android/getDependencyConfig.spec.js deleted file mode 100644 index 7a43db319c719b..00000000000000 --- a/local-cli/core/__tests__/android/getDependencyConfig.spec.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const getDependencyConfig = require('../../android').dependencyConfig; -const fs = require('fs'); -const mocks = require('../../__fixtures__/android'); - -const userConfig = {}; - -describe('android::getDependencyConfig', () => { - beforeAll(() => { - fs.__setMockFilesystem({ - empty: {}, - nested: { - android: { - app: mocks.valid, - }, - }, - corrupted: { - android: { - app: mocks.corrupted, - }, - }, - noPackage: { - android: {}, - }, - }); - }); - - it('returns an object with android project configuration', () => { - expect(getDependencyConfig('/nested', userConfig)).not.toBeNull(); - expect(typeof getDependencyConfig('/nested', userConfig)).toBe('object'); - }); - - it('returns `null` if manifest file has not been found', () => { - expect(getDependencyConfig('/empty', userConfig)).toBeNull(); - }); - - it('returns `null` if android project was not found', () => { - expect(getDependencyConfig('/empty', userConfig)).toBeNull(); - }); - - it('returns `null` if android project does not contain ReactPackage', () => { - expect(getDependencyConfig('/noPackage', userConfig)).toBeNull(); - }); - - it('returns `null` if it cannot find a packageClassName', () => { - expect(getDependencyConfig('/corrupted', userConfig)).toBeNull(); - }); -}); diff --git a/local-cli/core/__tests__/android/getProjectConfig.spec.js b/local-cli/core/__tests__/android/getProjectConfig.spec.js deleted file mode 100644 index 863138c9507c7f..00000000000000 --- a/local-cli/core/__tests__/android/getProjectConfig.spec.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const getProjectConfig = require('../../android').projectConfig; -const fs = require('fs'); -const mocks = require('../../__fixtures__/android'); - -describe('android::getProjectConfig', () => { - beforeAll(() => { - fs.__setMockFilesystem({ - empty: {}, - nested: { - android: { - app: mocks.valid, - }, - }, - flat: { - android: mocks.valid, - }, - multiple: { - android: mocks.userConfigManifest, - }, - noManifest: { - android: {}, - }, - }); - }); - - it("returns `null` if manifest file hasn't been found and userConfig is not defined", () => { - const userConfig = undefined; - const folder = '/noManifest'; - - expect(getProjectConfig(folder, userConfig)).toBeNull(); - }); - - it("returns `null` if manifest file hasn't been found", () => { - const userConfig = {}; - const folder = '/noManifest'; - - expect(getProjectConfig(folder, userConfig)).toBeNull(); - }); - - describe('returns an object with android project configuration for', () => { - it('nested structure', () => { - const userConfig = {}; - const folder = '/nested'; - - expect(getProjectConfig(folder, userConfig)).not.toBeNull(); - expect(typeof getProjectConfig(folder, userConfig)).toBe('object'); - }); - - it('flat structure', () => { - const userConfig = {}; - const folder = '/flat'; - - expect(getProjectConfig(folder, userConfig)).not.toBeNull(); - expect(typeof getProjectConfig(folder, userConfig)).toBe('object'); - }); - - it('multiple', () => { - const userConfig = { - manifestPath: 'src/main/AndroidManifest.xml', - }; - const folder = '/multiple'; - - expect(getProjectConfig(folder, userConfig)).not.toBeNull(); - expect(typeof getProjectConfig(folder, userConfig)).toBe('object'); - }); - }); - - it('should return `null` if android project was not found', () => { - const userConfig = {}; - const folder = '/empty'; - - expect(getProjectConfig(folder, userConfig)).toBeNull(); - }); -}); diff --git a/local-cli/core/__tests__/android/readManifest.spec.js b/local-cli/core/__tests__/android/readManifest.spec.js deleted file mode 100644 index 2b8f41e4f5f8ab..00000000000000 --- a/local-cli/core/__tests__/android/readManifest.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const findManifest = require('../../android/findManifest'); -const readManifest = require('../../android/readManifest'); -const fs = require('fs'); -const mocks = require('../../__fixtures__/android'); - -describe('android::readManifest', () => { - beforeAll(() => { - fs.__setMockFilesystem({ - empty: {}, - nested: { - android: { - app: mocks.valid, - }, - }, - }); - }); - - it('returns manifest content if file exists in the folder', () => { - const manifestPath = findManifest('/nested'); - expect(readManifest(manifestPath)).not.toBeNull(); - expect(typeof readManifest(manifestPath)).toBe('object'); - }); - - it('throws an error if there is no manifest in the folder', () => { - const fakeManifestPath = findManifest('/empty'); - expect(() => { - readManifest(fakeManifestPath); - }).toThrow(); - }); -}); diff --git a/local-cli/core/__tests__/findAssets.spec.js b/local-cli/core/__tests__/findAssets.spec.js deleted file mode 100644 index cf880b23df2901..00000000000000 --- a/local-cli/core/__tests__/findAssets.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const findAssets = require('../findAssets'); -const dependencies = require('../__fixtures__/dependencies'); -const fs = require('fs'); - -describe('findAssets', () => { - beforeEach(() => { - fs.__setMockFilesystem({testDir: dependencies.withAssets}); - }); - - it('returns an array of all files in given folders', () => { - const assets = findAssets('/testDir', ['fonts', 'images']); - - expect(Array.isArray(assets)).toBeTruthy(); - expect(assets).toHaveLength(3); - }); - - it('prepends assets paths with the folder path', () => { - const assets = findAssets('/testDir', ['fonts', 'images']); - - assets.forEach(assetPath => { - expect(assetPath).toContain('testDir'); - }); - }); - - it('returns an empty array if given assets are null', () => { - expect(findAssets('/testDir', null)).toHaveLength(0); - }); -}); diff --git a/local-cli/core/__tests__/findPlugins.spec.js b/local-cli/core/__tests__/findPlugins.spec.js deleted file mode 100644 index 6d350da542f7d8..00000000000000 --- a/local-cli/core/__tests__/findPlugins.spec.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const findPlugins = require('../findPlugins'); -const path = require('path'); - -const ROOT = path.join(__dirname, '..', '..', '..'); -const pjsonPath = path.join(ROOT, 'package.json'); - -describe('findPlugins', () => { - beforeEach(() => { - jest.resetModules(); - }); - - it('returns an array of dependencies', () => { - jest.mock(pjsonPath, () => ({ - dependencies: {'rnpm-plugin-test': '*'}, - })); - - expect(findPlugins([ROOT])).toHaveProperty('commands'); - expect(findPlugins([ROOT])).toHaveProperty('platforms'); - expect(findPlugins([ROOT]).commands).toHaveLength(1); - expect(findPlugins([ROOT]).commands[0]).toBe('rnpm-plugin-test'); - expect(findPlugins([ROOT]).platforms).toHaveLength(0); - }); - - it('returns an empty array if there are no plugins in this folder', () => { - jest.mock(pjsonPath, () => ({})); - expect(findPlugins([ROOT])).toHaveProperty('commands'); - expect(findPlugins([ROOT])).toHaveProperty('platforms'); - expect(findPlugins([ROOT]).commands).toHaveLength(0); - expect(findPlugins([ROOT]).platforms).toHaveLength(0); - }); - - it('returns an object with empty arrays if there is no package.json in the supplied folder', () => { - expect(findPlugins(['fake-path'])).toHaveProperty('commands'); - expect(findPlugins(['fake-path'])).toHaveProperty('platforms'); - expect(findPlugins(['fake-path']).commands).toHaveLength(0); - expect(findPlugins(['fake-path']).platforms).toHaveLength(0); - }); - - it('returns plugins from both dependencies and dev dependencies', () => { - jest.mock(pjsonPath, () => ({ - dependencies: {'rnpm-plugin-test': '*'}, - devDependencies: {'rnpm-plugin-test-2': '*'}, - })); - expect(findPlugins([ROOT])).toHaveProperty('commands'); - expect(findPlugins([ROOT])).toHaveProperty('platforms'); - expect(findPlugins([ROOT]).commands).toHaveLength(2); - expect(findPlugins([ROOT]).platforms).toHaveLength(0); - }); - - it('returns unique list of plugins', () => { - jest.mock(pjsonPath, () => ({ - dependencies: {'rnpm-plugin-test': '*'}, - devDependencies: {'rnpm-plugin-test': '*'}, - })); - expect(findPlugins([ROOT]).commands).toHaveLength(1); - }); - - it('returns plugins in scoped modules', () => { - jest.mock(pjsonPath, () => ({ - dependencies: { - '@org/rnpm-plugin-test': '*', - '@org/react-native-test': '*', - '@react-native/test': '*', - '@react-native-org/test': '*', - }, - })); - - expect(findPlugins([ROOT])).toHaveProperty('commands'); - expect(findPlugins([ROOT])).toHaveProperty('platforms'); - expect(findPlugins([ROOT]).commands[0]).toBe('@org/rnpm-plugin-test'); - }); -}); diff --git a/local-cli/core/__tests__/ios/findPodfilePath.spec.js b/local-cli/core/__tests__/ios/findPodfilePath.spec.js deleted file mode 100644 index 227d2451250765..00000000000000 --- a/local-cli/core/__tests__/ios/findPodfilePath.spec.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const findPodfilePath = require('../../ios/findPodfilePath'); -const fs = require('fs'); -const projects = require('../../__fixtures__/projects'); -const ios = require('../../__fixtures__/ios'); - -describe('ios::findPodfilePath', () => { - it('returns null if there is no Podfile', () => { - fs.__setMockFilesystem(ios.valid); - expect(findPodfilePath('')).toBeNull(); - }); - - it('returns Podfile path if it exists', () => { - fs.__setMockFilesystem(projects.withPods); - expect(findPodfilePath('/ios')).toContain('Podfile'); - }); -}); diff --git a/local-cli/core/__tests__/ios/findPodspecName.spec.js b/local-cli/core/__tests__/ios/findPodspecName.spec.js deleted file mode 100644 index 14d73cd7d82dc2..00000000000000 --- a/local-cli/core/__tests__/ios/findPodspecName.spec.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const findPodspecName = require('../../ios/findPodspecName'); -const fs = require('fs'); -const projects = require('../../__fixtures__/projects'); -const ios = require('../../__fixtures__/ios'); - -describe('ios::findPodspecName', () => { - it('returns null if there is not podspec file', () => { - fs.__setMockFilesystem(projects.flat); - expect(findPodspecName('')).toBeNull(); - }); - - it('returns podspec name if only one exists', () => { - fs.__setMockFilesystem(ios.pod); - expect(findPodspecName('/')).toBe('TestPod'); - }); - - it('returns podspec name that match packet directory', () => { - fs.__setMockFilesystem({ - user: { - PacketName: { - 'Another.podspec': 'empty', - 'PacketName.podspec': 'empty', - }, - }, - }); - expect(findPodspecName('/user/PacketName')).toBe('PacketName'); - }); - - it('returns first podspec name if not match in directory', () => { - fs.__setMockFilesystem({ - user: { - packet: { - 'Another.podspec': 'empty', - 'PacketName.podspec': 'empty', - }, - }, - }); - expect(findPodspecName('/user/packet')).toBe('Another'); - }); -}); diff --git a/local-cli/core/__tests__/ios/findProject.spec.js b/local-cli/core/__tests__/ios/findProject.spec.js deleted file mode 100644 index 0083e9bd0d7ea6..00000000000000 --- a/local-cli/core/__tests__/ios/findProject.spec.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const findProject = require('../../ios/findProject'); -const fs = require('fs'); -const projects = require('../../__fixtures__/projects'); -const ios = require('../../__fixtures__/ios'); - -describe('ios::findProject', () => { - it('returns path to xcodeproj if found', () => { - fs.__setMockFilesystem(projects.flat); - expect(findProject('/')).not.toBeNull(); - }); - - it('returns null if there are no projects', () => { - fs.__setMockFilesystem({testDir: projects}); - expect(findProject('/')).toBeNull(); - }); - - it('returns ios project regardless of its name', () => { - fs.__setMockFilesystem({ios: ios.validTestName}); - expect(findProject('/')).not.toBeNull(); - }); - - it('ignores node_modules', () => { - fs.__setMockFilesystem({node_modules: projects.flat}); - expect(findProject('/')).toBeNull(); - }); - - it('ignores Pods', () => { - fs.__setMockFilesystem({Pods: projects.flat}); - expect(findProject('/')).toBeNull(); - }); - - it('ignores Pods inside `ios` folder', () => { - fs.__setMockFilesystem({ - ios: { - Pods: projects.flat, - DemoApp: projects.flat.ios, - }, - }); - expect(findProject('/')).toBe('ios/DemoApp/demoProject.xcodeproj'); - }); - - it('ignores xcodeproj from example folders', () => { - fs.__setMockFilesystem({ - examples: projects.flat, - Examples: projects.flat, - example: projects.flat, - KeychainExample: projects.flat, - Zpp: projects.flat, - }); - - expect(findProject('/').toLowerCase()).not.toContain('example'); - }); - - it('ignores xcodeproj from sample folders', () => { - fs.__setMockFilesystem({ - samples: projects.flat, - Samples: projects.flat, - sample: projects.flat, - KeychainSample: projects.flat, - Zpp: projects.flat, - }); - - expect(findProject('/').toLowerCase()).not.toContain('sample'); - }); - - it('ignores xcodeproj from test folders at any level', () => { - fs.__setMockFilesystem({ - test: projects.flat, - IntegrationTests: projects.flat, - tests: projects.flat, - Zpp: { - tests: projects.flat, - src: projects.flat, - }, - }); - - expect(findProject('/').toLowerCase()).not.toContain('test'); - }); -}); diff --git a/local-cli/core/__tests__/ios/getProjectConfig.spec.js b/local-cli/core/__tests__/ios/getProjectConfig.spec.js deleted file mode 100644 index d1af61e4b2982f..00000000000000 --- a/local-cli/core/__tests__/ios/getProjectConfig.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -const getProjectConfig = require('../../ios').projectConfig; -const fs = require('fs'); -const projects = require('../../__fixtures__/projects'); - -describe('ios::getProjectConfig', () => { - const userConfig = {}; - - beforeEach(() => { - fs.__setMockFilesystem({testDir: projects}); - }); - - it('returns an object with ios project configuration', () => { - const folder = '/testDir/nested'; - - expect(getProjectConfig(folder, userConfig)).not.toBeNull(); - expect(typeof getProjectConfig(folder, userConfig)).toBe('object'); - }); - - it('returns `null` if ios project was not found', () => { - const folder = '/testDir/empty'; - - expect(getProjectConfig(folder, userConfig)).toBeNull(); - }); - - it('returns normalized shared library names', () => { - const projectConfig = getProjectConfig('/testDir/nested', { - sharedLibraries: ['libc++', 'libz.tbd', 'HealthKit', 'HomeKit.framework'], - }); - - expect(projectConfig.sharedLibraries).toEqual([ - 'libc++.tbd', - 'libz.tbd', - 'HealthKit.framework', - 'HomeKit.framework', - ]); - }); -}); diff --git a/local-cli/core/__tests__/makeCommand.spec.js b/local-cli/core/__tests__/makeCommand.spec.js deleted file mode 100644 index c9842efa861622..00000000000000 --- a/local-cli/core/__tests__/makeCommand.spec.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -let spawnError = false; - -jest.setMock('child_process', { - spawn: () => ({ - on: (event, cb) => cb(spawnError), - }), -}); - -const makeCommand = require('../makeCommand'); - -describe('makeCommand', () => { - const command = makeCommand('echo'); - - it('generates a function around shell command', () => { - expect(typeof command).toBe('function'); - }); - - it('throws an error if there is no callback provided', () => { - expect(command).toThrow(); - }); - - it('invokes a callback after command execution', () => { - const spy = jest.fn(); - command(spy); - expect(spy.mock.calls).toHaveLength(1); - }); - - it('throws an error if spawn ended up with error', () => { - spawnError = true; - const cb = jest.fn(); - expect(() => { - command(cb); - }).toThrow(); - }); -}); diff --git a/local-cli/core/android/findAndroidAppFolder.js b/local-cli/core/android/findAndroidAppFolder.js deleted file mode 100644 index 41e1319a048ebe..00000000000000 --- a/local-cli/core/android/findAndroidAppFolder.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -/** - * @param {String} folder Folder to seek in - * @return {String} - */ -module.exports = function findAndroidAppFolder(folder) { - const flat = 'android'; - const nested = path.join('android', 'app'); - - if (fs.existsSync(path.join(folder, nested))) { - return nested; - } - - if (fs.existsSync(path.join(folder, flat))) { - return flat; - } - - return null; -}; diff --git a/local-cli/core/android/findManifest.js b/local-cli/core/android/findManifest.js deleted file mode 100644 index 4c04ed7cba4cf5..00000000000000 --- a/local-cli/core/android/findManifest.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const glob = require('glob'); -const path = require('path'); - -/** - * Find an android application path in the folder - * - * @param {String} folder Name of the folder where to seek - * @return {String} - */ -module.exports = function findManifest(folder) { - const manifestPath = glob.sync(path.join('**', 'AndroidManifest.xml'), { - cwd: folder, - ignore: ['node_modules/**', '**/build/**', 'Examples/**', 'examples/**'], - })[0]; - - return manifestPath ? path.join(folder, manifestPath) : null; -}; diff --git a/local-cli/core/android/findPackageClassName.js b/local-cli/core/android/findPackageClassName.js deleted file mode 100644 index a1bfaf6f232d2a..00000000000000 --- a/local-cli/core/android/findPackageClassName.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const glob = require('glob'); -const path = require('path'); - -/** - * Gets package's class name (class that implements ReactPackage) - * by searching for its declaration in all Java/Kotlin files present in the folder - * - * @param {String} folder Folder to find java/kt files - */ -module.exports = function getPackageClassName(folder) { - const files = glob.sync('**/+(*.java|*.kt)', {cwd: folder}); - - const packages = files - .map(filePath => fs.readFileSync(path.join(folder, filePath), 'utf8')) - .map(file => file.match(/class (.*) +(implements|:) ReactPackage/)) - .filter(match => match); - - return packages.length ? packages[0][1] : null; -}; diff --git a/local-cli/core/android/index.js b/local-cli/core/android/index.js deleted file mode 100644 index 2106ed7a9a7753..00000000000000 --- a/local-cli/core/android/index.js +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const findAndroidAppFolder = require('./findAndroidAppFolder'); -const findManifest = require('./findManifest'); -const findPackageClassName = require('./findPackageClassName'); -const path = require('path'); -const readManifest = require('./readManifest'); - -const getPackageName = manifest => manifest.attr.package; - -/** - * Gets android project config by analyzing given folder and taking some - * defaults specified by user into consideration - */ -exports.projectConfig = function projectConfigAndroid(folder, userConfig = {}) { - const src = userConfig.sourceDir || findAndroidAppFolder(folder); - - if (!src) { - return null; - } - - const sourceDir = path.join(folder, src); - const isFlat = sourceDir.indexOf('app') === -1; - const manifestPath = userConfig.manifestPath - ? path.join(sourceDir, userConfig.manifestPath) - : findManifest(sourceDir); - - if (!manifestPath) { - return null; - } - - const manifest = readManifest(manifestPath); - - const packageName = userConfig.packageName || getPackageName(manifest); - - if (!packageName) { - throw new Error(`Package name not found in ${manifestPath}`); - } - - const packageFolder = - userConfig.packageFolder || packageName.replace(/\./g, path.sep); - - const mainFilePath = path.join( - sourceDir, - userConfig.mainFilePath || - `src/main/java/${packageFolder}/MainApplication.java`, - ); - - const stringsPath = path.join( - sourceDir, - userConfig.stringsPath || 'src/main/res/values/strings.xml', - ); - - const settingsGradlePath = path.join( - folder, - 'android', - userConfig.settingsGradlePath || 'settings.gradle', - ); - - const assetsPath = path.join( - sourceDir, - userConfig.assetsPath || 'src/main/assets', - ); - - const buildGradlePath = path.join( - sourceDir, - userConfig.buildGradlePath || 'build.gradle', - ); - - return { - sourceDir, - isFlat, - folder, - stringsPath, - manifestPath, - buildGradlePath, - settingsGradlePath, - assetsPath, - mainFilePath, - }; -}; - -/** - * Same as projectConfigAndroid except it returns - * different config that applies to packages only - */ -exports.dependencyConfig = function dependencyConfigAndroid( - folder, - userConfig = {}, -) { - const src = userConfig.sourceDir || findAndroidAppFolder(folder); - - if (!src) { - return null; - } - - const sourceDir = path.join(folder, src); - const manifestPath = userConfig.manifestPath - ? path.join(sourceDir, userConfig.manifestPath) - : findManifest(sourceDir); - - if (!manifestPath) { - return null; - } - - const manifest = readManifest(manifestPath); - const packageName = userConfig.packageName || getPackageName(manifest); - const packageClassName = findPackageClassName(sourceDir); - - /** - * This module has no package to export - */ - if (!packageClassName) { - return null; - } - - const packageImportPath = - userConfig.packageImportPath || - `import ${packageName}.${packageClassName};`; - - const packageInstance = - userConfig.packageInstance || `new ${packageClassName}()`; - - return {sourceDir, folder, manifest, packageImportPath, packageInstance}; -}; - -exports.linkConfig = require('../../link/android'); diff --git a/local-cli/core/android/readManifest.js b/local-cli/core/android/readManifest.js deleted file mode 100644 index 159cb601d70a59..00000000000000 --- a/local-cli/core/android/readManifest.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const xml = require('xmldoc'); - -/** - * @param {String} manifestPath - * @return {XMLDocument} Parsed manifest's content - */ -module.exports = function readManifest(manifestPath) { - return new xml.XmlDocument(fs.readFileSync(manifestPath, 'utf8')); -}; diff --git a/local-cli/core/findAssets.js b/local-cli/core/findAssets.js deleted file mode 100644 index a06596d1016325..00000000000000 --- a/local-cli/core/findAssets.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const glob = require('glob'); -const path = require('path'); - -const findAssetsInFolder = folder => - glob.sync(path.join(folder, '**'), {nodir: true}); - -/** - * Given an array of assets folders, e.g. ['Fonts', 'Images'], - * it globs in them to find all files that can be copied. - * - * It returns an array of absolute paths to files found. - */ -module.exports = function findAssets(folder, assets) { - return (assets || []) - .map(assetsFolder => path.join(folder, assetsFolder)) - .reduce( - (_assets, assetsFolder) => - _assets.concat(findAssetsInFolder(assetsFolder)), - [], - ); -}; diff --git a/local-cli/core/findPlugins.js b/local-cli/core/findPlugins.js deleted file mode 100644 index 7d76b5b6f5f05e..00000000000000 --- a/local-cli/core/findPlugins.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const path = require('path'); -const union = require('lodash').union; -const uniq = require('lodash').uniq; -const flatten = require('lodash').flatten; - -const RNPM_PLUGIN_PATTERNS = [/^rnpm-plugin-/, /^@(.*)\/rnpm-plugin-/]; - -const REACT_NATIVE_PLUGIN_PATTERNS = [ - /^react-native-/, - /^@(.*)\/react-native-/, - /^@react-native(.*)\/(?!rnpm-plugin-)/, -]; - -/** - * Filter dependencies by name pattern - * @param {String} dependency Name of the dependency - * @return {Boolean} If dependency is a rnpm plugin - */ -const isRNPMPlugin = dependency => - RNPM_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency)); -const isReactNativePlugin = dependency => - REACT_NATIVE_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency)); - -const readPackage = folder => { - try { - return require(path.join(folder, 'package.json')); - } catch (e) { - return null; - } -}; - -const findPluginsInReactNativePackage = pjson => { - if (!pjson.rnpm || !pjson.rnpm.plugin) { - return []; - } - - return path.join(pjson.name, pjson.rnpm.plugin); -}; - -const findPlatformsInPackage = pjson => { - if (!pjson.rnpm || !pjson.rnpm.platform) { - return []; - } - - return path.join(pjson.name, pjson.rnpm.platform); -}; - -const getEmptyPluginConfig = () => ({ - commands: [], - platforms: [], - haste: { - platforms: [], - providesModuleNodeModules: [], - }, -}); - -const findHasteConfigInPackageAndConcat = (pjson, haste) => { - if (!pjson.rnpm || !pjson.rnpm.haste) { - return; - } - let pkgHaste = pjson.rnpm.haste; - - if (pkgHaste.platforms) { - haste.platforms = haste.platforms.concat(pkgHaste.platforms); - } - - if (pkgHaste.providesModuleNodeModules) { - haste.providesModuleNodeModules = haste.providesModuleNodeModules.concat( - pkgHaste.providesModuleNodeModules, - ); - } -}; - -const findPluginInFolder = folder => { - const pjson = readPackage(folder); - - if (!pjson) { - return getEmptyPluginConfig(); - } - - const deps = union( - Object.keys(pjson.dependencies || {}), - Object.keys(pjson.devDependencies || {}), - ); - - return deps.reduce((acc, pkg) => { - let commands = acc.commands; - let platforms = acc.platforms; - let haste = acc.haste; - if (isRNPMPlugin(pkg)) { - commands = commands.concat(pkg); - } - if (isReactNativePlugin(pkg)) { - const pkgJson = readPackage(path.join(folder, 'node_modules', pkg)); - if (pkgJson) { - commands = commands.concat(findPluginsInReactNativePackage(pkgJson)); - platforms = platforms.concat(findPlatformsInPackage(pkgJson)); - findHasteConfigInPackageAndConcat(pkgJson, haste); - } - } - return {commands: commands, platforms: platforms, haste: haste}; - }, getEmptyPluginConfig()); -}; - -/** - * Find plugins in package.json of the given folder - * @param {String} folder Path to the folder to get the package.json from - * @type {Object} Object of commands and platform plugins - */ -module.exports = function findPlugins(folders) { - const plugins = folders.map(findPluginInFolder); - return { - commands: uniq(flatten(plugins.map(p => p.commands))), - platforms: uniq(flatten(plugins.map(p => p.platforms))), - haste: { - platforms: uniq(flatten(plugins.map(p => p.haste.platforms))), - providesModuleNodeModules: uniq( - flatten(plugins.map(p => p.haste.providesModuleNodeModules)), - ), - }, - }; -}; diff --git a/local-cli/core/index.js b/local-cli/core/index.js deleted file mode 100644 index 438dadd55b2216..00000000000000 --- a/local-cli/core/index.js +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -const android = require('./android'); -const Config = require('../util/Config'); -const findPlugins = require('./findPlugins'); -const findAssets = require('./findAssets'); -const ios = require('./ios'); -const wrapCommands = require('./wrapCommands'); -const {ASSET_REGISTRY_PATH} = require('./Constants'); - -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const flatten = require('lodash').flatten; -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const minimist = require('minimist'); -const path = require('path'); - -import type {CommandT} from '../commands'; -import type {ConfigT} from 'metro-config/src/configTypes.flow'; - -export type RNConfig = { - ...ConfigT, - /** - * Returns an object with all platform configurations. - */ - getPlatformConfig(): Object, - /** - * Returns project config from the current working directory - */ - getProjectConfig(): Object, - /** - * Returns dependency config from /packageName - */ - getDependencyConfig(pkgName: string): Object, -}; - -const getRNPMConfig = folder => - // $FlowFixMe non-literal require - require(path.join(folder, './package.json')).rnpm || {}; - -const attachPackage = (command, pkg) => - Array.isArray(command) - ? command.map(cmd => attachPackage(cmd, pkg)) - : {...command, pkg}; - -const appRoot = process.cwd(); -const plugins = findPlugins([appRoot]); -const pluginPlatforms = plugins.platforms.reduce((acc, pathToPlatforms) => { - return Object.assign( - acc, - // $FlowFixMe non-literal require - require(path.join(appRoot, 'node_modules', pathToPlatforms)), - ); -}, {}); - -const defaultConfig = { - hasteImplModulePath: require.resolve('../../jest/hasteImpl'), - - getPlatforms(): Array { - return ['ios', 'android', 'native', ...plugins.haste.platforms]; - }, - - getProvidesModuleNodeModules(): Array { - return ['react-native', ...plugins.haste.providesModuleNodeModules]; - }, -}; - -const defaultRNConfig = { - getPlatformConfig(): Object { - return { - ios, - android, - ...pluginPlatforms, - }; - }, - - getProjectConfig(): Object { - const platforms = this.getPlatformConfig(); - const folder = process.cwd(); - const rnpm = getRNPMConfig(folder); - - let config = Object.assign({}, rnpm, { - assets: findAssets(folder, rnpm.assets), - }); - - Object.keys(platforms).forEach(key => { - config[key] = platforms[key].projectConfig(folder, rnpm[key] || {}); - }); - - return config; - }, - - getDependencyConfig(packageName: string) { - const platforms = this.getPlatformConfig(); - const folder = path.join(process.cwd(), 'node_modules', packageName); - const rnpm = getRNPMConfig(folder); - - let config = Object.assign({}, rnpm, { - assets: findAssets(folder, rnpm.assets), - commands: wrapCommands(rnpm.commands), - params: rnpm.params || [], - }); - - Object.keys(platforms).forEach(key => { - config[key] = platforms[key].dependencyConfig(folder, rnpm[key] || {}); - }); - - return config; - }, -}; - -/** - * Loads the CLI configuration - */ -async function getCliConfig(): Promise { - const cliArgs = minimist(process.argv.slice(2)); - const config = await Config.load( - cliArgs.config != null ? path.resolve(__dirname, cliArgs.config) : null, - ); - - // $FlowFixMe Metro configuration is immutable. - config.transformer.assetRegistryPath = ASSET_REGISTRY_PATH; - config.resolver.hasteImplModulePath = - config.resolver.hasteImplModulePath || defaultConfig.hasteImplModulePath; - config.resolver.platforms = config.resolver.platforms - ? config.resolver.platforms.concat(defaultConfig.getPlatforms()) - : defaultConfig.getPlatforms(); - config.resolver.providesModuleNodeModules = config.resolver - .providesModuleNodeModules - ? config.resolver.providesModuleNodeModules.concat( - defaultConfig.getProvidesModuleNodeModules(), - ) - : defaultConfig.getProvidesModuleNodeModules(); - - return {...defaultRNConfig, ...config}; -} - -/** - * Returns an array of project commands used by the CLI to load - */ -function getProjectCommands(): Array { - const commands = plugins.commands.map(pathToCommands => { - const name = - pathToCommands[0] === '@' - ? pathToCommands - .split(path.sep) - .slice(0, 2) - .join(path.sep) - : pathToCommands.split(path.sep)[0]; - - return attachPackage( - require(path.join(appRoot, 'node_modules', pathToCommands)), - require(path.join(appRoot, 'node_modules', name, 'package.json')), - ); - }); - - return flatten(commands); -} - -module.exports.configPromise = getCliConfig(); -module.exports.getProjectCommands = getProjectCommands; diff --git a/local-cli/core/ios/findPodfilePath.js b/local-cli/core/ios/findPodfilePath.js deleted file mode 100644 index 67232535468f5e..00000000000000 --- a/local-cli/core/ios/findPodfilePath.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -module.exports = function findPodfilePath(projectFolder) { - const podFilePath = path.join(projectFolder, '..', 'Podfile'); - const podFileExists = fs.existsSync(podFilePath); - - return podFileExists ? podFilePath : null; -}; diff --git a/local-cli/core/ios/findPodspecName.js b/local-cli/core/ios/findPodspecName.js deleted file mode 100644 index 1041a0a99916f7..00000000000000 --- a/local-cli/core/ios/findPodspecName.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const glob = require('glob'); -const path = require('path'); - -module.exports = function findPodspecName(folder) { - const podspecs = glob.sync('*.podspec', {cwd: folder}); - let podspecFile = null; - if (podspecs.length === 0) { - return null; - } else if (podspecs.length === 1) { - podspecFile = podspecs[0]; - } else { - const folderParts = folder.split(path.sep); - const currentFolder = folderParts[folderParts.length - 1]; - const toSelect = podspecs.indexOf(currentFolder + '.podspec'); - if (toSelect === -1) { - podspecFile = podspecs[0]; - } else { - podspecFile = podspecs[toSelect]; - } - } - - return podspecFile.replace('.podspec', ''); -}; diff --git a/local-cli/core/ios/findProject.js b/local-cli/core/ios/findProject.js deleted file mode 100644 index d98695d67fb370..00000000000000 --- a/local-cli/core/ios/findProject.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const glob = require('glob'); -const path = require('path'); - -/** - * Glob pattern to look for xcodeproj - */ -const GLOB_PATTERN = '**/*.xcodeproj'; - -/** - * Regexp matching all test projects - */ -const TEST_PROJECTS = /test|example|sample/i; - -/** - * Base iOS folder - */ -const IOS_BASE = 'ios'; - -/** - * These folders will be excluded from search to speed it up - */ -const GLOB_EXCLUDE_PATTERN = ['**/@(Pods|node_modules)/**']; - -/** - * Finds iOS project by looking for all .xcodeproj files - * in given folder. - * - * Returns first match if files are found or null - * - * Note: `./ios/*.xcodeproj` are returned regardless of the name - */ -module.exports = function findProject(folder) { - const projects = glob - .sync(GLOB_PATTERN, { - cwd: folder, - ignore: GLOB_EXCLUDE_PATTERN, - }) - .filter(project => { - return path.dirname(project) === IOS_BASE || !TEST_PROJECTS.test(project); - }) - .sort((projectA, projectB) => { - return path.dirname(projectA) === IOS_BASE ? -1 : 1; - }); - - if (projects.length === 0) { - return null; - } - - return projects[0]; -}; diff --git a/local-cli/core/ios/index.js b/local-cli/core/ios/index.js deleted file mode 100644 index df876115046faf..00000000000000 --- a/local-cli/core/ios/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const findProject = require('./findProject'); -const findPodfilePath = require('./findPodfilePath'); -const findPodspecName = require('./findPodspecName'); -const path = require('path'); - -/** - * For libraries specified without an extension, add '.tbd' for those that - * start with 'lib' and '.framework' to the rest. - */ -const mapSharedLibaries = libraries => { - return libraries.map(name => { - if (path.extname(name)) { - return name; - } - return name + (name.indexOf('lib') === 0 ? '.tbd' : '.framework'); - }); -}; - -/** - * Returns project config by analyzing given folder and applying some user defaults - * when constructing final object - */ -exports.projectConfig = function projectConfigIOS(folder, userConfig) { - const project = userConfig.project || findProject(folder); - - /** - * No iOS config found here - */ - if (!project) { - return null; - } - - const projectPath = path.join(folder, project); - - return { - sourceDir: path.dirname(projectPath), - folder: folder, - pbxprojPath: path.join(projectPath, 'project.pbxproj'), - podfile: findPodfilePath(projectPath), - podspec: findPodspecName(folder), - projectPath: projectPath, - projectName: path.basename(projectPath), - libraryFolder: userConfig.libraryFolder || 'Libraries', - sharedLibraries: mapSharedLibaries(userConfig.sharedLibraries || []), - plist: userConfig.plist || [], - }; -}; - -exports.dependencyConfig = exports.projectConfig; - -exports.linkConfig = require('../../link/ios'); diff --git a/local-cli/core/makeCommand.js b/local-cli/core/makeCommand.js deleted file mode 100644 index d1d0fe8194f525..00000000000000 --- a/local-cli/core/makeCommand.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const spawn = require('child_process').spawn; - -module.exports = function makeCommand(command) { - return cb => { - if (!cb) { - throw new Error( - `You missed a callback function for the ${command} command`, - ); - } - - const args = command.split(' '); - const cmd = args.shift(); - - const commandProcess = spawn(cmd, args, { - stdio: 'inherit', - stdin: 'inherit', - }); - - commandProcess.on('close', function prelink(code) { - if (code) { - throw new Error(`Error occurred during executing "${command}" command`); - } - - cb(); - }); - }; -}; diff --git a/local-cli/core/wrapCommands.js b/local-cli/core/wrapCommands.js deleted file mode 100644 index 1f3ce34ab3f582..00000000000000 --- a/local-cli/core/wrapCommands.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const makeCommand = require('./makeCommand'); - -module.exports = function wrapCommands(commands) { - const mappedCommands = {}; - Object.keys(commands || []).forEach(k => { - mappedCommands[k] = makeCommand(commands[k]); - }); - return mappedCommands; -}; diff --git a/local-cli/dependencies/dependencies.js b/local-cli/dependencies/dependencies.js deleted file mode 100644 index 192926a84d1063..00000000000000 --- a/local-cli/dependencies/dependencies.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const Metro = require('metro'); - -const denodeify = require('denodeify'); -const fs = require('fs'); -const path = require('path'); - -async function dependencies(argv, configPromise, args, packagerInstance) { - const rootModuleAbsolutePath = args.entryFile; - const config = await configPromise; - if (!fs.existsSync(rootModuleAbsolutePath)) { - return Promise.reject( - new Error(`File ${rootModuleAbsolutePath} does not exist`), - ); - } - - config.cacheStores = []; - - const relativePath = path.relative( - config.projectRoot, - rootModuleAbsolutePath, - ); - - const options = { - platform: args.platform, - entryFile: relativePath, - dev: args.dev, - minify: false, - generateSourceMaps: !args.dev, - }; - - const writeToFile = args.output; - const outStream = writeToFile - ? fs.createWriteStream(args.output) - : process.stdout; - - const deps = packagerInstance - ? await packagerInstance.getOrderedDependencyPaths(options) - : await Metro.getOrderedDependencyPaths(config, options); - - deps.forEach(modulePath => { - // Temporary hack to disable listing dependencies not under this directory. - // Long term, we need either - // (a) JS code to not depend on anything outside this directory, or - // (b) Come up with a way to declare this dependency in Buck. - const isInsideProjectRoots = - config.watchFolders.filter(root => modulePath.startsWith(root)).length > - 0; - - if (isInsideProjectRoots) { - outStream.write(modulePath + '\n'); - } - }); - return writeToFile - ? denodeify(outStream.end).bind(outStream)() - : Promise.resolve(); -} - -module.exports = { - name: 'dependencies', - description: 'lists dependencies', - func: dependencies, - options: [ - { - command: '--entry-file ', - description: 'Absolute path to the root JS file', - }, - { - command: '--output [path]', - description: - 'File name where to store the output, ex. /tmp/dependencies.txt', - }, - { - command: '--platform [extension]', - description: 'The platform extension used for selecting modules', - }, - { - command: '--transformer [path]', - description: 'Specify a custom transformer to be used', - }, - { - command: '--max-workers [number]', - description: - 'Specifies the maximum number of workers the worker-pool ' + - 'will spawn for transforming files. This defaults to the number of the ' + - 'cores available on your machine.', - parse: (workers: string) => Number(workers), - }, - { - command: '--dev [boolean]', - description: 'If false, skip all dev-only code path', - parse: val => (val === 'false' ? false : true), - default: true, - }, - { - command: '--verbose', - description: 'Enables logging', - default: false, - }, - ], -}; diff --git a/local-cli/eject/eject.js b/local-cli/eject/eject.js deleted file mode 100644 index ff7d085be54f43..00000000000000 --- a/local-cli/eject/eject.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const copyProjectTemplateAndReplace = require('../generator/copyProjectTemplateAndReplace'); -const path = require('path'); -const fs = require('fs'); - -/** - * The eject command re-creates the `android` and `ios` native folders. Because native code can be - * difficult to maintain, this new script allows an `app.json` to be defined for the project, which - * is used to configure the native app. - * - * The `app.json` config may contain the following keys: - * - * - `name` - The short name used for the project, should be TitleCase - * - `displayName` - The app's name on the home screen - */ - -function eject() { - const doesIOSExist = fs.existsSync(path.resolve('ios')); - const doesAndroidExist = fs.existsSync(path.resolve('android')); - if (doesIOSExist && doesAndroidExist) { - console.error( - 'Both the iOS and Android folders already exist! Please delete `ios` and/or `android` ' + - 'before ejecting.', - ); - process.exit(1); - } - - let appConfig = null; - try { - appConfig = require(path.resolve('app.json')); - } catch (e) { - console.error( - 'Eject requires an `app.json` config file to be located at ' + - `${path.resolve( - 'app.json', - )}, and it must at least specify a \`name\` for the project ` + - "name, and a `displayName` for the app's home screen label.", - ); - process.exit(1); - } - - const appName = appConfig.name; - if (!appName) { - console.error( - 'App `name` must be defined in the `app.json` config file to define the project name. ' + - 'It must not contain any spaces or dashes.', - ); - process.exit(1); - } - const displayName = appConfig.displayName; - if (!displayName) { - console.error( - 'App `displayName` must be defined in the `app.json` config file, to define the label ' + - 'of the app on the home screen.', - ); - process.exit(1); - } - - const templateOptions = {displayName}; - - if (!doesIOSExist) { - console.log('Generating the iOS folder.'); - copyProjectTemplateAndReplace( - path.resolve( - 'node_modules', - 'react-native', - 'local-cli', - 'templates', - 'HelloWorld', - 'ios', - ), - path.resolve('ios'), - appName, - templateOptions, - ); - } - - if (!doesAndroidExist) { - console.log('Generating the Android folder.'); - copyProjectTemplateAndReplace( - path.resolve( - 'node_modules', - 'react-native', - 'local-cli', - 'templates', - 'HelloWorld', - 'android', - ), - path.resolve('android'), - appName, - templateOptions, - ); - } -} - -module.exports = { - name: 'eject', - description: 'Re-create the iOS and Android folders and native code', - func: eject, - options: [], -}; diff --git a/local-cli/generator/copyProjectTemplateAndReplace.js b/local-cli/generator/copyProjectTemplateAndReplace.js deleted file mode 100644 index 8f04b439faeb30..00000000000000 --- a/local-cli/generator/copyProjectTemplateAndReplace.js +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const chalk = require('chalk'); -const copyAndReplace = require('../util/copyAndReplace'); -const path = require('path'); -const prompt = require('./promptSync')(); -const walk = require('../util/walk'); - -/** - * Util for creating a new React Native project. - * Copy the project from a template and use the correct project name in - * all files. - * @param srcPath e.g. '/Users/martin/AwesomeApp/node_modules/react-native/local-cli/templates/HelloWorld' - * @param destPath e.g. '/Users/martin/AwesomeApp' - * @param newProjectName e.g. 'AwesomeApp' - * @param options e.g. { - * upgrade: true, - * force: false, - * displayName: 'Hello World', - * ignorePaths: ['template/file/to/ignore.md'], - * } - */ -function copyProjectTemplateAndReplace( - srcPath, - destPath, - newProjectName, - options, -) { - if (!srcPath) { - throw new Error('Need a path to copy from'); - } - if (!destPath) { - throw new Error('Need a path to copy to'); - } - if (!newProjectName) { - throw new Error('Need a project name'); - } - - options = options || {}; - - walk(srcPath).forEach(absoluteSrcFilePath => { - // 'react-native upgrade' - if (options.upgrade) { - // Don't upgrade these files - const fileName = path.basename(absoluteSrcFilePath); - // This also includes __tests__/index.*.js - if (fileName === 'index.ios.js') { - return; - } - if (fileName === 'index.android.js') { - return; - } - if (fileName === 'index.js') { - return; - } - if (fileName === 'App.js') { - return; - } - } - - const relativeFilePath = path.relative(srcPath, absoluteSrcFilePath); - const relativeRenamedPath = translateFilePath(relativeFilePath) - .replace(/HelloWorld/g, newProjectName) - .replace(/helloworld/g, newProjectName.toLowerCase()); - - // Templates may contain files that we don't want to copy. - // Examples: - // - Dummy package.json file included in the template only for publishing to npm - // - Docs specific to the template (.md files) - if (options.ignorePaths) { - if (!Array.isArray(options.ignorePaths)) { - throw new Error('options.ignorePaths must be an array'); - } - if ( - options.ignorePaths.some(ignorePath => ignorePath === relativeFilePath) - ) { - // Skip copying this file - return; - } - } - - let contentChangedCallback = null; - if (options.upgrade && !options.force) { - contentChangedCallback = (_, contentChanged) => { - return upgradeFileContentChangedCallback( - absoluteSrcFilePath, - relativeRenamedPath, - contentChanged, - ); - }; - } - copyAndReplace( - absoluteSrcFilePath, - path.resolve(destPath, relativeRenamedPath), - { - 'Hello App Display Name': options.displayName || newProjectName, - HelloWorld: newProjectName, - helloworld: newProjectName.toLowerCase(), - }, - contentChangedCallback, - ); - }); -} - -/** - * There are various files in the templates folder in the RN repo. We want - * these to be ignored by tools when working with React Native itself. - * Example: _babelrc file is ignored by Babel, renamed to .babelrc inside - * a real app folder. - * This is especially important for .gitignore because npm has some special - * behavior of automatically renaming .gitignore to .npmignore. - */ -function translateFilePath(path) { - if (!path) { - return path; - } - return path - .replace('_BUCK', 'BUCK') - .replace('_gitignore', '.gitignore') - .replace('_gitattributes', '.gitattributes') - .replace('_babelrc', '.babelrc') - .replace('_flowconfig', '.flowconfig') - .replace('_buckconfig', '.buckconfig') - .replace('_watchmanconfig', '.watchmanconfig'); -} - -function upgradeFileContentChangedCallback( - absoluteSrcFilePath, - relativeDestPath, - contentChanged, -) { - if (contentChanged === 'new') { - console.log(chalk.bold('new') + ' ' + relativeDestPath); - return 'overwrite'; - } else if (contentChanged === 'changed') { - console.log( - chalk.bold(relativeDestPath) + - ' ' + - 'has changed in the new version.\nDo you want to keep your ' + - relativeDestPath + - ' or replace it with the ' + - 'latest version?\nIf you ever made any changes ' + - "to this file, you'll probably want to keep it.\n" + - 'You can see the new version here: ' + - absoluteSrcFilePath + - '\n' + - 'Do you want to replace ' + - relativeDestPath + - '? ' + - 'Answer y to replace, n to keep your version: ', - ); - const answer = prompt(); - if (answer === 'y') { - console.log('Replacing ' + relativeDestPath); - return 'overwrite'; - } else { - console.log('Keeping your ' + relativeDestPath); - return 'keep'; - } - } else if (contentChanged === 'identical') { - return 'keep'; - } else { - throw new Error( - `Unknown file changed state: ${relativeDestPath}, ${contentChanged}`, - ); - } -} - -module.exports = copyProjectTemplateAndReplace; diff --git a/local-cli/generator/printRunInstructions.js b/local-cli/generator/printRunInstructions.js deleted file mode 100644 index 7110f646a7f4b0..00000000000000 --- a/local-cli/generator/printRunInstructions.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -var chalk = require('chalk'); -var path = require('path'); - -function printRunInstructions(projectDir, projectName) { - const absoluteProjectDir = path.resolve(projectDir); - // iOS - const xcodeProjectPath = - path.resolve(projectDir, 'ios', projectName) + '.xcodeproj'; - const relativeXcodeProjectPath = path.relative( - process.cwd(), - xcodeProjectPath, - ); - console.log(chalk.white.bold('To run your app on iOS:')); - console.log(' cd ' + absoluteProjectDir); - console.log(' react-native run-ios'); - console.log(' - or -'); - console.log(' Open ' + relativeXcodeProjectPath + ' in Xcode'); - console.log(' Hit the Run button'); - // Android - console.log(chalk.white.bold('To run your app on Android:')); - console.log(' cd ' + absoluteProjectDir); - console.log( - ' Have an Android emulator running (quickest way to get started), or a device connected', - ); - console.log(' react-native run-android'); -} - -module.exports = printRunInstructions; diff --git a/local-cli/generator/promptSync.js b/local-cli/generator/promptSync.js deleted file mode 100644 index c8af74c487a3a7..00000000000000 --- a/local-cli/generator/promptSync.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -// Simplified version of: -// https://github.com/0x00A/prompt-sync/blob/master/index.js - -'use strict'; - -var fs = require('fs'); -var term = 13; // carriage return - -function create() { - return prompt; - - function prompt(ask, value, opts) { - var insert = 0; - opts = opts || {}; - - if (Object(ask) === ask) { - opts = ask; - ask = opts.ask; - } else if (Object(value) === value) { - opts = value; - value = opts.value; - } - ask = ask || ''; - var echo = opts.echo; - var masked = 'echo' in opts; - - var fd = - process.platform === 'win32' - ? process.stdin.fd - : fs.openSync('/dev/tty', 'rs'); - - var wasRaw = process.stdin.isRaw; - if (!wasRaw) { - process.stdin.setRawMode(true); - } - - var buf = new Buffer(3); - var str = '', - character, - read; - - if (ask) { - process.stdout.write(ask); - } - - while (true) { - read = fs.readSync(fd, buf, 0, 3); - if (read > 1) { - // received a control sequence - if (buf.toString()) { - str = str + buf.toString(); - str = str.replace(/\0/g, ''); - insert = str.length; - process.stdout.write('\u001b[2K\u001b[0G' + ask + str); - process.stdout.write('\u001b[' + (insert + ask.length + 1) + 'G'); - buf = new Buffer(3); - } - continue; // any other 3 character sequence is ignored - } - - // if it is not a control character seq, assume only one character is read - character = buf[read - 1]; - - // catch a ^C and return null - if (character === 3) { - process.stdout.write('^C\n'); - fs.closeSync(fd); - process.exit(130); - process.stdin.setRawMode(wasRaw); - return null; - } - - // catch the terminating character - if (character === term) { - fs.closeSync(fd); - break; - } - - if ( - character === 127 || - (process.platform === 'win32' && character === 8) - ) { - //backspace - if (!insert) { - continue; - } - str = str.slice(0, insert - 1) + str.slice(insert); - insert--; - process.stdout.write('\u001b[2D'); - } else { - if (character < 32 || character > 126) { - continue; - } - str = - str.slice(0, insert) + - String.fromCharCode(character) + - str.slice(insert); - insert++; - } - - if (masked) { - process.stdout.write( - '\u001b[2K\u001b[0G' + ask + Array(str.length + 1).join(echo), - ); - } else { - process.stdout.write('\u001b[s'); - if (insert === str.length) { - process.stdout.write('\u001b[2K\u001b[0G' + ask + str); - } else { - if (ask) { - process.stdout.write('\u001b[2K\u001b[0G' + ask + str); - } else { - process.stdout.write( - '\u001b[2K\u001b[0G' + - str + - '\u001b[' + - (str.length - insert) + - 'D', - ); - } - } - process.stdout.write('\u001b[u'); - process.stdout.write('\u001b[1C'); - } - } - - process.stdout.write('\n'); - - process.stdin.setRawMode(wasRaw); - - return str || value || ''; - } -} - -module.exports = create; diff --git a/local-cli/generator/templates.js b/local-cli/generator/templates.js deleted file mode 100644 index 54a09613b2b0cf..00000000000000 --- a/local-cli/generator/templates.js +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const copyProjectTemplateAndReplace = require('./copyProjectTemplateAndReplace'); -const execSync = require('child_process').execSync; -const fs = require('fs'); -const path = require('path'); - -/** - * @param destPath Create the new project at this path. - * @param newProjectName For example 'AwesomeApp'. - * @param template Template to use, for example 'navigation'. - * @param yarnVersion Version of yarn available on the system, or null if - * yarn is not available. For example '0.18.1'. - */ -function createProjectFromTemplate( - destPath, - newProjectName, - template, - yarnVersion, -) { - // Expand the basic 'HelloWorld' template - copyProjectTemplateAndReplace( - path.resolve( - 'node_modules', - 'react-native', - 'local-cli', - 'templates', - 'HelloWorld', - ), - destPath, - newProjectName, - ); - - if (template === undefined) { - // No specific template, use just the HelloWorld template above - return; - } - - // Keep the files from the 'HelloWorld' template, and overwrite some of them - // with the specified project template. - // The 'HelloWorld' template contains the native files (these are used by - // all templates) and every other template only contains additional JS code. - // Reason: - // This way we don't have to duplicate the native files in every template. - // If we duplicated them we'd make RN larger and risk that people would - // forget to maintain all the copies so they would go out of sync. - createFromRemoteTemplate(template, destPath, newProjectName, yarnVersion); -} - -/** - * The following formats are supported for the template: - * - 'demo' -> Fetch the package react-native-template-demo from npm - * - git://..., http://..., file://... or any other URL supported by npm - */ -function createFromRemoteTemplate( - template, - destPath, - newProjectName, - yarnVersion, -) { - let installPackage; - let templateName; - if (template.includes('://')) { - // URL, e.g. git://, file:// - installPackage = template; - templateName = template.substr(template.lastIndexOf('/') + 1); - } else { - // e.g 'demo' - installPackage = 'react-native-template-' + template; - templateName = installPackage; - } - - // Check if the template exists - console.log(`Fetching template ${installPackage}...`); - try { - if (yarnVersion) { - execSync(`yarn add ${installPackage} --ignore-scripts`, { - stdio: 'inherit', - }); - } else { - execSync( - `npm install ${installPackage} --save --save-exact --ignore-scripts`, - {stdio: 'inherit'}, - ); - } - const templatePath = path.resolve('node_modules', templateName); - copyProjectTemplateAndReplace(templatePath, destPath, newProjectName, { - // Every template contains a dummy package.json file included - // only for publishing the template to npm. - // We want to ignore this dummy file, otherwise it would overwrite - // our project's package.json file. - ignorePaths: [ - 'package.json', - 'dependencies.json', - 'devDependencies.json', - ], - }); - installTemplateDependencies(templatePath, yarnVersion); - installTemplateDevDependencies(templatePath, yarnVersion); - } finally { - // Clean up the temp files - try { - if (yarnVersion) { - execSync(`yarn remove ${templateName} --ignore-scripts`); - } else { - execSync(`npm uninstall ${templateName} --ignore-scripts`); - } - } catch (err) { - // Not critical but we still want people to know and report - // if this the clean up fails. - console.warn( - `Failed to clean up template temp files in node_modules/${templateName}. ` + - 'This is not a critical error, you can work on your app.', - ); - } - } -} - -function installTemplateDependencies(templatePath, yarnVersion) { - // dependencies.json is a special file that lists additional dependencies - // that are required by this template - const dependenciesJsonPath = path.resolve(templatePath, 'dependencies.json'); - console.log('Adding dependencies for the project...'); - if (!fs.existsSync(dependenciesJsonPath)) { - console.log('No additional dependencies.'); - return; - } - - let dependencies; - try { - dependencies = JSON.parse(fs.readFileSync(dependenciesJsonPath)); - } catch (err) { - throw new Error( - "Could not parse the template's dependencies.json: " + err.message, - ); - } - for (let depName in dependencies) { - const depVersion = dependencies[depName]; - const depToInstall = depName + '@' + depVersion; - console.log('Adding ' + depToInstall + '...'); - if (yarnVersion) { - execSync(`yarn add ${depToInstall}`, {stdio: 'inherit'}); - } else { - execSync(`npm install ${depToInstall} --save --save-exact`, { - stdio: 'inherit', - }); - } - } - console.log("Linking native dependencies into the project's build files..."); - execSync('react-native link', {stdio: 'inherit'}); -} - -function installTemplateDevDependencies(templatePath, yarnVersion) { - // devDependencies.json is a special file that lists additional develop dependencies - // that are required by this template - const devDependenciesJsonPath = path.resolve( - templatePath, - 'devDependencies.json', - ); - console.log('Adding develop dependencies for the project...'); - if (!fs.existsSync(devDependenciesJsonPath)) { - console.log('No additional develop dependencies.'); - return; - } - - let dependencies; - try { - dependencies = JSON.parse(fs.readFileSync(devDependenciesJsonPath)); - } catch (err) { - throw new Error( - "Could not parse the template's devDependencies.json: " + err.message, - ); - } - for (let depName in dependencies) { - const depVersion = dependencies[depName]; - const depToInstall = depName + '@' + depVersion; - console.log('Adding ' + depToInstall + '...'); - if (yarnVersion) { - execSync(`yarn add ${depToInstall} -D`, {stdio: 'inherit'}); - } else { - execSync(`npm install ${depToInstall} --save-dev --save-exact`, { - stdio: 'inherit', - }); - } - } -} - -module.exports = { - createProjectFromTemplate, -}; diff --git a/local-cli/info/info.js b/local-cli/info/info.js deleted file mode 100644 index 9f09de587c888b..00000000000000 --- a/local-cli/info/info.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const envinfo = require('envinfo'); - -const info = function() { - const args = Array.prototype.slice.call(arguments)[2]; - - try { - envinfo - .run( - { - System: ['OS', 'CPU', 'Memory', 'Shell'], - Binaries: ['Node', 'Yarn', 'npm', 'Watchman'], - IDEs: ['Xcode', 'Android Studio'], - SDKs: ['iOS SDK', 'Android SDK'], - npmPackages: - (typeof args.packages === 'string' && - !args.packages.includes('*')) || - !args.packages - ? ['react', 'react-native'].concat( - (args.packages || '').split(','), - ) - : args.packages, - npmGlobalPackages: '*react-native*', - }, - { - clipboard: !!args.clipboard, - title: 'React Native Environment Info', - }, - ) - .then(console.log) - .catch(err => { - console.log('Error: unable to print environment info'); - console.log(err); - }); - } catch (err) { - console.log('Error: unable to print environment info'); - console.log(err); - } -}; - -module.exports = { - name: 'info', - description: 'Get relevant version info about OS, toolchain and libraries', - options: [ - { - command: '--packages [string]', - description: - 'Which packages from your package.json to include, in addition to the default React Native and React versions.', - }, - { - command: '--clipboard [boolean]', - description: - 'Automagically copy the environment report output to the clipboard', - }, - ], - examples: [ - { - desc: 'Get standard version info', - cmd: 'react-native info', - }, - { - desc: 'Get standard version info & specified package versions', - cmd: 'react-native info --packages jest,eslint', - }, - { - desc: 'Get standard version info & globbed package versions', - cmd: 'react-native info --packages "*react*"', - }, - { - desc: 'Get standard version info & all package versions', - cmd: 'react-native info --packages', - }, - ], - func: info, -}; diff --git a/local-cli/init/init.js b/local-cli/init/init.js deleted file mode 100644 index cbb189533438bb..00000000000000 --- a/local-cli/init/init.js +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const {createProjectFromTemplate} = require('../generator/templates'); -const execSync = require('child_process').execSync; -const fs = require('fs'); -const minimist = require('minimist'); -const path = require('path'); -const printRunInstructions = require('../generator/printRunInstructions'); -const process = require('process'); -const yarn = require('../util/yarn'); - -/** - * Creates the template for a React Native project given the provided - * parameters: - * @param projectDir Templates will be copied here. - * @param argsOrName Project name or full list of custom arguments - * for the generator. - * @param options Command line options passed from the react-native-cli directly. - * E.g. `{ version: '0.43.0', template: 'navigation' }` - */ -function init(projectDir, argsOrName) { - const args = Array.isArray(argsOrName) - ? argsOrName // argsOrName was e.g. ['AwesomeApp', '--verbose'] - : [argsOrName].concat(process.argv.slice(4)); // argsOrName was e.g. 'AwesomeApp' - - // args array is e.g. ['AwesomeApp', '--verbose', '--template', 'navigation'] - if (!args || args.length === 0) { - console.error('react-native init requires a project name.'); - return; - } - - const newProjectName = args[0]; - const options = minimist(args); - - console.log('Setting up new React Native app in ' + projectDir); - generateProject(projectDir, newProjectName, options); -} - -/** - * Generates a new React Native project based on the template. - * @param Absolute path at which the project folder should be created. - * @param options Command line arguments parsed by minimist. - */ -function generateProject(destinationRoot, newProjectName, options) { - var reactNativePackageJson = require('../../package.json'); - var {peerDependencies} = reactNativePackageJson; - if (!peerDependencies) { - console.error( - "Missing React peer dependency in React Native's package.json. Aborting.", - ); - return; - } - - var reactVersion = peerDependencies.react; - if (!reactVersion) { - console.error( - "Missing React peer dependency in React Native's package.json. Aborting.", - ); - return; - } - - const yarnVersion = - !options.npm && - yarn.getYarnVersionIfAvailable() && - yarn.isGlobalCliUsingYarn(destinationRoot); - - createProjectFromTemplate( - destinationRoot, - newProjectName, - options.template, - yarnVersion, - ); - - if (yarnVersion) { - console.log('Adding React...'); - execSync(`yarn add react@${reactVersion}`, {stdio: 'inherit'}); - } else { - console.log('Installing React...'); - execSync(`npm install react@${reactVersion} --save --save-exact`, { - stdio: 'inherit', - }); - } - if (!options['skip-jest']) { - const jestDeps = `jest babel-jest metro-react-native-babel-preset react-test-renderer@${reactVersion}`; - if (yarnVersion) { - console.log('Adding Jest...'); - execSync(`yarn add ${jestDeps} --dev --exact`, {stdio: 'inherit'}); - } else { - console.log('Installing Jest...'); - execSync(`npm install ${jestDeps} --save-dev --save-exact`, { - stdio: 'inherit', - }); - } - addJestToPackageJson(destinationRoot); - } - printRunInstructions(destinationRoot, newProjectName); -} - -/** - * Add Jest-related stuff to package.json, which was created by the react-native-cli. - */ -function addJestToPackageJson(destinationRoot) { - var packageJSONPath = path.join(destinationRoot, 'package.json'); - var packageJSON = JSON.parse(fs.readFileSync(packageJSONPath)); - - packageJSON.scripts.test = 'jest'; - packageJSON.jest = { - preset: 'react-native', - }; - fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON, null, 2)); -} - -module.exports = init; diff --git a/local-cli/install/install.js b/local-cli/install/install.js deleted file mode 100644 index b15a3e6d50f279..00000000000000 --- a/local-cli/install/install.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const spawnSync = require('child_process').spawnSync; -const log = require('npmlog'); -const PackageManager = require('../util/PackageManager'); -const spawnOpts = { - stdio: 'inherit', - stdin: 'inherit', -}; - -log.heading = 'rnpm-install'; - -function install(args, config) { - const name = args[0]; - - let res = PackageManager.add(name); - - if (res.status) { - process.exit(res.status); - } - - res = spawnSync('react-native', ['link', name], spawnOpts); - - if (res.status) { - process.exit(res.status); - } - - log.info(`Module ${name} has been successfully installed & linked`); -} - -module.exports = { - func: install, - description: 'install and link native dependencies', - name: 'install ', -}; diff --git a/local-cli/install/uninstall.js b/local-cli/install/uninstall.js deleted file mode 100644 index 0963962204756a..00000000000000 --- a/local-cli/install/uninstall.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const spawnSync = require('child_process').spawnSync; -const log = require('npmlog'); -const PackageManager = require('../util/PackageManager'); -const spawnOpts = { - stdio: 'inherit', - stdin: 'inherit', -}; - -log.heading = 'rnpm-install'; - -function uninstall(args, config) { - const name = args[0]; - - var res = spawnSync('react-native', ['unlink', name], spawnOpts); - - if (res.status) { - process.exit(res.status); - } - - res = PackageManager.remove(name); - - if (res.status) { - process.exit(res.status); - } - - log.info(`Module ${name} has been successfully uninstalled & unlinked`); -} - -module.exports = { - func: uninstall, - description: 'uninstall and unlink native dependencies', - name: 'uninstall ', -}; diff --git a/local-cli/library/library.js b/local-cli/library/library.js deleted file mode 100644 index 23a82a1ee204bc..00000000000000 --- a/local-cli/library/library.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const copyAndReplace = require('../util/copyAndReplace'); -const fs = require('fs'); -const isValidPackageName = require('../util/isValidPackageName'); -const path = require('path'); -const walk = require('../util/walk'); - -/** - * Creates a new native library with the given name - */ -function library(argv, config, args) { - if (!isValidPackageName(args.name)) { - return Promise.reject( - args.name + - ' is not a valid name for a project. Please use a valid ' + - 'identifier name (alphanumeric).', - ); - } - - const root = process.cwd(); - const libraries = path.resolve(root, 'Libraries'); - const libraryDest = path.resolve(libraries, args.name); - const source = path.resolve( - 'node_modules', - 'react-native', - 'Libraries', - 'Sample', - ); - - if (!fs.existsSync(libraries)) { - fs.mkdirSync(libraries); - } - - if (fs.existsSync(libraryDest)) { - return Promise.reject( - new Error(`Library already exists in ${libraryDest}`), - ); - } - - walk(source).forEach(f => { - if ( - f.indexOf('project.xcworkspace') !== -1 || - f.indexOf('.xcodeproj/xcuserdata') !== -1 - ) { - return; - } - - const dest = path.relative( - source, - f.replace(/Sample/g, args.name).replace(/^_/, '.'), - ); - copyAndReplace(path.resolve(source, f), path.resolve(libraryDest, dest), { - Sample: args.name, - }); - }); - - console.log('Created library in', libraryDest); - console.log('Next Steps:'); - console.log(' Link your library in Xcode:'); - console.log( - ' https://facebook.github.io/react-native/docs/' + - 'linking-libraries-ios.html#content\n', - ); -} - -module.exports = { - name: 'new-library', - func: library, - description: 'generates a native library bridge', - options: [ - { - command: '--name ', - description: 'name of the library to generate', - default: null, - }, - ], -}; diff --git a/local-cli/link/__fixtures__/Info.plist b/local-cli/link/__fixtures__/Info.plist deleted file mode 100644 index b2e7b96ea03d4e..00000000000000 --- a/local-cli/link/__fixtures__/Info.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - - - diff --git a/local-cli/link/__fixtures__/android/0.17/MainActivity.java b/local-cli/link/__fixtures__/android/0.17/MainActivity.java deleted file mode 100644 index d0794b72b8e783..00000000000000 --- a/local-cli/link/__fixtures__/android/0.17/MainActivity.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.basic; - -import android.app.Activity; -import android.os.Bundle; -import android.view.KeyEvent; - -import com.facebook.react.LifecycleState; -import com.facebook.react.ReactInstanceManager; -import com.facebook.react.ReactRootView; -import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; -import com.facebook.react.shell.MainReactPackage; -import com.facebook.soloader.SoLoader; - -public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler { - - private ReactInstanceManager mReactInstanceManager; - private ReactRootView mReactRootView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mReactRootView = new ReactRootView(this); - - mReactInstanceManager = ReactInstanceManager.builder() - .setApplication(getApplication()) - .setBundleAssetName("index.android.bundle") - .setJSMainModuleName("index.android") - .addPackage(new MainReactPackage()) - .setUseDeveloperSupport(BuildConfig.DEBUG) - .setInitialLifecycleState(LifecycleState.RESUMED) - .build(); - - mReactRootView.startReactApplication(mReactInstanceManager, "Basic", null); - - setContentView(mReactRootView); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { - mReactInstanceManager.showDevOptionsDialog(); - return true; - } - return super.onKeyUp(keyCode, event); - } - - @Override - public void onBackPressed() { - if (mReactInstanceManager != null) { - mReactInstanceManager.onBackPressed(); - } else { - super.onBackPressed(); - } - } - - @Override - public void invokeDefaultOnBackPressed() { - super.onBackPressed(); - } - - @Override - protected void onPause() { - super.onPause(); - - if (mReactInstanceManager != null) { - mReactInstanceManager.onPause(); - } - } - - @Override - protected void onResume() { - super.onResume(); - - if (mReactInstanceManager != null) { - mReactInstanceManager.onResume(this, this); - } - } -} diff --git a/local-cli/link/__fixtures__/android/0.17/patchedMainActivity.java b/local-cli/link/__fixtures__/android/0.17/patchedMainActivity.java deleted file mode 100644 index 17c2b278d5be7f..00000000000000 --- a/local-cli/link/__fixtures__/android/0.17/patchedMainActivity.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.basic; - -import android.app.Activity; -import com.oblador.vectoricons.VectorIconsPackage; -import android.os.Bundle; -import android.view.KeyEvent; - -import com.facebook.react.LifecycleState; -import com.facebook.react.ReactInstanceManager; -import com.facebook.react.ReactRootView; -import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; -import com.facebook.react.shell.MainReactPackage; -import com.facebook.soloader.SoLoader; - -public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler { - - private ReactInstanceManager mReactInstanceManager; - private ReactRootView mReactRootView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mReactRootView = new ReactRootView(this); - - mReactInstanceManager = ReactInstanceManager.builder() - .setApplication(getApplication()) - .setBundleAssetName("index.android.bundle") - .setJSMainModuleName("index.android") - .addPackage(new MainReactPackage()) - .addPackage(new VectorIconsPackage()) - .setUseDeveloperSupport(BuildConfig.DEBUG) - .setInitialLifecycleState(LifecycleState.RESUMED) - .build(); - - mReactRootView.startReactApplication(mReactInstanceManager, "Basic", null); - - setContentView(mReactRootView); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { - mReactInstanceManager.showDevOptionsDialog(); - return true; - } - return super.onKeyUp(keyCode, event); - } - - @Override - public void onBackPressed() { - if (mReactInstanceManager != null) { - mReactInstanceManager.onBackPressed(); - } else { - super.onBackPressed(); - } - } - - @Override - public void invokeDefaultOnBackPressed() { - super.onBackPressed(); - } - - @Override - protected void onPause() { - super.onPause(); - - if (mReactInstanceManager != null) { - mReactInstanceManager.onPause(); - } - } - - @Override - protected void onResume() { - super.onResume(); - - if (mReactInstanceManager != null) { - mReactInstanceManager.onResume(this, this); - } - } -} diff --git a/local-cli/link/__fixtures__/android/0.18/MainActivity.java b/local-cli/link/__fixtures__/android/0.18/MainActivity.java deleted file mode 100644 index c630627442cbf2..00000000000000 --- a/local-cli/link/__fixtures__/android/0.18/MainActivity.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.testrn; - -import com.facebook.react.ReactActivity; -import com.facebook.react.ReactPackage; -import com.facebook.react.shell.MainReactPackage; - -import java.util.Arrays; -import java.util.List; - -public class MainActivity extends ReactActivity { - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "TestRN"; - } - - /** - * Returns whether dev mode should be enabled. - * This enables e.g. the dev menu. - */ - @Override - protected boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - /** - * A list of packages used by the app. If the app uses additional views - * or modules besides the default ones, add more packages here. - */ - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage()); - } -} diff --git a/local-cli/link/__fixtures__/android/0.18/patchedMainActivity.java b/local-cli/link/__fixtures__/android/0.18/patchedMainActivity.java deleted file mode 100644 index b099735c4185ed..00000000000000 --- a/local-cli/link/__fixtures__/android/0.18/patchedMainActivity.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.testrn; - -import com.facebook.react.ReactActivity; -import com.oblador.vectoricons.VectorIconsPackage; -import com.facebook.react.ReactPackage; -import com.facebook.react.shell.MainReactPackage; - -import java.util.Arrays; -import java.util.List; - -public class MainActivity extends ReactActivity { - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "TestRN"; - } - - /** - * Returns whether dev mode should be enabled. - * This enables e.g. the dev menu. - */ - @Override - protected boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - /** - * A list of packages used by the app. If the app uses additional views - * or modules besides the default ones, add more packages here. - */ - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage(), - new VectorIconsPackage()); - } -} diff --git a/local-cli/link/__fixtures__/android/0.20/MainActivity.java b/local-cli/link/__fixtures__/android/0.20/MainActivity.java deleted file mode 100644 index 642f4259c1ee0f..00000000000000 --- a/local-cli/link/__fixtures__/android/0.20/MainActivity.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.myawesomeproject; - -import com.facebook.react.ReactActivity; -import com.facebook.react.ReactPackage; -import com.facebook.react.shell.MainReactPackage; - -import java.util.Arrays; -import java.util.List; - -public class MainActivity extends ReactActivity { - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "TestRN"; - } - - /** - * Returns whether dev mode should be enabled. - * This enables e.g. the dev menu. - */ - @Override - protected boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - /** - * A list of packages used by the app. If the app uses additional views - * or modules besides the default ones, add more packages here. - */ - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage() - ); - } -} diff --git a/local-cli/link/__fixtures__/android/build.gradle b/local-cli/link/__fixtures__/android/build.gradle deleted file mode 100644 index f206d053ecdec2..00000000000000 --- a/local-cli/link/__fixtures__/android/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.android.support:appcompat-v7:27.1.1" - implementation "com.facebook.react:react-native:+" -} diff --git a/local-cli/link/__fixtures__/android/patchedBuild.gradle b/local-cli/link/__fixtures__/android/patchedBuild.gradle deleted file mode 100644 index f5cb4a24a8cd14..00000000000000 --- a/local-cli/link/__fixtures__/android/patchedBuild.gradle +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -dependencies { - implementation project(':test') - implementation(project(':test2')) { - exclude(group: 'org.unwanted', module: 'test10') - } - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.android.support:appcompat-v7:27.1.1" - implementation "com.facebook.react:react-native:+" -} diff --git a/local-cli/link/__fixtures__/android/patchedSettings.gradle b/local-cli/link/__fixtures__/android/patchedSettings.gradle deleted file mode 100644 index 2b311263ad815d..00000000000000 --- a/local-cli/link/__fixtures__/android/patchedSettings.gradle +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -rootProject.name = 'TestRN' - -include ':app' -include ':test' -project(':test').projectDir = new File(rootProject.projectDir, '../node_modules/test/android') diff --git a/local-cli/link/__fixtures__/android/settings.gradle b/local-cli/link/__fixtures__/android/settings.gradle deleted file mode 100644 index 5bb3d945cc14ae..00000000000000 --- a/local-cli/link/__fixtures__/android/settings.gradle +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -rootProject.name = 'TestRN' - -include ':app' diff --git a/local-cli/link/__fixtures__/linearGradient.pbxproj b/local-cli/link/__fixtures__/linearGradient.pbxproj deleted file mode 100644 index ca87c2e43e9e4a..00000000000000 --- a/local-cli/link/__fixtures__/linearGradient.pbxproj +++ /dev/null @@ -1,258 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - BBD49E3F1AC8DEF000610F8E /* BVLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */; }; - BBD49E401AC8DEF000610F8E /* BVLinearGradientManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 58B511D91A9E6C8500147676 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 134814201AA4EA6300B7C361 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBVLinearGradient.a; sourceTree = BUILT_PRODUCTS_DIR; }; - BBD49E391AC8DEF000610F8E /* BVLinearGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradient.h; sourceTree = ""; }; - BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradient.m; sourceTree = ""; }; - BBD49E3B1AC8DEF000610F8E /* BVLinearGradientManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradientManager.h; sourceTree = ""; }; - BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradientManager.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 58B511D81A9E6C8500147676 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 134814211AA4EA7D00B7C361 /* Products */ = { - isa = PBXGroup; - children = ( - 134814201AA4EA6300B7C361 /* libBVLinearGradient.a */, - ); - name = Products; - sourceTree = ""; - }; - 58B511D21A9E6C8500147676 = { - isa = PBXGroup; - children = ( - BBD49E391AC8DEF000610F8E /* BVLinearGradient.h */, - BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */, - BBD49E3B1AC8DEF000610F8E /* BVLinearGradientManager.h */, - BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */, - 134814211AA4EA7D00B7C361 /* Products */, - ); - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 58B511DA1A9E6C8500147676 /* BVLinearGradient */ = { - isa = PBXNativeTarget; - buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "BVLinearGradient" */; - buildPhases = ( - 58B511D71A9E6C8500147676 /* Sources */, - 58B511D81A9E6C8500147676 /* Frameworks */, - 58B511D91A9E6C8500147676 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = BVLinearGradient; - productName = RCTDataManager; - productReference = 134814201AA4EA6300B7C361 /* libBVLinearGradient.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 58B511D31A9E6C8500147676 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0610; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 58B511DA1A9E6C8500147676 = { - CreatedOnToolsVersion = 6.1.1; - }; - }; - }; - buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "BVLinearGradient" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 58B511D21A9E6C8500147676; - productRefGroup = 58B511D21A9E6C8500147676; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 58B511DA1A9E6C8500147676 /* BVLinearGradient */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 58B511D71A9E6C8500147676 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BBD49E3F1AC8DEF000610F8E /* BVLinearGradient.m in Sources */, - BBD49E401AC8DEF000610F8E /* BVLinearGradientManager.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 58B511ED1A9E6C8500147676 /* 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; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 58B511EE1A9E6C8500147676 /* 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; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 58B511F01A9E6C8500147676 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../React/**", - "$(SRCROOT)/../react-native/React/**", - ); - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = BVLinearGradient; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 58B511F11A9E6C8500147676 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../../React/**", - "$(SRCROOT)/../react-native/React/**", - ); - LIBRARY_SEARCH_PATHS = "$(inherited)"; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = BVLinearGradient; - SKIP_INSTALL = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "BVLinearGradient" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 58B511ED1A9E6C8500147676 /* Debug */, - 58B511EE1A9E6C8500147676 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "BVLinearGradient" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 58B511F01A9E6C8500147676 /* Debug */, - 58B511F11A9E6C8500147676 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 58B511D31A9E6C8500147676 /* Project object */; -} diff --git a/local-cli/link/__fixtures__/pods/PodfileSimple b/local-cli/link/__fixtures__/pods/PodfileSimple deleted file mode 100644 index 3e42c25278e1ad..00000000000000 --- a/local-cli/link/__fixtures__/pods/PodfileSimple +++ /dev/null @@ -1,8 +0,0 @@ -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '9.0' - -target 'Testing' do - pod 'TestPod', '~> 3.1' - - # test should point to this line -end diff --git a/local-cli/link/__fixtures__/pods/PodfileWithFunction b/local-cli/link/__fixtures__/pods/PodfileWithFunction deleted file mode 100644 index 13b70fb0a906eb..00000000000000 --- a/local-cli/link/__fixtures__/pods/PodfileWithFunction +++ /dev/null @@ -1,30 +0,0 @@ -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '9.0' - -target 'none' do - pod 'React', - :path => "../node_modules/react-native", - :subspecs => [ - "Core", - "ART", - "RCTActionSheet", - "RCTAnimation", - "RCTCameraRoll", - "RCTGeolocation", - "RCTImage", - "RCTNetwork", - "RCTText", - "RCTVibration", - "RCTWebSocket", - "DevSupport", - "BatchedBridge" - ] - - pod 'Yoga', - :path => "../node_modules/react-native/ReactCommon/yoga" - - # test should point to this line - post_install do |installer| - - end -end diff --git a/local-cli/link/__fixtures__/pods/PodfileWithMarkers b/local-cli/link/__fixtures__/pods/PodfileWithMarkers deleted file mode 100644 index bf27d33689ba28..00000000000000 --- a/local-cli/link/__fixtures__/pods/PodfileWithMarkers +++ /dev/null @@ -1,34 +0,0 @@ -source 'https://github.com/CocoaPods/Specs.git' -# platform :ios, '9.0' - -target 'None' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - # use_frameworks! - # Your 'node_modules' directory is probably in the root of your project, # but if not, adjust the `:path` accordingly - pod 'React', :path => '../node_modules/react-native', :subspecs => [ - 'Core', - 'RCTText', - 'RCTNetwork', - 'BatchedBridge', - 'RCTImage', - 'RCTWebSocket', # needed for debugging - # Add any other subspecs you want to use in your project - ] - - # Add new pods below this line - - # test should point to this line - target 'NoneTests' do - inherit! :search_paths - # Pods for testing - end -end - -target 'Second' do - - target 'NoneUITests' do - inherit! :search_paths - # Add new pods below this line - end - -end \ No newline at end of file diff --git a/local-cli/link/__fixtures__/pods/PodfileWithTarget b/local-cli/link/__fixtures__/pods/PodfileWithTarget deleted file mode 100644 index 5887ababea73b1..00000000000000 --- a/local-cli/link/__fixtures__/pods/PodfileWithTarget +++ /dev/null @@ -1,32 +0,0 @@ -source 'https://github.com/CocoaPods/Specs.git' -# platform :ios, '9.0' - -target 'None' do - # Uncomment the next line if you're using Swift or would like to use dynamic frameworks - # use_frameworks! - # Your 'node_modules' directory is probably in the root of your project, # but if not, adjust the `:path` accordingly - pod 'React', :path => '../node_modules/react-native', :subspecs => [ - 'Core', - 'RCTText', - 'RCTNetwork', - 'BatchedBridge', - 'RCTImage', - 'RCTWebSocket', # needed for debugging - # Add any other subspecs you want to use in your project - ] - - # Explicitly include Yoga if you are using RN >= 0.42.0 - pod "Yoga", :path => "../node_modules/react-native/ReactCommon/yoga" - - # test should point to this line - target 'NoneTests' do - inherit! :search_paths - # Pods for testing - end - - target 'NoneUITests' do - inherit! :search_paths - # Pods for testing - end - -end \ No newline at end of file diff --git a/local-cli/link/__fixtures__/project.pbxproj b/local-cli/link/__fixtures__/project.pbxproj deleted file mode 100644 index 428aa40c9ca1e6..00000000000000 --- a/local-cli/link/__fixtures__/project.pbxproj +++ /dev/null @@ -1,1011 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { -/* Begin PBXBuildFile section */ - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; - 00E356F31AD99517003FC87E /* BasicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* BasicTests.m */; }; - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTActionSheet; - }; - 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTGeolocation; - }; - 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5115D1A9E6B3D00147676; - remoteInfo = RCTImage; - }; - 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B511DB1A9E6C8500147676; - remoteInfo = RCTNetwork; - }; - 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; - remoteInfo = RCTVibration; - }; - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = Basic; - }; - 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTSettings; - }; - 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3C86DF461ADF2C930047B81A; - remoteInfo = RCTWebSocket; - }; - 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; - remoteInfo = React; - }; - 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; - remoteInfo = "RCTImage-tvOS"; - }; - 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28471D9B043800D4039D; - remoteInfo = "RCTLinking-tvOS"; - }; - 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28541D9B044C00D4039D; - remoteInfo = "RCTNetwork-tvOS"; - }; - 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28611D9B046600D4039D; - remoteInfo = "RCTSettings-tvOS"; - }; - 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A287B1D9B048500D4039D; - remoteInfo = "RCTText-tvOS"; - }; - 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28881D9B049200D4039D; - remoteInfo = "RCTWebSocket-tvOS"; - }; - 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28131D9B038B00D4039D; - remoteInfo = "React-tvOS"; - }; - 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C059A1DE3340900C268FA; - remoteInfo = yoga; - }; - 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C06751DE3340C00C268FA; - remoteInfo = "yoga-tvOS"; - }; - 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; - remoteInfo = cxxreact; - }; - 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; - remoteInfo = "cxxreact-tvOS"; - }; - 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; - remoteInfo = jschelpers; - }; - 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; - remoteInfo = "jschelpers-tvOS"; - }; - 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTAnimation; - }; - 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28201D9B03D100D4039D; - remoteInfo = "RCTAnimation-tvOS"; - }; - 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTLinking; - }; - 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5119B1A9E6C1200147676; - remoteInfo = RCTText; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* BasicTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BasicTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* BasicTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BasicTests.m; sourceTree = ""; }; - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* Basic.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Basic.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Basic/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Basic/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Basic/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Basic/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Basic/main.m; sourceTree = ""; }; - 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, - 146834051AC3E58100842450 /* libReact.a in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00C302A81ABCB8CE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302B61ABCB90400DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302BC1ABCB91800DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, - 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302D41ABCB9D200DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, - 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302E01ABCB9EE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, - ); - name = Products; - sourceTree = ""; - }; - 00E356EF1AD99517003FC87E /* BasicTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* BasicTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = BasicTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 139105B71AF99BAD00B5F7CC /* Products */ = { - isa = PBXGroup; - children = ( - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, - 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 139FDEE71B06529A00C62182 /* Products */ = { - isa = PBXGroup; - children = ( - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, - 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* Basic */ = { - isa = PBXGroup; - children = ( - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = Basic; - sourceTree = ""; - }; - 146834001AC3E56700842450 /* Products */ = { - isa = PBXGroup; - children = ( - 146834041AC3E56700842450 /* libReact.a */, - 3DAD3EA31DF850E9000B6D8A /* libReact.a */, - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, - ); - name = Products; - sourceTree = ""; - }; - 5E91572E1DD0AC6500FF2AA8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 78C398B11ACF4ADC00677621 /* Products */ = { - isa = PBXGroup; - children = ( - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, - 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, - 146833FF1AC3E56700842450 /* React.xcodeproj */, - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - ); - name = Libraries; - sourceTree = ""; - }; - 832341B11AAA6A8300B99B32 /* Products */ = { - isa = PBXGroup; - children = ( - 832341B51AAA6A8300B99B32 /* libRCTText.a */, - 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - AD9196DA1CABA83E000E8D91 /* NestedGroup */, - 13B07FAE1A68108700A75B9A /* Basic */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* BasicTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* Basic.app */, - 00E356EE1AD99517003FC87E /* BasicTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - AD9196DA1CABA83E000E8D91 /* NestedGroup */ = { - isa = PBXGroup; - children = ( - AD9196DB1CABA844000E8D91 /* Libraries */, - ); - name = NestedGroup; - sourceTree = ""; - }; - AD9196DB1CABA844000E8D91 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* BasicTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "BasicTests" */; - buildPhases = ( - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = BasicTests; - productName = BasicTests; - productReference = 00E356EE1AD99517003FC87E /* BasicTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* Basic */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Basic" */; - buildPhases = ( - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Basic; - productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* Basic.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 610; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Basic" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; - ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - }, - { - ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; - ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - }, - { - ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; - ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - }, - { - ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; - ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - }, - { - ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; - ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - }, - { - ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; - ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - }, - { - ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; - ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - }, - { - ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; - ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - }, - { - ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; - ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - }, - { - ProductGroup = 139FDEE71B06529A00C62182 /* Products */; - ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - }, - { - ProductGroup = 146834001AC3E56700842450 /* Products */; - ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* Basic */, - 00E356ED1AD99517003FC87E /* BasicTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTActionSheet.a; - remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTGeolocation.a; - remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTImage.a; - remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTNetwork.a; - remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTVibration.a; - remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTSettings.a; - remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebSocket.a; - remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 146834041AC3E56700842450 /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTImage-tvOS.a"; - remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTLinking-tvOS.a"; - remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTNetwork-tvOS.a"; - remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTSettings-tvOS.a"; - remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTText-tvOS.a"; - remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTWebSocket-tvOS.a"; - remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAnimation.a; - remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTAnimation-tvOS.a"; - remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTLinking.a; - remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTText.a; - remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* BasicTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* Basic */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = Basic; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = BasicTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic.app/Basic"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - ); - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - INFOPLIST_FILE = BasicTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic.app/Basic"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - ); - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = NO; - INFOPLIST_FILE = Basic/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_NAME = Basic; - VERSIONING_SYSTEM = "apple-generic"; - HEADER_SEARCH_PATHS = "$(inherited)"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = Basic/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_NAME = Basic; - VERSIONING_SYSTEM = "apple-generic"; - HEADER_SEARCH_PATHS = "$(inherited)"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* 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; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* 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 = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "BasicTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Basic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Basic" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/local-cli/link/__tests__/android/applyPatch.spec.js b/local-cli/link/__tests__/android/applyPatch.spec.js deleted file mode 100644 index aea686d084d880..00000000000000 --- a/local-cli/link/__tests__/android/applyPatch.spec.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const applyParams = require('../../android/patches/applyParams'); - -describe('applyParams', () => { - it('apply params to the string', () => { - expect(applyParams('${foo}', {foo: 'foo'}, 'react-native')).toEqual( - 'getResources().getString(R.string.reactNative_foo)', - ); - }); - - it('use null if no params provided', () => { - expect(applyParams('${foo}', {}, 'react-native')).toEqual('null'); - }); -}); diff --git a/local-cli/link/__tests__/android/isInstalled.spec.js b/local-cli/link/__tests__/android/isInstalled.spec.js deleted file mode 100644 index 28bc43f11fbb81..00000000000000 --- a/local-cli/link/__tests__/android/isInstalled.spec.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const isInstalled = require('../../android/isInstalled'); - -const projectConfig = { - buildGradlePath: path.join( - __dirname, - '../../__fixtures__/android/patchedBuild.gradle', - ), -}; - -describe('android::isInstalled', () => { - it('should return true when project is already in build.gradle', () => { - expect(isInstalled(projectConfig, 'test')).toBeTruthy(); - expect(isInstalled(projectConfig, 'test2')).toBeTruthy(); - }); - - it('should return false when project is not in build.gradle', () => - expect(isInstalled(projectConfig, 'test3')).toBeFalsy()); -}); diff --git a/local-cli/link/__tests__/android/makeBuildPatch.spec.js b/local-cli/link/__tests__/android/makeBuildPatch.spec.js deleted file mode 100644 index e630f766434e55..00000000000000 --- a/local-cli/link/__tests__/android/makeBuildPatch.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const makeBuildPatch = require('../../android/patches/makeBuildPatch'); -const normalizeProjectName = require('../../android/patches/normalizeProjectName'); - -const name = 'test'; -const scopedName = '@scoped/test'; -const normalizedScopedName = normalizeProjectName('@scoped/test'); - -describe('makeBuildPatch', () => { - it('should build a patch function', () => { - expect(Object.prototype.toString(makeBuildPatch(name))).toBe( - '[object Object]', - ); - }); - - it('should make a correct patch', () => { - const {patch} = makeBuildPatch(name); - expect(patch).toBe(` implementation project(':${name}')\n`); - }); - - it('should make a correct install check pattern', () => { - const {installPattern} = makeBuildPatch(name); - const match = `/\\s{4}(implementation)(\\(|\\s)(project)\\(\\':${name}\\'\\)(\\)|\\s)/`; - expect(installPattern.toString()).toBe(match); - }); -}); - -describe('makeBuildPatchWithScopedPackage', () => { - it('should make a correct patch', () => { - const {patch} = makeBuildPatch(scopedName); - expect(patch).toBe( - ` implementation project(':${normalizedScopedName}')\n`, - ); - }); - - it('should make a correct install check pattern', () => { - const {installPattern} = makeBuildPatch(scopedName); - const match = `/\\s{4}(implementation)(\\(|\\s)(project)\\(\\':${normalizedScopedName}\\'\\)(\\)|\\s)/`; - expect(installPattern.toString()).toBe(match); - }); -}); diff --git a/local-cli/link/__tests__/android/makeImportPatch.spec.js b/local-cli/link/__tests__/android/makeImportPatch.spec.js deleted file mode 100644 index 8a5d32358f1cda..00000000000000 --- a/local-cli/link/__tests__/android/makeImportPatch.spec.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const makeImportPatch = require('../../android/patches/makeImportPatch'); - -const packageImportPath = 'import some.example.project'; - -describe('makeImportPatch', () => { - it('should build a patch', () => { - expect(Object.prototype.toString(makeImportPatch(packageImportPath))).toBe( - '[object Object]', - ); - }); - - it('MainActivity contains a correct import patch', () => { - const {patch} = makeImportPatch(packageImportPath); - - expect(patch).toBe('\n' + packageImportPath); - }); -}); diff --git a/local-cli/link/__tests__/android/makePackagePatch.spec.js b/local-cli/link/__tests__/android/makePackagePatch.spec.js deleted file mode 100644 index 6dada45081fd8a..00000000000000 --- a/local-cli/link/__tests__/android/makePackagePatch.spec.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const makePackagePatch = require('../../android/patches/makePackagePatch'); -const applyParams = require('../../android/patches/applyParams'); - -const packageInstance = "new SomeLibrary(${foo}, ${bar}, 'something')"; -const name = 'some-library'; -const params = { - foo: 'foo', - bar: 'bar', -}; - -describe('makePackagePatch@0.20', () => { - it('should build a patch', () => { - const packagePatch = makePackagePatch(packageInstance, params, name); - expect(Object.prototype.toString(packagePatch)).toBe('[object Object]'); - }); - - it('MainActivity contains a correct 0.20 import patch', () => { - const {patch} = makePackagePatch(packageInstance, params, name); - const processedInstance = applyParams(packageInstance, params, name); - - expect(patch).toBe(',\n ' + processedInstance); - }); -}); diff --git a/local-cli/link/__tests__/android/makeSettingsPatch.spec.js b/local-cli/link/__tests__/android/makeSettingsPatch.spec.js deleted file mode 100644 index 6df7b0dd969fe3..00000000000000 --- a/local-cli/link/__tests__/android/makeSettingsPatch.spec.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const makeSettingsPatch = require('../../android/patches/makeSettingsPatch'); -const normalizeProjectName = require('../../android/patches/normalizeProjectName'); - -const name = 'test'; -const scopedName = '@scoped/test'; -const normalizedScopedName = normalizeProjectName('@scoped/test'); -const projectConfig = { - sourceDir: '/home/project/android/app', - settingsGradlePath: '/home/project/android/settings.gradle', -}; -const dependencyConfig = { - sourceDir: `/home/project/node_modules/${name}/android`, -}; -const scopedDependencyConfig = { - sourceDir: `/home/project/node_modules/${scopedName}/android`, -}; - -describe('makeSettingsPatch', () => { - it('should build a patch function', () => { - expect( - Object.prototype.toString( - makeSettingsPatch(name, dependencyConfig, projectConfig), - ), - ).toBe('[object Object]'); - }); - - it('should make a correct patch', () => { - const projectDir = path.relative( - path.dirname(projectConfig.settingsGradlePath), - dependencyConfig.sourceDir, - ); - - const {patch} = makeSettingsPatch(name, dependencyConfig, projectConfig); - - expect(patch).toBe( - `include ':${name}'\n` + - `project(':${name}').projectDir = ` + - `new File(rootProject.projectDir, '${projectDir}')\n`, - ); - }); -}); - -describe('makeSettingsPatchWithScopedPackage', () => { - it('should build a patch function', () => { - expect( - Object.prototype.toString( - makeSettingsPatch(scopedName, scopedDependencyConfig, projectConfig), - ), - ).toBe('[object Object]'); - }); - - it('should make a correct patch', () => { - const projectDir = path.relative( - path.dirname(projectConfig.settingsGradlePath), - scopedDependencyConfig.sourceDir, - ); - - const {patch} = makeSettingsPatch( - scopedName, - scopedDependencyConfig, - projectConfig, - ); - - expect(patch).toBe( - `include ':${normalizedScopedName}'\n` + - `project(':${normalizedScopedName}').projectDir = ` + - `new File(rootProject.projectDir, '${projectDir}')\n`, - ); - }); -}); diff --git a/local-cli/link/__tests__/android/makeStringsPatch.spec.js b/local-cli/link/__tests__/android/makeStringsPatch.spec.js deleted file mode 100644 index 4ea281640328e1..00000000000000 --- a/local-cli/link/__tests__/android/makeStringsPatch.spec.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const makeStringsPatch = require('../../android/patches/makeStringsPatch'); - -describe('makeStringsPatch', () => { - it('should export a patch with element', () => { - const params = { - keyA: 'valueA', - }; - - expect(makeStringsPatch(params, 'module').patch).toContain( - 'valueA', - ); - }); - - it('should export an empty patch if no params given', () => { - expect(makeStringsPatch({}, 'module').patch).toBe(''); - }); -}); diff --git a/local-cli/link/__tests__/android/normalizeProjectName.spec.js b/local-cli/link/__tests__/android/normalizeProjectName.spec.js deleted file mode 100644 index 93f425fd22a812..00000000000000 --- a/local-cli/link/__tests__/android/normalizeProjectName.spec.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const normalizeProjectName = require('../../android/patches/normalizeProjectName'); - -const name = 'test'; -const scopedName = '@scoped/test'; - -describe('normalizeProjectName', () => { - it('should replace slashes with underscores', () => { - expect(normalizeProjectName(name)).toBe('test'); - expect(normalizeProjectName(scopedName)).toBe('@scoped_test'); - }); -}); diff --git a/local-cli/link/__tests__/getDependencyConfig.spec.js b/local-cli/link/__tests__/getDependencyConfig.spec.js deleted file mode 100644 index 1e3813d067bd8d..00000000000000 --- a/local-cli/link/__tests__/getDependencyConfig.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const getDependencyConfig = require('../getDependencyConfig'); - -describe('getDependencyConfig', () => { - it("should return an array of dependencies' rnpm config", () => { - const config = { - getDependencyConfig: jest.fn(), - }; - - expect(Array.isArray(getDependencyConfig(config, ['abcd']))).toBeTruthy(); - expect(config.getDependencyConfig.mock.calls.length).toEqual(1); - }); - - it('should filter out invalid react-native projects', () => { - const config = { - getDependencyConfig: jest.fn().mockImplementation(() => { - throw new Error('Cannot require'); - }), - }; - - expect(getDependencyConfig(config, ['abcd'])).toEqual([]); - }); -}); diff --git a/local-cli/link/__tests__/getProjectDependencies.spec.js b/local-cli/link/__tests__/getProjectDependencies.spec.js deleted file mode 100644 index 2437e1cee3e4a9..00000000000000 --- a/local-cli/link/__tests__/getProjectDependencies.spec.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - * @format - */ - -'use strict'; - -const getProjectDependencies = require('../getProjectDependencies'); -const path = require('path'); - -const CWD = path.resolve(__dirname, '../../..'); - -describe('getProjectDependencies', () => { - beforeEach(() => { - jest.resetModules(); - }); - it('should return an array of project dependencies', () => { - jest.setMock(path.join(CWD, './package.json'), { - dependencies: {lodash: '^6.0.0', 'react-native': '^16.0.0'}, - }); - - expect(getProjectDependencies(CWD)).toEqual(['lodash']); - }); - - it('should return an empty array when no dependencies set', () => { - jest.setMock(path.join(CWD, './package.json'), {}); - expect(getProjectDependencies(CWD)).toEqual([]); - }); -}); diff --git a/local-cli/link/__tests__/groupFilesByType.spec.js b/local-cli/link/__tests__/groupFilesByType.spec.js deleted file mode 100644 index 173857927aa9e3..00000000000000 --- a/local-cli/link/__tests__/groupFilesByType.spec.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const groupFilesByType = require('../groupFilesByType'); - -describe('groupFilesByType', () => { - it('should group files by its type', () => { - const fonts = ['fonts/a.ttf', 'fonts/b.ttf']; - const images = ['images/a.jpg', 'images/c.jpeg']; - - const groupedFiles = groupFilesByType(fonts.concat(images)); - - expect(groupedFiles.font).toEqual(fonts); - expect(groupedFiles.image).toEqual(images); - }); -}); diff --git a/local-cli/link/__tests__/ios/addFileToProject.spec.js b/local-cli/link/__tests__/ios/addFileToProject.spec.js deleted file mode 100644 index 47605e5366ef07..00000000000000 --- a/local-cli/link/__tests__/ios/addFileToProject.spec.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const path = require('path'); -const addFileToProject = require('../../ios/addFileToProject'); -const _ = require('lodash'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::addFileToProject', () => { - beforeEach(() => { - project.parseSync(); - }); - - xit('should add file to a project', () => { - expect( - _.includes( - Object.keys(project.pbxFileReferenceSection()), - addFileToProject(project, '../../__fixtures__/linearGradient.pbxproj') - .fileRef, - ), - ).toBeTruthy(); - }); -}); diff --git a/local-cli/link/__tests__/ios/addProjectToLibraries.spec.js b/local-cli/link/__tests__/ios/addProjectToLibraries.spec.js deleted file mode 100644 index 9a921c21787745..00000000000000 --- a/local-cli/link/__tests__/ios/addProjectToLibraries.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const path = require('path'); -const PbxFile = require('xcode/lib/pbxFile'); -const addProjectToLibraries = require('../../ios/addProjectToLibraries'); -const last = require('lodash').last; - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::addProjectToLibraries', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should append file to Libraries group', () => { - const file = new PbxFile('fakePath'); - const libraries = project.pbxGroupByName('Libraries'); - - addProjectToLibraries(libraries, file); - - const child = last(libraries.children); - - expect(child.comment).toBe(file.basename); - }); -}); diff --git a/local-cli/link/__tests__/ios/addSharedLibraries.spec.js b/local-cli/link/__tests__/ios/addSharedLibraries.spec.js deleted file mode 100644 index c4a262015c0170..00000000000000 --- a/local-cli/link/__tests__/ios/addSharedLibraries.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const path = require('path'); -const addSharedLibraries = require('../../ios/addSharedLibraries'); -const getGroup = require('../../ios/getGroup'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::addSharedLibraries', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should automatically create Frameworks group', () => { - expect(getGroup(project, 'Frameworks')).toBeNull(); - addSharedLibraries(project, ['libz.tbd']); - expect(getGroup(project, 'Frameworks')).not.toBeNull(); - }); - - it('should add shared libraries to project', () => { - addSharedLibraries(project, ['libz.tbd']); - - const frameworksGroup = getGroup(project, 'Frameworks'); - expect(frameworksGroup.children.length).toEqual(1); - expect(frameworksGroup.children[0].comment).toEqual('libz.tbd'); - - addSharedLibraries(project, ['MessageUI.framework']); - expect(frameworksGroup.children.length).toEqual(2); - }); - - it('should not add duplicate libraries to project', () => { - addSharedLibraries(project, ['libz.tbd']); - addSharedLibraries(project, ['libz.tbd']); - - const frameworksGroup = getGroup(project, 'Frameworks'); - expect(frameworksGroup.children.length).toEqual(1); - }); -}); diff --git a/local-cli/link/__tests__/ios/createGroup.spec.js b/local-cli/link/__tests__/ios/createGroup.spec.js deleted file mode 100644 index 6100b92d02a250..00000000000000 --- a/local-cli/link/__tests__/ios/createGroup.spec.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const path = require('path'); -const createGroup = require('../../ios/createGroup'); -const getGroup = require('../../ios/getGroup'); -const last = require('lodash').last; - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::createGroup', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should create a group with given name', () => { - const createdGroup = createGroup(project, 'Resources'); - expect(createdGroup.name).toBe('Resources'); - }); - - it('should attach group to main project group', () => { - const createdGroup = createGroup(project, 'Resources'); - const mainGroup = getGroup(project); - - expect(last(mainGroup.children).comment).toBe(createdGroup.name); - }); - - it('should create a nested group with given path', () => { - const createdGroup = createGroup(project, 'NewGroup/NewNestedGroup'); - const outerGroup = getGroup(project, 'NewGroup'); - - expect(last(outerGroup.children).comment).toBe(createdGroup.name); - }); - - it('should-not create already created groups', () => { - const createdGroup = createGroup(project, 'Libraries/NewNestedGroup'); - const outerGroup = getGroup(project, 'Libraries'); - const mainGroup = getGroup(project); - - expect( - mainGroup.children.filter(group => group.comment === 'Libraries').length, - ).toBe(1); - expect(last(outerGroup.children).comment).toBe(createdGroup.name); - }); -}); diff --git a/local-cli/link/__tests__/ios/getBuildProperty.spec.js b/local-cli/link/__tests__/ios/getBuildProperty.spec.js deleted file mode 100644 index ff5c622ebabd3b..00000000000000 --- a/local-cli/link/__tests__/ios/getBuildProperty.spec.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const path = require('path'); -const getBuildProperty = require('../../ios/getBuildProperty'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::getBuildProperty', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should return build property from main target', () => { - const plistPath = getBuildProperty(project, 'INFOPLIST_FILE'); - expect(plistPath).toEqual('Basic/Info.plist'); - }); -}); diff --git a/local-cli/link/__tests__/ios/getGroup.spec.js b/local-cli/link/__tests__/ios/getGroup.spec.js deleted file mode 100644 index a08434d263cb0e..00000000000000 --- a/local-cli/link/__tests__/ios/getGroup.spec.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const getGroup = require('../../ios/getGroup'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::getGroup', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should return a top-level group', () => { - const group = getGroup(project, 'Libraries'); - expect(group.children.length > 0).toBeTruthy(); - expect(group.name).toBe('Libraries'); - }); - - it('should return nested group when specified', () => { - const group = getGroup(project, 'NestedGroup/Libraries'); - expect(group.children.length).toBe(0); // our test nested Libraries is empty - expect(group.name).toBe('Libraries'); - }); - - it('should return null when no group found', () => { - const group = getGroup(project, 'I-Dont-Exist'); - expect(group).toBeNull(); - }); - - it('should return top-level group when name not specified', () => { - const mainGroupId = project.getFirstProject().firstProject.mainGroup; - const mainGroup = project.getPBXGroupByKey(mainGroupId); - const group = getGroup(project); - expect(group).toEqual(mainGroup); - }); -}); diff --git a/local-cli/link/__tests__/ios/getHeaderSearchPath.spec.js b/local-cli/link/__tests__/ios/getHeaderSearchPath.spec.js deleted file mode 100644 index 5518346074d2cc..00000000000000 --- a/local-cli/link/__tests__/ios/getHeaderSearchPath.spec.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const getHeaderSearchPath = require('../../ios/getHeaderSearchPath'); -const path = require('path'); - -const SRC_DIR = path.join('react-native-project', 'ios'); - -describe('ios::getHeaderSearchPath', () => { - /** - * See https://github.com/Microsoft/react-native-code-push - */ - it('should return correct path when all headers are in root folder', () => { - const files = [ - path.join( - 'react-native-project', - 'node_modules', - 'package', - 'Gradient.h', - ), - path.join('react-native-project', 'node_modules', 'package', 'Manager.h'), - ]; - - const searchPath = getHeaderSearchPath(SRC_DIR, files); - - expect(searchPath).toBe( - `"${['$(SRCROOT)', '..', 'node_modules', 'package'].join(path.sep)}"`, - ); - }); - - /** - * See https://github.com/facebook/react-native/tree/master/React - */ - it('should return correct path when headers are in multiple folders', () => { - const files = [ - path.join( - 'react-native-project', - 'node_modules', - 'package', - 'src', - 'folderA', - 'Gradient.h', - ), - path.join( - 'react-native-project', - 'node_modules', - 'package', - 'src', - 'folderB', - 'Manager.h', - ), - ]; - - const searchPath = getHeaderSearchPath(SRC_DIR, files); - - expect(searchPath).toBe( - `"${['$(SRCROOT)', '..', 'node_modules', 'package', 'src'].join( - path.sep, - )}/**"`, - ); - }); - - /** - * This is just to make sure the above two does not collide with each other - */ - it('should return correct path when headers are in root and nested folders', () => { - const files = [ - path.join( - 'react-native-project', - 'node_modules', - 'package', - 'src', - 'folderA', - 'Gradient.h', - ), - path.join( - 'react-native-project', - 'node_modules', - 'package', - 'src', - 'folderB', - 'Manager.h', - ), - path.join( - 'react-native-project', - 'node_modules', - 'package', - 'src', - 'Manager.h', - ), - ]; - - const searchPath = getHeaderSearchPath(SRC_DIR, files); - - expect(searchPath).toBe( - `"${['$(SRCROOT)', '..', 'node_modules', 'package', 'src'].join( - path.sep, - )}/**"`, - ); - }); -}); diff --git a/local-cli/link/__tests__/ios/getHeadersInFolder.spec.js b/local-cli/link/__tests__/ios/getHeadersInFolder.spec.js deleted file mode 100644 index d590d6c7360698..00000000000000 --- a/local-cli/link/__tests__/ios/getHeadersInFolder.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const getHeadersInFolder = require('../../ios/getHeadersInFolder'); - -describe('ios::getHeadersInFolder', () => { - xit('should return an array of all headers in given folder', () => { - jest.setMock({ - 'FileA.h': '', - 'FileB.h': '', - }); - - const foundHeaders = getHeadersInFolder(process.cwd()); - - expect(foundHeaders.length).toBe(2); - - getHeadersInFolder(process.cwd()).forEach(headerPath => { - expect(headerPath).to.contain(process.cwd()); - }); - }); - - xit('should ignore all headers in Pods, Examples & node_modules', () => { - jest.setMock({ - 'FileA.h': '', - 'FileB.h': '', - Pods: { - 'FileC.h': '', - }, - Examples: { - 'FileD.h': '', - }, - node_modules: { - 'FileE.h': '', - }, - }); - - expect(getHeadersInFolder(process.cwd()).length).to.equals(2); - }); -}); diff --git a/local-cli/link/__tests__/ios/getPlist.spec.js b/local-cli/link/__tests__/ios/getPlist.spec.js deleted file mode 100644 index f229af7a4e34e7..00000000000000 --- a/local-cli/link/__tests__/ios/getPlist.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const getPlist = require('../../ios/getPlist'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::getPlist', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should return null when `.plist` file missing', () => { - const plistPath = getPlist(project, process.cwd()); - expect(plistPath).toBeNull(); - }); - - // @todo - Happy scenario -}); diff --git a/local-cli/link/__tests__/ios/getPlistPath.spec.js b/local-cli/link/__tests__/ios/getPlistPath.spec.js deleted file mode 100644 index ae2de5914f18f4..00000000000000 --- a/local-cli/link/__tests__/ios/getPlistPath.spec.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const getPlistPath = require('../../ios/getPlistPath'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::getPlistPath', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should return path without Xcode $(SRCROOT)', () => { - const plistPath = getPlistPath(project, '/'); - expect(plistPath).toBe(path.normalize('/Basic/Info.plist')); - }); -}); diff --git a/local-cli/link/__tests__/ios/getTargets.spec.js b/local-cli/link/__tests__/ios/getTargets.spec.js deleted file mode 100644 index 0f1142b5efae4b..00000000000000 --- a/local-cli/link/__tests__/ios/getTargets.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const getTargets = require('../../ios/getTargets'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::getTargets', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should return an array of project targets', () => { - const targets = getTargets(project); - expect(targets.length).toBe(2); - expect(targets[0].name).toContain('Basic.app'); - expect(targets[1].name).toContain('BasicTests.xctest'); - }); -}); diff --git a/local-cli/link/__tests__/ios/hasLibraryImported.spec.js b/local-cli/link/__tests__/ios/hasLibraryImported.spec.js deleted file mode 100644 index b36fbd78d6c3dc..00000000000000 --- a/local-cli/link/__tests__/ios/hasLibraryImported.spec.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const hasLibraryImported = require('../../ios/hasLibraryImported'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::hasLibraryImported', () => { - beforeEach(() => { - project.parseSync(); - }); - - it('should return true if project has been already imported', () => { - const libraries = project.pbxGroupByName('Libraries'); - expect(hasLibraryImported(libraries, 'React.xcodeproj')).toBeTruthy(); - }); - - it('should return false if project is not imported', () => { - const libraries = project.pbxGroupByName('Libraries'); - expect(hasLibraryImported(libraries, 'ACME.xcodeproj')).toBeFalsy(); - }); -}); diff --git a/local-cli/link/__tests__/ios/isInstalled.spec.js b/local-cli/link/__tests__/ios/isInstalled.spec.js deleted file mode 100644 index 5998c2e5184cbd..00000000000000 --- a/local-cli/link/__tests__/ios/isInstalled.spec.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const isInstalled = require('../../ios/isInstalled'); - -const baseProjectConfig = { - pbxprojPath: path.join(__dirname, '../../__fixtures__/project.pbxproj'), - libraryFolder: 'Libraries', -}; - -describe('ios::isInstalled', () => { - it('should return true when .xcodeproj in Libraries', () => { - const dependencyConfig = {projectName: 'React.xcodeproj'}; - expect(isInstalled(baseProjectConfig, dependencyConfig)).toBeTruthy(); - }); - - it('should return false when .xcodeproj not in Libraries', () => { - const dependencyConfig = {projectName: 'Missing.xcodeproj'}; - expect(isInstalled(baseProjectConfig, dependencyConfig)).toBeFalsy(); - }); - - it('should return false when `LibraryFolder` is missing', () => { - const dependencyConfig = {projectName: 'React.xcodeproj'}; - const projectConfig = Object.assign({}, baseProjectConfig, { - libraryFolder: 'Missing', - }); - expect(isInstalled(projectConfig, dependencyConfig)).toBeFalsy(); - }); -}); diff --git a/local-cli/link/__tests__/ios/mapHeaderSearchPaths.spec.js b/local-cli/link/__tests__/ios/mapHeaderSearchPaths.spec.js deleted file mode 100644 index 0be5740c2c9ac4..00000000000000 --- a/local-cli/link/__tests__/ios/mapHeaderSearchPaths.spec.js +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const mapHeaderSearchPaths = require('../../ios/mapHeaderSearchPaths'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::mapHeaderSearchPaths', () => { - beforeEach(() => { - project.parseSync(); - }); - - /** - * Based on the fixtures, our assumption is that this function - * has to be executed two times. - */ - it('should be called twice', () => { - const callback = jest.fn(); - mapHeaderSearchPaths(project, callback); - - expect(callback.mock.calls.length).toBe(2); - }); - - it('calls the function with an array of paths, given a project with one', () => { - const callback = jest.fn(); - mapHeaderSearchPaths(project, callback); - - const paths = callback.mock.calls[0][0]; - - expect(paths instanceof Array).toBe(true); - expect(paths.length).toBe(1); - expect(paths[0]).toBe('"$(inherited)"'); - }); -}); diff --git a/local-cli/link/__tests__/ios/removeProjectFromLibraries.js b/local-cli/link/__tests__/ios/removeProjectFromLibraries.js deleted file mode 100644 index 1abf072a1ff958..00000000000000 --- a/local-cli/link/__tests__/ios/removeProjectFromLibraries.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const PbxFile = require('xcode/lib/pbxFile'); -const addProjectToLibraries = require('../../ios/addProjectToLibraries'); -const removeProjectFromLibraries = require('../../ios/removeProjectFromLibraries'); -const last = require('lodash').last; -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::removeProjectFromLibraries', () => { - beforeEach(() => { - project.parseSync(); - - addProjectToLibraries( - project.pbxGroupByName('Libraries'), - new PbxFile('fakePath'), - ); - }); - - it('should remove file from Libraries group', () => { - const file = new PbxFile('fakePath'); - const libraries = project.pbxGroupByName('Libraries'); - - removeProjectFromLibraries(libraries, file); - - const child = last(libraries.children); - - expect(child.comment).not.toBe(file.basename); - }); -}); diff --git a/local-cli/link/__tests__/ios/removeProjectFromProject.spec.js b/local-cli/link/__tests__/ios/removeProjectFromProject.spec.js deleted file mode 100644 index 257e9f0e7fd565..00000000000000 --- a/local-cli/link/__tests__/ios/removeProjectFromProject.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const pbxFile = require('xcode/lib/pbxFile'); -const addFileToProject = require('../../ios/addFileToProject'); -const removeProjectFromProject = require('../../ios/removeProjectFromProject'); -const path = require('path'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); -const filePath = '../../__fixtures__/linearGradient.pbxproj'; - -describe('ios::addFileToProject', () => { - beforeEach(() => { - project.parseSync(); - addFileToProject(project, filePath); - }); - - it('should return removed file', () => { - expect( - removeProjectFromProject(project, filePath) instanceof pbxFile, - ).toBeTruthy(); - }); - - it('should remove file from a project', () => { - const file = removeProjectFromProject(project, filePath); - expect(project.pbxFileReferenceSection()[file.fileRef]).not.toBeDefined(); - }); - - xit('should remove file from PBXContainerProxy', () => { - // todo(mike): add in .xcodeproj after Xcode modifications so we can test extra - // removals later. - }); -}); diff --git a/local-cli/link/__tests__/ios/removeSharedLibrary.spec.js b/local-cli/link/__tests__/ios/removeSharedLibrary.spec.js deleted file mode 100644 index 5f983e551e08b4..00000000000000 --- a/local-cli/link/__tests__/ios/removeSharedLibrary.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const xcode = require('xcode'); -const path = require('path'); -const addSharedLibraries = require('../../ios/addSharedLibraries'); -const removeSharedLibraries = require('../../ios/removeSharedLibraries'); -const getGroup = require('../../ios/getGroup'); - -const project = xcode.project( - path.join(__dirname, '../../__fixtures__/project.pbxproj'), -); - -describe('ios::removeSharedLibraries', () => { - beforeEach(() => { - project.parseSync(); - addSharedLibraries(project, ['libc++.tbd', 'libz.tbd']); - }); - - it('should remove only the specified shared library', () => { - removeSharedLibraries(project, ['libc++.tbd']); - - const frameworksGroup = getGroup(project, 'Frameworks'); - expect(frameworksGroup.children.length).toEqual(1); - expect(frameworksGroup.children[0].comment).toEqual('libz.tbd'); - }); - - it('should ignore missing shared libraries', () => { - removeSharedLibraries(project, ['libxml2.tbd']); - - const frameworksGroup = getGroup(project, 'Frameworks'); - expect(frameworksGroup.children.length).toEqual(2); - }); -}); diff --git a/local-cli/link/__tests__/ios/writePlist.spec.js b/local-cli/link/__tests__/ios/writePlist.spec.js deleted file mode 100644 index d4008a96626f83..00000000000000 --- a/local-cli/link/__tests__/ios/writePlist.spec.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.mock('path'); -jest.mock('fs'); - -let plistPath = null; -jest.mock('../../ios/getPlistPath', () => () => plistPath); - -const {readFileSync} = jest.requireActual('fs'); -const fs = require('fs'); - -const xcode = require('xcode'); -const writePlist = require('../../ios/writePlist'); - -const realPath = jest.requireActual('path'); -const projectPath = realPath.join( - __dirname, - '../../__fixtures__/project.pbxproj', -); -const infoPlistPath = realPath.join(__dirname, '../../__fixtures__/Info.plist'); - -fs.readFileSync = jest.fn(() => readFileSync(projectPath).toString()); - -const {writeFileSync} = fs; -fs.writeFileSync = jest.fn(writeFileSync); - -const project = xcode.project('/Basic/project.pbxproj'); - -const plist = { - CFBundleDevelopmentRegion: 'en', - UISupportedInterfaceOrientations: ['UIInterfaceOrientationPortrait'], -}; - -describe('ios::writePlist', () => { - beforeEach(() => { - project.parseSync(); - fs.writeFileSync.mockReset(); - }); - - it('should write a `.plist` file', () => { - plistPath = '/Basic/Info.plist'; - writePlist(project, '/', plist); - const infoPlist = readFileSync(infoPlistPath).toString(); - expect(fs.writeFileSync).toHaveBeenCalledWith(plistPath, infoPlist); - }); - - it('when plistPath is null it should return null', () => { - plistPath = null; - expect(writePlist(project, '/', plist)).toBeNull(); - expect(fs.writeFileSync).not.toHaveBeenCalled(); - }); -}); diff --git a/local-cli/link/__tests__/link.spec.js b/local-cli/link/__tests__/link.spec.js deleted file mode 100644 index cab9a24c40dd89..00000000000000 --- a/local-cli/link/__tests__/link.spec.js +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const log = require('npmlog'); -jest.setMock('chalk', {grey: str => str}); - -describe('link', () => { - beforeEach(() => { - jest.resetModules(); - delete require.cache[require.resolve('../link')]; - log.level = 'silent'; - }); - - it('should reject when run in a folder without package.json', done => { - const config = { - getProjectConfig: () => { - throw new Error('No package.json found'); - }, - }; - - const link = require('../link').func; - link([], config).catch(() => done()); - }); - - it('should accept a name of a dependency to link', done => { - const config = { - getPlatformConfig: () => ({ios: {}, android: {}}), - getProjectConfig: () => ({assets: []}), - getDependencyConfig: jest - .fn() - .mockReturnValue({assets: [], commands: {}}), - }; - - const link = require('../link').func; - link(['react-native-gradient'], config).then(() => { - expect(config.getDependencyConfig.mock.calls[0]).toEqual([ - 'react-native-gradient', - ]); - done(); - }); - }); - - it('should accept the name of a dependency with a scope / tag', async () => { - const config = { - getPlatformConfig: () => ({ios: {}, android: {}}), - getProjectConfig: () => ({assets: []}), - getDependencyConfig: jest - .fn() - .mockReturnValue({assets: [], commands: {}}), - }; - - const link = require('../link').func; - await link(['@scope/something@latest'], config); - expect(config.getDependencyConfig.mock.calls[0]).toEqual([ - '@scope/something', - ]); - }); - - it('should register native module when android/ios projects are present', done => { - const registerNativeModule = jest.fn(); - const dependencyConfig = {android: {}, ios: {}, assets: [], commands: {}}; - const androidLinkConfig = require('../android'); - const iosLinkConfig = require('../ios'); - const config = { - getPlatformConfig: () => ({ - ios: {linkConfig: iosLinkConfig}, - android: {linkConfig: androidLinkConfig}, - }), - getProjectConfig: () => ({android: {}, ios: {}, assets: []}), - getDependencyConfig: jest.fn().mockReturnValue(dependencyConfig), - }; - - jest.setMock('../android/isInstalled.js', jest.fn().mockReturnValue(false)); - - jest.setMock('../android/registerNativeModule.js', registerNativeModule); - - jest.setMock('../ios/isInstalled.js', jest.fn().mockReturnValue(false)); - - jest.setMock('../ios/registerNativeModule.js', registerNativeModule); - - const link = require('../link').func; - - link(['react-native-blur'], config).then(() => { - expect(registerNativeModule.mock.calls.length).toBe(2); - done(); - }); - }); - - it('should not register modules when they are already installed', done => { - const registerNativeModule = jest.fn(); - const dependencyConfig = {ios: {}, android: {}, assets: [], commands: {}}; - const config = { - getPlatformConfig: () => ({ios: {}, android: {}}), - getProjectConfig: () => ({ios: {}, android: {}, assets: []}), - getDependencyConfig: jest.fn().mockReturnValue(dependencyConfig), - }; - - jest.setMock('../ios/isInstalled.js', jest.fn().mockReturnValue(true)); - - jest.setMock('../android/isInstalled.js', jest.fn().mockReturnValue(true)); - - jest.setMock('../ios/registerNativeModule.js', registerNativeModule); - - jest.setMock('../android/registerNativeModule.js', registerNativeModule); - - const link = require('../link').func; - - link(['react-native-blur'], config).then(() => { - expect(registerNativeModule.mock.calls.length).toEqual(0); - done(); - }); - }); - - it('should register native modules for plugins', done => { - const registerNativeModule = jest.fn(); - const dependencyConfig = { - ios: {}, - android: {}, - test: {}, - assets: [], - commands: {}, - }; - const linkPluginConfig = { - isInstalled: () => false, - register: registerNativeModule, - }; - const config = { - getPlatformConfig: () => ({ - ios: {}, - android: {}, - test: {linkConfig: () => linkPluginConfig}, - }), - getProjectConfig: () => ({ios: {}, android: {}, test: {}, assets: []}), - getDependencyConfig: jest.fn().mockReturnValue(dependencyConfig), - }; - - jest.setMock('../ios/isInstalled.js', jest.fn().mockReturnValue(true)); - - jest.setMock('../android/isInstalled.js', jest.fn().mockReturnValue(true)); - - const link = require('../link').func; - - link(['react-native-blur'], config).then(() => { - expect(registerNativeModule.mock.calls.length).toBe(1); - done(); - }); - }); - - it('should not register native modules for plugins when already installed', done => { - const registerNativeModule = jest.fn(); - const dependencyConfig = { - ios: {}, - android: {}, - test: {}, - assets: [], - commands: {}, - }; - const linkPluginConfig = { - isInstalled: () => true, - register: registerNativeModule, - }; - const config = { - getPlatformConfig: () => ({ - ios: {}, - android: {}, - test: {linkConfig: () => linkPluginConfig}, - }), - getProjectConfig: () => ({ios: {}, android: {}, test: {}, assets: []}), - getDependencyConfig: jest.fn().mockReturnValue(dependencyConfig), - }; - - jest.setMock('../ios/isInstalled.js', jest.fn().mockReturnValue(true)); - - jest.setMock('../android/isInstalled.js', jest.fn().mockReturnValue(true)); - - const link = require('../link').func; - - link(['react-native-blur'], config).then(() => { - expect(registerNativeModule.mock.calls.length).toEqual(0); - done(); - }); - }); - - it('should run prelink and postlink commands at the appropriate times', async () => { - const registerNativeModule = jest.fn(); - const prelink = jest.fn().mockImplementation(cb => cb()); - const postlink = jest.fn().mockImplementation(cb => cb()); - - jest.setMock('../ios/registerNativeModule.js', registerNativeModule); - - jest.setMock('../ios/isInstalled.js', jest.fn().mockReturnValue(false)); - - const linkConfig = require('../ios'); - const config = { - getPlatformConfig: () => ({ios: {linkConfig: linkConfig}}), - getProjectConfig: () => ({ios: {}, assets: []}), - getDependencyConfig: jest.fn().mockReturnValue({ - ios: {}, - assets: [], - commands: {prelink, postlink}, - }), - }; - - const link = require('../link').func; - await link(['react-native-blur'], config); - - expect(prelink.mock.invocationCallOrder[0]).toBeLessThan( - registerNativeModule.mock.invocationCallOrder[0], - ); - expect(postlink.mock.invocationCallOrder[0]).toBeGreaterThan( - registerNativeModule.mock.invocationCallOrder[0], - ); - }); - - it('should copy assets from both project and dependencies projects', done => { - const dependencyAssets = ['Fonts/Font.ttf']; - const dependencyConfig = {assets: dependencyAssets, ios: {}, commands: {}}; - const projectAssets = ['Fonts/FontC.ttf']; - const copyAssets = jest.fn(); - - jest.setMock('../ios/copyAssets.js', copyAssets); - - const linkConfig = require('../ios'); - const config = { - getPlatformConfig: () => ({ios: {linkConfig: linkConfig}}), - getProjectConfig: () => ({ios: {}, assets: projectAssets}), - getDependencyConfig: jest.fn().mockReturnValue(dependencyConfig), - }; - - const link = require('../link').func; - - link(['react-native-blur'], config).then(() => { - expect(copyAssets.mock.calls.length).toBe(1); - expect(copyAssets.mock.calls[0][0]).toEqual( - projectAssets.concat(dependencyAssets), - ); - done(); - }); - }); -}); diff --git a/local-cli/link/__tests__/pods/findLineToAddPod.spec.js b/local-cli/link/__tests__/pods/findLineToAddPod.spec.js deleted file mode 100644 index d27b341dd4580d..00000000000000 --- a/local-cli/link/__tests__/pods/findLineToAddPod.spec.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const findLineToAddPod = require('../../pods/findLineToAddPod'); -const readPodfile = require('../../pods/readPodfile'); - -const PODFILES_PATH = path.join(__dirname, '../../__fixtures__/pods'); -const LINE_AFTER_TARGET_IN_TEST_PODFILE = 4; - -describe('pods::findLineToAddPod', () => { - it('returns null if file is not Podfile', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, '../Info.plist')); - expect( - findLineToAddPod(podfile, LINE_AFTER_TARGET_IN_TEST_PODFILE), - ).toBeNull(); - }); - - it('returns correct line number for Simple Podfile', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, 'PodfileSimple')); - expect( - findLineToAddPod(podfile, LINE_AFTER_TARGET_IN_TEST_PODFILE), - ).toEqual({line: 7, indentation: 2}); - }); - - it('returns correct line number for Podfile with target', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, 'PodfileWithTarget')); - expect( - findLineToAddPod(podfile, LINE_AFTER_TARGET_IN_TEST_PODFILE), - ).toEqual({line: 21, indentation: 2}); - }); - - it('returns correct line number for Podfile with function', () => { - const podfile = readPodfile( - path.join(PODFILES_PATH, 'PodfileWithFunction'), - ); - expect( - findLineToAddPod(podfile, LINE_AFTER_TARGET_IN_TEST_PODFILE), - ).toEqual({line: 26, indentation: 2}); - }); -}); diff --git a/local-cli/link/__tests__/pods/findMarkedLinesInPodfile.spec.js b/local-cli/link/__tests__/pods/findMarkedLinesInPodfile.spec.js deleted file mode 100644 index 2c9d8decd53b3a..00000000000000 --- a/local-cli/link/__tests__/pods/findMarkedLinesInPodfile.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const readPodfile = require('../../pods/readPodfile'); -const findMarkedLinesInPodfile = require('../../pods/findMarkedLinesInPodfile'); - -const PODFILES_PATH = path.join(__dirname, '../../__fixtures__/pods'); -const LINE_AFTER_TARGET_IN_TEST_PODFILE = 4; - -describe('pods::findMarkedLinesInPodfile', () => { - it('returns empty array if file is not Podfile', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, '../Info.plist')); - expect(findMarkedLinesInPodfile(podfile)).toEqual([]); - }); - - it('returns empty array for Simple Podfile', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, 'PodfileSimple')); - expect( - findMarkedLinesInPodfile(podfile, LINE_AFTER_TARGET_IN_TEST_PODFILE), - ).toEqual([]); - }); - - it('returns correct line numbers for Podfile with marker', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, 'PodfileWithMarkers')); - const expectedObject = [ - {line: 18, indentation: 2}, - {line: 31, indentation: 4}, - ]; - expect( - findMarkedLinesInPodfile(podfile, LINE_AFTER_TARGET_IN_TEST_PODFILE), - ).toEqual(expectedObject); - }); -}); diff --git a/local-cli/link/__tests__/pods/findPodTargetLine.spec.js b/local-cli/link/__tests__/pods/findPodTargetLine.spec.js deleted file mode 100644 index 6b7b360e0e51c7..00000000000000 --- a/local-cli/link/__tests__/pods/findPodTargetLine.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const findPodTargetLine = require('../../pods/findPodTargetLine'); -const readPodfile = require('../../pods/readPodfile'); - -const PODFILES_PATH = path.join(__dirname, '../../__fixtures__/pods'); - -describe('pods::findPodTargetLine', () => { - it('returns null if file is not Podfile', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, '../Info.plist')); - expect(findPodTargetLine(podfile, 'name')).toBeNull(); - }); - - it('returns null if there is not matching project name', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, 'PodfileSimple')); - expect(findPodTargetLine(podfile, 'invalidName')).toBeNull(); - }); - - it('returns null if there is not matching project name', () => { - const podfile = readPodfile(path.join(PODFILES_PATH, 'PodfileSimple')); - expect(findPodTargetLine(podfile, 'Testing')).toBe(4); - }); -}); diff --git a/local-cli/link/__tests__/pods/isInstalled.spec.js b/local-cli/link/__tests__/pods/isInstalled.spec.js deleted file mode 100644 index dbf4845749c55b..00000000000000 --- a/local-cli/link/__tests__/pods/isInstalled.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const isInstalled = require('../../pods/isInstalled'); - -const PODFILES_PATH = path.join(__dirname, '../../__fixtures__/pods'); - -describe('pods::isInstalled', () => { - it('returns false if pod is missing', () => { - const project = {podfile: path.join(PODFILES_PATH, 'PodfileSimple')}; - const podspecName = {podspec: 'NotExisting'}; - expect(isInstalled(project, podspecName)).toBe(false); - }); - - it('returns true for existing pod with version number', () => { - const project = {podfile: path.join(PODFILES_PATH, 'PodfileSimple')}; - const podspecName = {podspec: 'TestPod'}; - expect(isInstalled(project, podspecName)).toBe(true); - }); - - it('returns true for existing pod with path', () => { - const project = {podfile: path.join(PODFILES_PATH, 'PodfileWithTarget')}; - const podspecName = {podspec: 'Yoga'}; - expect(isInstalled(project, podspecName)).toBe(true); - }); - - it('returns true for existing pod with multiline definition', () => { - const project = {podfile: path.join(PODFILES_PATH, 'PodfileWithFunction')}; - const podspecName = {podspec: 'React'}; - expect(isInstalled(project, podspecName)).toBe(true); - }); -}); diff --git a/local-cli/link/__tests__/pods/removePodEntry.spec.js b/local-cli/link/__tests__/pods/removePodEntry.spec.js deleted file mode 100644 index 83106805c61e0a..00000000000000 --- a/local-cli/link/__tests__/pods/removePodEntry.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const path = require('path'); -const removePodEntry = require('../../pods/removePodEntry'); -const readPodfile = require('../../pods/readPodfile'); - -const PODFILES_PATH = path.join(__dirname, '../../__fixtures__/pods'); - -describe('pods::removePodEntry', () => { - it('should remove one line from Podfile with TestPod', () => { - const {podfileContent, podLinesCount} = readTestPodFile('PodfileSimple'); - const podFileWithRemoved = removePodEntry(podfileContent, 'TestPod'); - const newLineCount = podFileWithRemoved.split('\n').length; - expect(newLineCount).toBe(podLinesCount - 1); - }); - - it('should remove one line from Podfile with Yoga', () => { - const {podfileContent, podLinesCount} = readTestPodFile( - 'PodfileWithTarget', - ); - const podFileWithRemoved = removePodEntry(podfileContent, 'Yoga'); - const newLineCount = podFileWithRemoved.split('\n').length; - expect(newLineCount).toBe(podLinesCount - 1); - }); - - it('should remove whole reference to React pod from Podfile', () => { - const {podfileContent, podLinesCount} = readTestPodFile( - 'PodfileWithTarget', - ); - const podFileWithRemoved = removePodEntry(podfileContent, 'React'); - const newLineCount = podFileWithRemoved.split('\n').length; - expect(newLineCount).toBe(podLinesCount - 9); - }); -}); - -function readTestPodFile(fileName) { - const podfileLines = readPodfile(path.join(PODFILES_PATH, fileName)); - return { - podfileContent: podfileLines.join('\n'), - podLinesCount: podfileLines.length, - }; -} diff --git a/local-cli/link/__tests__/promiseWaterfall.spec.js b/local-cli/link/__tests__/promiseWaterfall.spec.js deleted file mode 100644 index 3507ce991df688..00000000000000 --- a/local-cli/link/__tests__/promiseWaterfall.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -const promiseWaterfall = require('../promiseWaterfall'); - -describe('promiseWaterfall', () => { - it('should run promises in a sequence', async () => { - const tasks = [jest.fn(), jest.fn()]; - - await promiseWaterfall(tasks); - - // Check that tasks[0] is executed before tasks[1]. - expect(tasks[0].mock.invocationCallOrder[0]).toBeLessThan( - tasks[1].mock.invocationCallOrder[0], - ); - }); - - it('should resolve with last promise value', async () => { - const tasks = [jest.fn().mockReturnValue(1), jest.fn().mockReturnValue(2)]; - - expect(await promiseWaterfall(tasks)).toEqual(2); - }); - - it('should stop the sequence when one of promises is rejected', done => { - const error = new Error(); - const tasks = [ - jest.fn().mockImplementation(() => { - throw error; - }), - jest.fn().mockReturnValue(2), - ]; - - promiseWaterfall(tasks).catch(err => { - expect(err).toEqual(error); - expect(tasks[1].mock.calls.length).toEqual(0); - done(); - }); - }); -}); diff --git a/local-cli/link/android/copyAssets.js b/local-cli/link/android/copyAssets.js deleted file mode 100644 index 4b58f46fb86865..00000000000000 --- a/local-cli/link/android/copyAssets.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs-extra'); -const path = require('path'); -const groupFilesByType = require('../groupFilesByType'); - -/** - * Copies each file from an array of assets provided to targetPath directory - * - * For now, the only types of files that are handled are: - * - Fonts (otf, ttf) - copied to targetPath/fonts under original name - */ -module.exports = function copyAssetsAndroid(files, project) { - const assets = groupFilesByType(files); - - (assets.font || []).forEach(asset => - fs.copySync( - asset, - path.join(project.assetsPath, 'fonts', path.basename(asset)), - ), - ); -}; diff --git a/local-cli/link/android/fs.js b/local-cli/link/android/fs.js deleted file mode 100644 index a7cf3d029a59c5..00000000000000 --- a/local-cli/link/android/fs.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs-extra'); - -exports.readFile = file => () => fs.readFileSync(file, 'utf8'); - -exports.writeFile = (file, content) => - content - ? fs.writeFileSync(file, content, 'utf8') - : c => fs.writeFileSync(file, c, 'utf8'); diff --git a/local-cli/link/android/index.js b/local-cli/link/android/index.js deleted file mode 100644 index d8b8f5addbc2cf..00000000000000 --- a/local-cli/link/android/index.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = function() { - return { - isInstalled: require('./isInstalled'), - register: require('./registerNativeModule'), - unregister: require('./unregisterNativeModule'), - copyAssets: require('./copyAssets'), - unlinkAssets: require('./unlinkAssets'), - }; -}; diff --git a/local-cli/link/android/isInstalled.js b/local-cli/link/android/isInstalled.js deleted file mode 100644 index 24f07788702f03..00000000000000 --- a/local-cli/link/android/isInstalled.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs'); -const makeBuildPatch = require('./patches/makeBuildPatch'); - -module.exports = function isInstalled(config, name) { - const buildGradle = fs.readFileSync(config.buildGradlePath); - return makeBuildPatch(name).installPattern.test(buildGradle); -}; diff --git a/local-cli/link/android/patches/applyParams.js b/local-cli/link/android/patches/applyParams.js deleted file mode 100644 index 11b66bef280b3d..00000000000000 --- a/local-cli/link/android/patches/applyParams.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const toCamelCase = require('lodash').camelCase; - -module.exports = function applyParams(str, params, prefix) { - return str.replace(/\$\{(\w+)\}/g, (pattern, param) => { - const name = toCamelCase(prefix) + '_' + param; - - return params[param] ? `getResources().getString(R.string.${name})` : null; - }); -}; diff --git a/local-cli/link/android/patches/applyPatch.js b/local-cli/link/android/patches/applyPatch.js deleted file mode 100644 index fd17c80b263494..00000000000000 --- a/local-cli/link/android/patches/applyPatch.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs'); - -module.exports = function applyPatch(file, patch) { - fs.writeFileSync( - file, - fs - .readFileSync(file, 'utf8') - .replace(patch.pattern, match => `${match}${patch.patch}`), - ); -}; diff --git a/local-cli/link/android/patches/makeBuildPatch.js b/local-cli/link/android/patches/makeBuildPatch.js deleted file mode 100644 index db8feb5a895c47..00000000000000 --- a/local-cli/link/android/patches/makeBuildPatch.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const normalizeProjectName = require('./normalizeProjectName'); - -module.exports = function makeBuildPatch(name) { - const normalizedProjectName = normalizeProjectName(name); - const installPattern = new RegExp( - `\\s{4}(implementation)(\\(|\\s)(project)\\(\\\':${normalizedProjectName}\\\'\\)(\\)|\\s)`, - ); - - return { - installPattern, - pattern: /[^ \t]dependencies {(\r\n|\n)/, - patch: ` implementation project(':${normalizedProjectName}')\n`, - }; -}; diff --git a/local-cli/link/android/patches/makeImportPatch.js b/local-cli/link/android/patches/makeImportPatch.js deleted file mode 100644 index 983f2a4e0367e5..00000000000000 --- a/local-cli/link/android/patches/makeImportPatch.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = function makeImportPatch(packageImportPath) { - return { - pattern: 'import com.facebook.react.ReactApplication;', - patch: '\n' + packageImportPath, - }; -}; diff --git a/local-cli/link/android/patches/makePackagePatch.js b/local-cli/link/android/patches/makePackagePatch.js deleted file mode 100644 index a4791ef5b4864b..00000000000000 --- a/local-cli/link/android/patches/makePackagePatch.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const applyParams = require('./applyParams'); - -module.exports = function makePackagePatch(packageInstance, params, prefix) { - const processedInstance = applyParams(packageInstance, params, prefix); - - return { - pattern: 'new MainReactPackage()', - patch: ',\n ' + processedInstance, - }; -}; diff --git a/local-cli/link/android/patches/makeSettingsPatch.js b/local-cli/link/android/patches/makeSettingsPatch.js deleted file mode 100644 index a6bf7ca2bb3dc6..00000000000000 --- a/local-cli/link/android/patches/makeSettingsPatch.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const path = require('path'); -const normalizeProjectName = require('./normalizeProjectName'); - -module.exports = function makeSettingsPatch( - name, - androidConfig, - projectConfig, -) { - var projectDir = path.relative( - path.dirname(projectConfig.settingsGradlePath), - androidConfig.sourceDir, - ); - const normalizedProjectName = normalizeProjectName(name); - - return { - pattern: '\n', - patch: - `include ':${normalizedProjectName}'\n` + - `project(':${normalizedProjectName}').projectDir = ` + - `new File(rootProject.projectDir, '${projectDir}')\n`, - }; -}; diff --git a/local-cli/link/android/patches/makeStringsPatch.js b/local-cli/link/android/patches/makeStringsPatch.js deleted file mode 100644 index efda88671e6d3a..00000000000000 --- a/local-cli/link/android/patches/makeStringsPatch.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const toCamelCase = require('lodash').camelCase; - -module.exports = function makeStringsPatch(params, prefix) { - const values = Object.keys(params).map(param => { - const name = toCamelCase(prefix) + '_' + param; - return ( - ' ' + - `${params[param]}` - ); - }); - - const patch = values.length > 0 ? values.join('\n') + '\n' : ''; - - return { - pattern: '\n', - patch, - }; -}; diff --git a/local-cli/link/android/patches/normalizeProjectName.js b/local-cli/link/android/patches/normalizeProjectName.js deleted file mode 100644 index bdf457d74b9a04..00000000000000 --- a/local-cli/link/android/patches/normalizeProjectName.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = function normalizeProjectName(name) { - return name.replace(/\//g, '_'); -}; diff --git a/local-cli/link/android/patches/revokePatch.js b/local-cli/link/android/patches/revokePatch.js deleted file mode 100644 index 070972e424ef39..00000000000000 --- a/local-cli/link/android/patches/revokePatch.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs'); - -module.exports = function revokePatch(file, patch) { - fs.writeFileSync( - file, - fs.readFileSync(file, 'utf8').replace(patch.patch, ''), - ); -}; diff --git a/local-cli/link/android/registerNativeModule.js b/local-cli/link/android/registerNativeModule.js deleted file mode 100644 index 67ddfc7eb97a65..00000000000000 --- a/local-cli/link/android/registerNativeModule.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const applyPatch = require('./patches/applyPatch'); -const makeStringsPatch = require('./patches/makeStringsPatch'); -const makeSettingsPatch = require('./patches/makeSettingsPatch'); -const makeBuildPatch = require('./patches/makeBuildPatch'); -const makeImportPatch = require('./patches/makeImportPatch'); -const makePackagePatch = require('./patches/makePackagePatch'); - -module.exports = function registerNativeAndroidModule( - name, - androidConfig, - params, - projectConfig, -) { - const buildPatch = makeBuildPatch(name); - - applyPatch( - projectConfig.settingsGradlePath, - makeSettingsPatch(name, androidConfig, projectConfig), - ); - - applyPatch(projectConfig.buildGradlePath, buildPatch); - applyPatch(projectConfig.stringsPath, makeStringsPatch(params, name)); - - applyPatch( - projectConfig.mainFilePath, - makePackagePatch(androidConfig.packageInstance, params, name), - ); - - applyPatch( - projectConfig.mainFilePath, - makeImportPatch(androidConfig.packageImportPath), - ); -}; diff --git a/local-cli/link/android/unlinkAssets.js b/local-cli/link/android/unlinkAssets.js deleted file mode 100644 index fc6f7db3913a6c..00000000000000 --- a/local-cli/link/android/unlinkAssets.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs-extra'); -const path = require('path'); -const groupFilesByType = require('../groupFilesByType'); - -/** - * Copies each file from an array of assets provided to targetPath directory - * - * For now, the only types of files that are handled are: - * - Fonts (otf, ttf) - copied to targetPath/fonts under original name - */ -module.exports = function unlinkAssetsAndroid(files, project) { - const assets = groupFilesByType(files); - - (assets.font || []).forEach(file => { - const filePath = path.join( - project.assetsPath, - 'fonts', - path.basename(file), - ); - if (fs.existsSync(filePath)) { - fs.unlinkSync(filePath); - } - }); -}; diff --git a/local-cli/link/android/unregisterNativeModule.js b/local-cli/link/android/unregisterNativeModule.js deleted file mode 100644 index 27aa977a3c4003..00000000000000 --- a/local-cli/link/android/unregisterNativeModule.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs'); -const toCamelCase = require('lodash').camelCase; - -const revokePatch = require('./patches/revokePatch'); -const makeSettingsPatch = require('./patches/makeSettingsPatch'); -const makeBuildPatch = require('./patches/makeBuildPatch'); -const makeStringsPatch = require('./patches/makeStringsPatch'); -const makeImportPatch = require('./patches/makeImportPatch'); -const makePackagePatch = require('./patches/makePackagePatch'); - -module.exports = function unregisterNativeAndroidModule( - name, - androidConfig, - projectConfig, -) { - const buildPatch = makeBuildPatch(name); - const strings = fs.readFileSync(projectConfig.stringsPath, 'utf8'); - var params = {}; - - strings.replace( - /moduleConfig="true" name="(\w+)">(.*) { - params[param.slice(toCamelCase(name).length + 1)] = value; - }, - ); - - revokePatch( - projectConfig.settingsGradlePath, - makeSettingsPatch(name, androidConfig, projectConfig), - ); - - revokePatch(projectConfig.buildGradlePath, buildPatch); - revokePatch(projectConfig.stringsPath, makeStringsPatch(params, name)); - - revokePatch( - projectConfig.mainFilePath, - makePackagePatch(androidConfig.packageInstance, params, name), - ); - - revokePatch( - projectConfig.mainFilePath, - makeImportPatch(androidConfig.packageImportPath), - ); -}; diff --git a/local-cli/link/commandStub.js b/local-cli/link/commandStub.js deleted file mode 100644 index 332acf7f203c36..00000000000000 --- a/local-cli/link/commandStub.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = cb => cb(); diff --git a/local-cli/link/getDependencyConfig.js b/local-cli/link/getDependencyConfig.js deleted file mode 100644 index fcecae2efb5078..00000000000000 --- a/local-cli/link/getDependencyConfig.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given an array of dependencies - it returns their RNPM config - * if they were valid. - */ -module.exports = function getDependencyConfig(config, deps) { - return deps.reduce((acc, name) => { - try { - return acc.concat({ - config: config.getDependencyConfig(name), - name, - }); - } catch (err) { - console.log(err); - return acc; - } - }, []); -}; diff --git a/local-cli/link/getProjectDependencies.js b/local-cli/link/getProjectDependencies.js deleted file mode 100644 index 0cb1165c02dff6..00000000000000 --- a/local-cli/link/getProjectDependencies.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const path = require('path'); - -/** - * Returns an array of dependencies that should be linked/checked. - */ -module.exports = function getProjectDependencies(cwd) { - const pjson = require(path.join(cwd || process.cwd(), './package.json')); - return Object.keys(pjson.dependencies || {}).filter( - name => name !== 'react-native', - ); -}; diff --git a/local-cli/link/groupFilesByType.js b/local-cli/link/groupFilesByType.js deleted file mode 100644 index d35e8e59e30cac..00000000000000 --- a/local-cli/link/groupFilesByType.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const groupBy = require('lodash').groupBy; -const mime = require('mime'); - -/** - * Since there are no officially registered MIME types - * for ttf/otf yet http://www.iana.org/assignments/media-types/media-types.xhtml, - * we define two non-standard ones for the sake of parsing - */ -mime.define({ - 'font/opentype': ['otf'], - 'font/truetype': ['ttf'], -}); - -/** - * Given an array of files, it groups it by it's type. - * Type of the file is inferred from it's mimetype based on the extension - * file ends up with. The returned value is an object with properties that - * correspond to the first part of the mimetype, e.g. images will be grouped - * under `image` key since the mimetype for them is `image/jpg` etc. - * - * Example: - * Given an array ['fonts/a.ttf', 'images/b.jpg'], - * the returned object will be: {font: ['fonts/a.ttf'], image: ['images/b.jpg']} - */ -module.exports = function groupFilesByType(assets) { - return groupBy(assets, type => mime.lookup(type).split('/')[0]); -}; diff --git a/local-cli/link/ios/addFileToProject.js b/local-cli/link/ios/addFileToProject.js deleted file mode 100644 index a534399667b59a..00000000000000 --- a/local-cli/link/ios/addFileToProject.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const PbxFile = require('xcode/lib/pbxFile'); - -/** - * Given xcodeproj and filePath, it creates new file - * from path provided, adds it to the project - * and returns newly created instance of a file - */ -module.exports = function addFileToProject(project, filePath) { - const file = new PbxFile(filePath); - file.uuid = project.generateUuid(); - file.fileRef = project.generateUuid(); - project.addToPbxFileReferenceSection(file); - return file; -}; diff --git a/local-cli/link/ios/addProjectToLibraries.js b/local-cli/link/ios/addProjectToLibraries.js deleted file mode 100644 index 269f30d726a722..00000000000000 --- a/local-cli/link/ios/addProjectToLibraries.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given an array of xcodeproj libraries and pbxFile, - * it appends it to that group - * - * Important: That function mutates `libraries` and it's not pure. - * It's mainly due to limitations of `xcode` library. - */ -module.exports = function addProjectToLibraries(libraries, file) { - return libraries.children.push({ - value: file.fileRef, - comment: file.basename, - }); -}; diff --git a/local-cli/link/ios/addSharedLibraries.js b/local-cli/link/ios/addSharedLibraries.js deleted file mode 100644 index c8050689dcc79e..00000000000000 --- a/local-cli/link/ios/addSharedLibraries.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const createGroupWithMessage = require('./createGroupWithMessage'); - -module.exports = function addSharedLibraries(project, libraries) { - if (!libraries.length) { - return; - } - - // Create a Frameworks group if necessary. - createGroupWithMessage(project, 'Frameworks'); - - const target = project.getFirstTarget().uuid; - - for (var name of libraries) { - project.addFramework(name, {target}); - } -}; diff --git a/local-cli/link/ios/addToHeaderSearchPaths.js b/local-cli/link/ios/addToHeaderSearchPaths.js deleted file mode 100644 index e3cd6db2f95422..00000000000000 --- a/local-cli/link/ios/addToHeaderSearchPaths.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const mapHeaderSearchPaths = require('./mapHeaderSearchPaths'); - -module.exports = function addToHeaderSearchPaths(project, path) { - mapHeaderSearchPaths(project, searchPaths => searchPaths.concat(path)); -}; diff --git a/local-cli/link/ios/common/isInstalled.js b/local-cli/link/ios/common/isInstalled.js deleted file mode 100644 index 3e5542fe13f97b..00000000000000 --- a/local-cli/link/ios/common/isInstalled.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const isInstalledIOS = require('../isInstalled'); -const isInstalledPods = require('../../pods/isInstalled'); - -module.exports = function isInstalled(projectConfig, name, dependencyConfig) { - return ( - isInstalledIOS(projectConfig, dependencyConfig) || - isInstalledPods(projectConfig, dependencyConfig) - ); -}; diff --git a/local-cli/link/ios/common/registerNativeModule.js b/local-cli/link/ios/common/registerNativeModule.js deleted file mode 100644 index 8a86e688753d29..00000000000000 --- a/local-cli/link/ios/common/registerNativeModule.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const registerDependencyIOS = require('../registerNativeModule'); -const registerDependencyPods = require('../../pods/registerNativeModule'); - -module.exports = function registerNativeModule( - name, - dependencyConfig, - params, - projectConfig, -) { - if (projectConfig.podfile && dependencyConfig.podspec) { - registerDependencyPods(name, dependencyConfig, projectConfig); - } else { - registerDependencyIOS(dependencyConfig, projectConfig); - } -}; diff --git a/local-cli/link/ios/common/unregisterNativeModule.js b/local-cli/link/ios/common/unregisterNativeModule.js deleted file mode 100644 index 69d25ea591860e..00000000000000 --- a/local-cli/link/ios/common/unregisterNativeModule.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const compact = require('lodash').compact; -const isInstalledIOS = require('../isInstalled'); -const isInstalledPods = require('../../pods/isInstalled'); -const unregisterDependencyIOS = require('../unregisterNativeModule'); -const unregisterDependencyPods = require('../../pods/unregisterNativeModule'); - -module.exports = function unregisterNativeModule( - name, - dependencyConfig, - projectConfig, - otherDependencies, -) { - const isIosInstalled = isInstalledIOS(projectConfig, dependencyConfig); - const isPodInstalled = isInstalledPods(projectConfig, dependencyConfig); - if (isIosInstalled) { - const iOSDependencies = compact(otherDependencies.map(d => d.config.ios)); - unregisterDependencyIOS(dependencyConfig, projectConfig, iOSDependencies); - } else if (isPodInstalled) { - unregisterDependencyPods(dependencyConfig, projectConfig); - } -}; diff --git a/local-cli/link/ios/copyAssets.js b/local-cli/link/ios/copyAssets.js deleted file mode 100644 index 314b68b60d8f82..00000000000000 --- a/local-cli/link/ios/copyAssets.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs-extra'); -const path = require('path'); -const xcode = require('xcode'); -const groupFilesByType = require('../groupFilesByType'); -const createGroupWithMessage = require('./createGroupWithMessage'); -const getPlist = require('./getPlist'); -const writePlist = require('./writePlist'); - -/** - * This function works in a similar manner to its Android version, - * except it does not copy fonts but creates Xcode Group references - */ -module.exports = function linkAssetsIOS(files, projectConfig) { - const project = xcode.project(projectConfig.pbxprojPath).parseSync(); - const assets = groupFilesByType(files); - const plist = getPlist(project, projectConfig.sourceDir); - - createGroupWithMessage(project, 'Resources'); - - function addResourceFile(f) { - return (f || []) - .map(asset => - project.addResourceFile(path.relative(projectConfig.sourceDir, asset), { - target: project.getFirstTarget().uuid, - }), - ) - .filter(file => file) // xcode returns false if file is already there - .map(file => file.basename); - } - - addResourceFile(assets.image); - - const fonts = addResourceFile(assets.font); - - const existingFonts = plist.UIAppFonts || []; - const allFonts = [...existingFonts, ...fonts]; - plist.UIAppFonts = Array.from(new Set(allFonts)); // use Set to dedupe w/existing - - fs.writeFileSync(projectConfig.pbxprojPath, project.writeSync()); - - writePlist(project, projectConfig.sourceDir, plist); -}; diff --git a/local-cli/link/ios/createGroup.js b/local-cli/link/ios/createGroup.js deleted file mode 100644 index 473bb4ccd34fb4..00000000000000 --- a/local-cli/link/ios/createGroup.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const getGroup = require('./getGroup'); - -const hasGroup = (pbxGroup, name) => - pbxGroup.children.find(group => group.comment === name); - -/** - * Given project and path of the group, it deeply creates a given group - * making all outer groups if necessary - * - * Returns newly created group - */ -module.exports = function createGroup(project, path) { - return path.split('/').reduce((group, name) => { - if (!hasGroup(group, name)) { - const uuid = project.pbxCreateGroup(name, '""'); - - group.children.push({ - value: uuid, - comment: name, - }); - } - - return project.pbxGroupByName(name); - }, getGroup(project)); -}; diff --git a/local-cli/link/ios/createGroupWithMessage.js b/local-cli/link/ios/createGroupWithMessage.js deleted file mode 100644 index c353d915929d7e..00000000000000 --- a/local-cli/link/ios/createGroupWithMessage.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const log = require('npmlog'); - -const createGroup = require('./createGroup'); -const getGroup = require('./getGroup'); - -/** - * Given project and path of the group, it checks if a group exists at that path, - * and deeply creates a group for that path if its does not already exist. - * - * Returns the existing or newly created group - */ -module.exports = function createGroupWithMessage(project, path) { - var group = getGroup(project, path); - - if (!group) { - group = createGroup(project, path); - - log.warn( - 'ERRGROUP', - `Group '${path}' does not exist in your Xcode project. We have created it automatically for you.`, - ); - } - - return group; -}; diff --git a/local-cli/link/ios/getBuildProperty.js b/local-cli/link/ios/getBuildProperty.js deleted file mode 100644 index bf0291a2d5cd72..00000000000000 --- a/local-cli/link/ios/getBuildProperty.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Gets build property from the main target build section - * - * It differs from the project.getBuildProperty exposed by xcode in the way that: - * - it only checks for build property in the main target `Debug` section - * - `xcode` library iterates over all build sections and because it misses - * an early return when property is found, it will return undefined/wrong value - * when there's another build section typically after the one you want to access - * without the property defined (e.g. CocoaPods sections appended to project - * miss INFOPLIST_FILE), see: https://github.com/alunny/node-xcode/blob/master/lib/pbxProject.js#L1765 - */ -module.exports = function getBuildProperty(project, prop) { - const target = project.getFirstTarget().firstTarget; - const config = project.pbxXCConfigurationList()[ - target.buildConfigurationList - ]; - const buildSection = project.pbxXCBuildConfigurationSection()[ - config.buildConfigurations[0].value - ]; - - return buildSection.buildSettings[prop]; -}; diff --git a/local-cli/link/ios/getGroup.js b/local-cli/link/ios/getGroup.js deleted file mode 100644 index c53e731d96f888..00000000000000 --- a/local-cli/link/ios/getGroup.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const getFirstProject = project => project.getFirstProject().firstProject; - -const findGroup = (groups, name) => - groups.children.find(group => group.comment === name); - -/** - * Returns group from .xcodeproj if one exists, null otherwise - * - * Unlike node-xcode `pbxGroupByName` - it does not return `first-matching` - * group if multiple groups with the same name exist - * - * If path is not provided, it returns top-level group - */ -module.exports = function getGroup(project, path) { - const firstProject = getFirstProject(project); - - let groups = project.getPBXGroupByKey(firstProject.mainGroup); - - if (!path) { - return groups; - } - - for (var name of path.split('/')) { - var foundGroup = findGroup(groups, name); - - if (foundGroup) { - groups = project.getPBXGroupByKey(foundGroup.value); - } else { - groups = null; - break; - } - } - - return groups; -}; diff --git a/local-cli/link/ios/getHeaderSearchPath.js b/local-cli/link/ios/getHeaderSearchPath.js deleted file mode 100644 index bd1b5f5c5e8b77..00000000000000 --- a/local-cli/link/ios/getHeaderSearchPath.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const path = require('path'); -const union = require('lodash').union; -const last = require('lodash').last; - -/** - * Given an array of directories, it returns the one that contains - * all the other directories in a given array inside it. - * - * Example: - * Given an array of directories: ['/Users/Kureev/a', '/Users/Kureev/b'] - * the returned folder is `/Users/Kureev` - * - * Check `getHeaderSearchPath.spec.js` for more use-cases. - */ -const getOuterDirectory = directories => - directories.reduce((topDir, currentDir) => { - const currentFolders = currentDir.split(path.sep); - const topMostFolders = topDir.split(path.sep); - - if ( - currentFolders.length === topMostFolders.length && - last(currentFolders) !== last(topMostFolders) - ) { - return currentFolders.slice(0, -1).join(path.sep); - } - - return currentFolders.length < topMostFolders.length ? currentDir : topDir; - }); - -/** - * Given an array of headers it returns search path so Xcode can resolve - * headers when referenced like below: - * ``` - * #import "CodePush.h" - * ``` - * If all files are located in one directory (directories.length === 1), - * we simply return a relative path to that location. - * - * Otherwise, we loop through them all to find the outer one that contains - * all the headers inside. That location is then returned with /** appended at - * the end so Xcode marks that location as `recursive` and will look inside - * every folder of it to locate correct headers. - */ -module.exports = function getHeaderSearchPath(sourceDir, headers) { - const directories = union(headers.map(path.dirname)); - - return directories.length === 1 - ? `"$(SRCROOT)${path.sep}${path.relative(sourceDir, directories[0])}"` - : `"$(SRCROOT)${path.sep}${path.relative( - sourceDir, - getOuterDirectory(directories), - )}/**"`; -}; diff --git a/local-cli/link/ios/getHeadersInFolder.js b/local-cli/link/ios/getHeadersInFolder.js deleted file mode 100644 index 562cac9a549a10..00000000000000 --- a/local-cli/link/ios/getHeadersInFolder.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const glob = require('glob'); -const path = require('path'); - -const GLOB_EXCLUDE_PATTERN = [ - 'node_modules/**', - 'Pods/**', - 'Examples/**', - 'examples/**', -]; - -/** - * Given folder, it returns an array of all header files - * inside it, ignoring node_modules and examples - */ -module.exports = function getHeadersInFolder(folder) { - return glob - .sync('**/*.h', { - cwd: folder, - nodir: true, - ignore: GLOB_EXCLUDE_PATTERN, - }) - .map(file => path.join(folder, file)); -}; diff --git a/local-cli/link/ios/getPlist.js b/local-cli/link/ios/getPlist.js deleted file mode 100644 index 61d0b51256d218..00000000000000 --- a/local-cli/link/ios/getPlist.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const plistParser = require('plist'); -const getPlistPath = require('./getPlistPath'); -const fs = require('fs'); - -/** - * Returns Info.plist located in the iOS project - * - * Returns `null` if INFOPLIST_FILE is not specified. - */ -module.exports = function getPlist(project, sourceDir) { - const plistPath = getPlistPath(project, sourceDir); - - if (!plistPath || !fs.existsSync(plistPath)) { - return null; - } - - return plistParser.parse(fs.readFileSync(plistPath, 'utf-8')); -}; diff --git a/local-cli/link/ios/getPlistPath.js b/local-cli/link/ios/getPlistPath.js deleted file mode 100644 index f8d570b9f21768..00000000000000 --- a/local-cli/link/ios/getPlistPath.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const path = require('path'); -const getBuildProperty = require('./getBuildProperty'); - -module.exports = function getPlistPath(project, sourceDir) { - const plistFile = getBuildProperty(project, 'INFOPLIST_FILE'); - - if (!plistFile) { - return null; - } - - return path.join( - sourceDir, - plistFile.replace(/"/g, '').replace('$(SRCROOT)', ''), - ); -}; diff --git a/local-cli/link/ios/getTargets.js b/local-cli/link/ios/getTargets.js deleted file mode 100644 index 15f958598e61c8..00000000000000 --- a/local-cli/link/ios/getTargets.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given xcodeproj it returns list of targets - */ -module.exports = function getTargets(project) { - let targets = project.getFirstProject().firstProject.targets; - let nativeTargetSection = project.pbxNativeTargetSection(); - return targets.map(function(target) { - let key = target.value; - let configurationListId = project.pbxNativeTargetSection()[key] - .buildConfigurationList; - let configurationList = project.pbxXCConfigurationList()[ - configurationListId - ]; - let buildConfigurationId = configurationList.buildConfigurations[0].value; - let buildConfiguration = project.pbxXCBuildConfigurationSection()[ - buildConfigurationId - ]; - return { - uuid: key, - target: nativeTargetSection[key], - name: nativeTargetSection[key].productReference_comment, - isTVOS: - (buildConfiguration.buildSettings.SDKROOT && - buildConfiguration.buildSettings.SDKROOT.indexOf('appletv') !== -1) || - false, - }; - }); -}; diff --git a/local-cli/link/ios/hasLibraryImported.js b/local-cli/link/ios/hasLibraryImported.js deleted file mode 100644 index 62805eb3a5004a..00000000000000 --- a/local-cli/link/ios/hasLibraryImported.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given an array of libraries already imported and packageName that will be - * added, returns true or false depending on whether the library is already linked - * or not - */ -module.exports = function hasLibraryImported(libraries, packageName) { - return ( - libraries.children.filter(library => library.comment === packageName) - .length > 0 - ); -}; diff --git a/local-cli/link/ios/index.js b/local-cli/link/ios/index.js deleted file mode 100644 index aa31fd2ba11a32..00000000000000 --- a/local-cli/link/ios/index.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = function() { - return { - isInstalled: require('./common/isInstalled'), - register: require('./common/registerNativeModule'), - unregister: require('./common/unregisterNativeModule'), - copyAssets: require('./copyAssets'), - unlinkAssets: require('./unlinkAssets'), - }; -}; diff --git a/local-cli/link/ios/isInstalled.js b/local-cli/link/ios/isInstalled.js deleted file mode 100644 index 07cfb12543b2d5..00000000000000 --- a/local-cli/link/ios/isInstalled.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const xcode = require('xcode'); -const getGroup = require('./getGroup'); -const hasLibraryImported = require('./hasLibraryImported'); - -/** - * Returns true if `xcodeproj` specified by dependencyConfig is present - * in a top level `libraryFolder` - */ -module.exports = function isInstalled(projectConfig, dependencyConfig) { - const project = xcode.project(projectConfig.pbxprojPath).parseSync(); - const libraries = getGroup(project, projectConfig.libraryFolder); - - if (!libraries) { - return false; - } - - return hasLibraryImported(libraries, dependencyConfig.projectName); -}; diff --git a/local-cli/link/ios/mapHeaderSearchPaths.js b/local-cli/link/ios/mapHeaderSearchPaths.js deleted file mode 100644 index 2754602d4ce087..00000000000000 --- a/local-cli/link/ios/mapHeaderSearchPaths.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given Xcode project and path, iterate over all build configurations - * and execute func with HEADER_SEARCH_PATHS from current section - * - * We cannot use builtin addToHeaderSearchPaths method since react-native init does not - * use $(TARGET_NAME) for PRODUCT_NAME, but sets it manually so that method will skip - * that target. - * - * To workaround that issue and make it more bullet-proof for different names, - * we iterate over all configurations and look for `lc++` linker flag to detect - * React Native target. - * - * Important: That function mutates `buildSettings` and it's not pure thus you should - * not rely on its return value - */ -const defaultHeaderPaths = ['"$(inherited)"']; - -module.exports = function headerSearchPathIter(project, func) { - const config = project.pbxXCBuildConfigurationSection(); - - Object.keys(config) - .filter(ref => ref.indexOf('_comment') === -1) - .forEach(ref => { - const buildSettings = config[ref].buildSettings; - const shouldVisitBuildSettings = - (Array.isArray(buildSettings.OTHER_LDFLAGS) - ? buildSettings.OTHER_LDFLAGS - : [] - ).indexOf('"-lc++"') >= 0; - - if (shouldVisitBuildSettings) { - const searchPaths = buildSettings.HEADER_SEARCH_PATHS - ? [].concat(buildSettings.HEADER_SEARCH_PATHS) - : defaultHeaderPaths; - - buildSettings.HEADER_SEARCH_PATHS = func(searchPaths); - } - }); -}; diff --git a/local-cli/link/ios/registerNativeModule.js b/local-cli/link/ios/registerNativeModule.js deleted file mode 100644 index b68230ce31ea79..00000000000000 --- a/local-cli/link/ios/registerNativeModule.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const xcode = require('xcode'); -const fs = require('fs'); -const path = require('path'); - -const addToHeaderSearchPaths = require('./addToHeaderSearchPaths'); -const getHeadersInFolder = require('./getHeadersInFolder'); -const getHeaderSearchPath = require('./getHeaderSearchPath'); -const getTargets = require('./getTargets'); -const createGroupWithMessage = require('./createGroupWithMessage'); -const addFileToProject = require('./addFileToProject'); -const addProjectToLibraries = require('./addProjectToLibraries'); -const addSharedLibraries = require('./addSharedLibraries'); -const isEmpty = require('lodash').isEmpty; - -/** - * Register native module IOS adds given dependency to project by adding - * its xcodeproj to project libraries as well as attaching static library - * to the first target (the main one) - * - * If library is already linked, this action is a no-op. - */ -module.exports = function registerNativeModuleIOS( - dependencyConfig, - projectConfig, -) { - const project = xcode.project(projectConfig.pbxprojPath).parseSync(); - const dependencyProject = xcode - .project(dependencyConfig.pbxprojPath) - .parseSync(); - - const libraries = createGroupWithMessage( - project, - projectConfig.libraryFolder, - ); - const file = addFileToProject( - project, - path.relative(projectConfig.sourceDir, dependencyConfig.projectPath), - ); - - const targets = getTargets(project); - - addProjectToLibraries(libraries, file); - - getTargets(dependencyProject).forEach(product => { - var i; - if (!product.isTVOS) { - for (i = 0; i < targets.length; i++) { - if (!targets[i].isTVOS) { - project.addStaticLibrary(product.name, { - target: targets[i].uuid, - }); - } - } - } - - if (product.isTVOS) { - for (i = 0; i < targets.length; i++) { - if (targets[i].isTVOS) { - project.addStaticLibrary(product.name, { - target: targets[i].uuid, - }); - } - } - } - }); - - addSharedLibraries(project, dependencyConfig.sharedLibraries); - - const headers = getHeadersInFolder(dependencyConfig.folder); - if (!isEmpty(headers)) { - addToHeaderSearchPaths( - project, - getHeaderSearchPath(projectConfig.sourceDir, headers), - ); - } - - fs.writeFileSync(projectConfig.pbxprojPath, project.writeSync()); -}; diff --git a/local-cli/link/ios/removeFromHeaderSearchPaths.js b/local-cli/link/ios/removeFromHeaderSearchPaths.js deleted file mode 100644 index e7fc30fa1e80f5..00000000000000 --- a/local-cli/link/ios/removeFromHeaderSearchPaths.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const mapHeaderSearchPaths = require('./mapHeaderSearchPaths'); - -/** - * Given Xcode project and absolute path, it makes sure there are no headers referring to it - */ -module.exports = function addToHeaderSearchPaths(project, path) { - mapHeaderSearchPaths(project, searchPaths => - searchPaths.filter(searchPath => searchPath !== path), - ); -}; diff --git a/local-cli/link/ios/removeFromPbxItemContainerProxySection.js b/local-cli/link/ios/removeFromPbxItemContainerProxySection.js deleted file mode 100644 index b2277ce882481c..00000000000000 --- a/local-cli/link/ios/removeFromPbxItemContainerProxySection.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * For all files that are created and referenced from another `.xcodeproj` - - * a new PBXItemContainerProxy is created that contains `containerPortal` value - * which equals to xcodeproj file.uuid from PBXFileReference section. - */ -module.exports = function removeFromPbxItemContainerProxySection( - project, - file, -) { - const section = project.hash.project.objects.PBXContainerItemProxy; - - for (var key of Object.keys(section)) { - if (section[key].containerPortal === file.uuid) { - delete section[key]; - } - } - - return; -}; diff --git a/local-cli/link/ios/removeFromPbxReferenceProxySection.js b/local-cli/link/ios/removeFromPbxReferenceProxySection.js deleted file mode 100644 index 52f8056a5f414e..00000000000000 --- a/local-cli/link/ios/removeFromPbxReferenceProxySection.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Every file added to the project from another project is attached to - * `PBXItemContainerProxy` through `PBXReferenceProxy`. - */ -module.exports = function removeFromPbxReferenceProxySection(project, file) { - const section = project.hash.project.objects.PBXReferenceProxy; - - for (var key of Object.keys(section)) { - if (section[key].path === file.basename) { - delete section[key]; - } - } - - return; -}; diff --git a/local-cli/link/ios/removeFromProjectReferences.js b/local-cli/link/ios/removeFromProjectReferences.js deleted file mode 100644 index 8a776bf7206b5f..00000000000000 --- a/local-cli/link/ios/removeFromProjectReferences.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * For each file (.xcodeproj), there's an entry in `projectReferences` created - * that has two entries - `ProjectRef` - reference to a file.uuid and - * `ProductGroup` - uuid of a Products group. - * - * When projectReference is found - it's deleted and the removed value is returned - * so that ProductGroup in PBXGroup section can be removed as well. - * - * Otherwise returns null - */ -module.exports = function removeFromProjectReferences(project, file) { - const firstProject = project.getFirstProject().firstProject; - - const projectRef = firstProject.projectReferences.find( - item => item.ProjectRef === file.uuid, - ); - - if (!projectRef) { - return null; - } - - firstProject.projectReferences.splice( - firstProject.projectReferences.indexOf(projectRef), - 1, - ); - - return projectRef; -}; diff --git a/local-cli/link/ios/removeFromStaticLibraries.js b/local-cli/link/ios/removeFromStaticLibraries.js deleted file mode 100644 index 7beaf880446f2a..00000000000000 --- a/local-cli/link/ios/removeFromStaticLibraries.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const PbxFile = require('xcode/lib/pbxFile'); -const removeFromPbxReferenceProxySection = require('./removeFromPbxReferenceProxySection'); - -/** - * Removes file from static libraries - * - * Similar to `node-xcode` addStaticLibrary - */ -module.exports = function removeFromStaticLibraries(project, path, opts) { - const file = new PbxFile(path); - - file.target = opts ? opts.target : undefined; - - project.removeFromPbxFileReferenceSection(file); - project.removeFromPbxBuildFileSection(file); - project.removeFromPbxFrameworksBuildPhase(file); - project.removeFromLibrarySearchPaths(file); - removeFromPbxReferenceProxySection(project, file); - - return file; -}; diff --git a/local-cli/link/ios/removeProductGroup.js b/local-cli/link/ios/removeProductGroup.js deleted file mode 100644 index f012ff25c0c787..00000000000000 --- a/local-cli/link/ios/removeProductGroup.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = function removeProductGroup(project, productGroupId) { - const section = project.hash.project.objects.PBXGroup; - - for (var key of Object.keys(section)) { - if (key === productGroupId) { - delete section[key]; - } - } - - return; -}; diff --git a/local-cli/link/ios/removeProjectFromLibraries.js b/local-cli/link/ios/removeProjectFromLibraries.js deleted file mode 100644 index 0402d777a3213c..00000000000000 --- a/local-cli/link/ios/removeProjectFromLibraries.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given an array of xcodeproj libraries and pbxFile, - * it removes it from that group by comparing basenames - * - * Important: That function mutates `libraries` and it's not pure. - * It's mainly due to limitations of `xcode` library. - */ -module.exports = function removeProjectFromLibraries(libraries, file) { - libraries.children = libraries.children.filter( - library => library.comment !== file.basename, - ); -}; diff --git a/local-cli/link/ios/removeProjectFromProject.js b/local-cli/link/ios/removeProjectFromProject.js deleted file mode 100644 index fbae783f4eeaa3..00000000000000 --- a/local-cli/link/ios/removeProjectFromProject.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const PbxFile = require('xcode/lib/pbxFile'); -const removeFromPbxItemContainerProxySection = require('./removeFromPbxItemContainerProxySection'); -const removeFromProjectReferences = require('./removeFromProjectReferences'); -const removeProductGroup = require('./removeProductGroup'); - -/** - * Given xcodeproj and filePath, it creates new file - * from path provided and removes it. That operation is required since - * underlying method requires PbxFile instance to be passed (it does not - * have to have uuid or fileRef defined since it will do equality check - * by path) - * - * Returns removed file (that one will have UUID) - */ -module.exports = function removeProjectFromProject(project, filePath) { - const file = project.removeFromPbxFileReferenceSection(new PbxFile(filePath)); - const projectRef = removeFromProjectReferences(project, file); - - if (projectRef) { - removeProductGroup(project, projectRef.ProductGroup); - } - - removeFromPbxItemContainerProxySection(project, file); - - return file; -}; diff --git a/local-cli/link/ios/removeSharedLibraries.js b/local-cli/link/ios/removeSharedLibraries.js deleted file mode 100644 index 1a34b7c1afa0dc..00000000000000 --- a/local-cli/link/ios/removeSharedLibraries.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = function removeSharedLibraries(project, libraries) { - if (!libraries.length) { - return; - } - - const target = project.getFirstTarget().uuid; - - for (var name of libraries) { - project.removeFramework(name, {target}); - } -}; diff --git a/local-cli/link/ios/unlinkAssets.js b/local-cli/link/ios/unlinkAssets.js deleted file mode 100644 index 1df299fdda811a..00000000000000 --- a/local-cli/link/ios/unlinkAssets.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const fs = require('fs-extra'); -const path = require('path'); -const xcode = require('xcode'); -const log = require('npmlog'); -const groupFilesByType = require('../groupFilesByType'); -const getPlist = require('./getPlist'); -const writePlist = require('./writePlist'); -const difference = require('lodash').difference; - -/** - * Unlinks assets from iOS project. Removes references for fonts from `Info.plist` - * fonts provided by application and from `Resources` group - */ -module.exports = function unlinkAssetsIOS(files, projectConfig) { - const project = xcode.project(projectConfig.pbxprojPath).parseSync(); - const assets = groupFilesByType(files); - const plist = getPlist(project, projectConfig.sourceDir); - - if (!plist) { - return log.error( - 'ERRPLIST', - "Could not locate Info.plist file. Check if your project has 'INFOPLIST_FILE' set properly", - ); - } - - if (!project.pbxGroupByName('Resources')) { - return log.error( - 'ERRGROUP', - "Group 'Resources' does not exist in your Xcode project. There is nothing to unlink.", - ); - } - - const removeResourceFile = function(f) { - (f || []) - .map(asset => - project.removeResourceFile( - path.relative(projectConfig.sourceDir, asset), - {target: project.getFirstTarget().uuid}, - ), - ) - .map(file => file.basename); - }; - - removeResourceFile(assets.image); - - const fonts = removeResourceFile(assets.font); - - plist.UIAppFonts = difference(plist.UIAppFonts || [], fonts); - - fs.writeFileSync(projectConfig.pbxprojPath, project.writeSync()); - - writePlist(project, projectConfig.sourceDir, plist); -}; diff --git a/local-cli/link/ios/unregisterNativeModule.js b/local-cli/link/ios/unregisterNativeModule.js deleted file mode 100644 index c9b83a880d4516..00000000000000 --- a/local-cli/link/ios/unregisterNativeModule.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const xcode = require('xcode'); -const path = require('path'); -const fs = require('fs'); -const difference = require('lodash').difference; -const isEmpty = require('lodash').isEmpty; - -const getGroup = require('./getGroup'); -const getTargets = require('./getTargets'); -const getHeadersInFolder = require('./getHeadersInFolder'); -const getHeaderSearchPath = require('./getHeaderSearchPath'); -const removeProjectFromProject = require('./removeProjectFromProject'); -const removeProjectFromLibraries = require('./removeProjectFromLibraries'); -const removeFromStaticLibraries = require('./removeFromStaticLibraries'); -const removeFromHeaderSearchPaths = require('./removeFromHeaderSearchPaths'); -const removeSharedLibraries = require('./removeSharedLibraries'); - -/** - * Unregister native module IOS - * - * If library is already unlinked, this action is a no-op. - */ -module.exports = function unregisterNativeModule( - dependencyConfig, - projectConfig, - iOSDependencies, -) { - const project = xcode.project(projectConfig.pbxprojPath).parseSync(); - const dependencyProject = xcode - .project(dependencyConfig.pbxprojPath) - .parseSync(); - - const libraries = getGroup(project, projectConfig.libraryFolder); - - const file = removeProjectFromProject( - project, - path.relative(projectConfig.sourceDir, dependencyConfig.projectPath), - ); - - removeProjectFromLibraries(libraries, file); - - getTargets(dependencyProject).forEach(target => { - removeFromStaticLibraries(project, target.name, { - target: project.getFirstTarget().uuid, - }); - }); - - const sharedLibraries = difference( - dependencyConfig.sharedLibraries, - iOSDependencies.reduce( - (libs, dependency) => libs.concat(dependency.sharedLibraries), - projectConfig.sharedLibraries, - ), - ); - - removeSharedLibraries(project, sharedLibraries); - - const headers = getHeadersInFolder(dependencyConfig.folder); - if (!isEmpty(headers)) { - removeFromHeaderSearchPaths( - project, - getHeaderSearchPath(projectConfig.sourceDir, headers), - ); - } - - fs.writeFileSync(projectConfig.pbxprojPath, project.writeSync()); -}; diff --git a/local-cli/link/ios/writePlist.js b/local-cli/link/ios/writePlist.js deleted file mode 100644 index 009de34e26f079..00000000000000 --- a/local-cli/link/ios/writePlist.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const plistParser = require('plist'); -const getPlistPath = require('./getPlistPath'); -const fs = require('fs'); - -/** - * Writes to Info.plist located in the iOS project - * - * Returns `null` if INFOPLIST_FILE is not specified or file is non-existent. - */ -module.exports = function writePlist(project, sourceDir, plist) { - const plistPath = getPlistPath(project, sourceDir); - - if (!plistPath) { - return null; - } - - // We start with an offset of -1, because Xcode maintains a custom - // indentation of the plist. - // Ref: https://github.com/facebook/react-native/issues/11668 - return fs.writeFileSync( - plistPath, - plistParser.build(plist, {indent: '\t', offset: -1}) + '\n', - ); -}; diff --git a/local-cli/link/link.js b/local-cli/link/link.js deleted file mode 100644 index 752e75e2294ff0..00000000000000 --- a/local-cli/link/link.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const log = require('npmlog'); -const path = require('path'); -const uniqBy = require('lodash').uniqBy; -const flatten = require('lodash').flatten; -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const chalk = require('chalk'); - -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const isEmpty = require('lodash').isEmpty; -const promiseWaterfall = require('./promiseWaterfall'); -const getProjectDependencies = require('./getProjectDependencies'); -const getDependencyConfig = require('./getDependencyConfig'); -const pollParams = require('./pollParams'); -const commandStub = require('./commandStub'); -const promisify = require('./promisify'); -const findReactNativeScripts = require('../util/findReactNativeScripts'); - -import type {RNConfig} from '../core'; - -log.heading = 'rnpm-link'; - -const dedupeAssets = assets => uniqBy(assets, asset => path.basename(asset)); - -const linkDependency = async (platforms, project, dependency) => { - const params = await pollParams(dependency.config.params); - - Object.keys(platforms || {}).forEach(platform => { - if (!project[platform] || !dependency.config[platform]) { - return null; - } - - const linkConfig = - platforms[platform] && - platforms[platform].linkConfig && - platforms[platform].linkConfig(); - if (!linkConfig || !linkConfig.isInstalled || !linkConfig.register) { - return null; - } - - const isInstalled = linkConfig.isInstalled( - project[platform], - dependency.name, - dependency.config[platform], - ); - - if (isInstalled) { - log.info( - chalk.grey( - `Platform '${platform}' module ${dependency.name} is already linked`, - ), - ); - return null; - } - - log.info(`Linking ${dependency.name} ${platform} dependency`); - - linkConfig.register( - dependency.name, - dependency.config[platform], - params, - project[platform], - ); - - log.info( - `Platform '${platform}' module ${ - dependency.name - } has been successfully linked`, - ); - }); -}; - -const linkAssets = (platforms, project, assets) => { - if (isEmpty(assets)) { - return; - } - - Object.keys(platforms || {}).forEach(platform => { - const linkConfig = - platforms[platform] && - platforms[platform].linkConfig && - platforms[platform].linkConfig(); - if (!linkConfig || !linkConfig.copyAssets) { - return; - } - - log.info(`Linking assets to ${platform} project`); - linkConfig.copyAssets(assets, project[platform]); - }); - - log.info('Assets have been successfully linked to your project'); -}; - -/** - * Updates project and links all dependencies to it. - * - * @param args If optional argument [packageName] is provided, - * only that package is processed. - * @param config CLI config, see local-cli/core/index.js - */ -function link(args: Array, config: RNConfig) { - let project; - let platforms; - try { - project = config.getProjectConfig(); - platforms = config.getPlatformConfig(); - } catch (err) { - log.error( - 'ERRPACKAGEJSON', - 'No package found. Are you sure this is a React Native project?', - ); - return Promise.reject(err); - } - - const hasProjectConfig = Object.keys(platforms).reduce( - (acc, key) => acc || key in project, - false, - ); - if (!hasProjectConfig && findReactNativeScripts()) { - throw new Error( - '`react-native link` can not be used in Create React Native App projects. ' + - 'If you need to include a library that relies on custom native code, ' + - 'you might have to eject first. ' + - 'See https://github.com/react-community/create-react-native-app/blob/master/EJECTING.md ' + - 'for more information.', - ); - } - - let packageName = args[0]; - // Trim the version / tag out of the package name (eg. package@latest) - if (packageName !== undefined) { - packageName = packageName.replace(/^(.+?)(@.+?)$/gi, '$1'); - } - - const dependencies = getDependencyConfig( - config, - packageName ? [packageName] : getProjectDependencies(), - ); - - const assets = dedupeAssets( - dependencies.reduce( - (acc, dependency) => acc.concat(dependency.config.assets), - project.assets, - ), - ); - - const tasks = flatten( - dependencies.map(dependency => [ - () => promisify(dependency.config.commands.prelink || commandStub), - () => linkDependency(platforms, project, dependency), - () => promisify(dependency.config.commands.postlink || commandStub), - ]), - ); - - tasks.push(() => linkAssets(platforms, project, assets)); - - return promiseWaterfall(tasks).catch(err => { - log.error( - `Something went wrong while linking. Error: ${err.message} \n` + - 'Please file an issue here: https://github.com/facebook/react-native/issues', - ); - throw err; - }); -} - -module.exports = { - func: link, - description: 'links all native dependencies (updates native build files)', - name: 'link [packageName]', -}; diff --git a/local-cli/link/pods/addPodEntry.js b/local-cli/link/pods/addPodEntry.js deleted file mode 100644 index e89716eb60dd4d..00000000000000 --- a/local-cli/link/pods/addPodEntry.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = function addPodEntry( - podLines, - linesToAddEntry, - podName, - nodePath, -) { - const newEntry = `pod '${podName}', :path => '../node_modules/${nodePath}'\n`; - - if (!linesToAddEntry) { - return; - } else if (Array.isArray(linesToAddEntry)) { - linesToAddEntry.map(({line, indentation}, idx) => - podLines.splice(line + idx, 0, getLineToAdd(newEntry, indentation)), - ); - } else { - const {line, indentation} = linesToAddEntry; - podLines.splice(line, 0, getLineToAdd(newEntry, indentation)); - } -}; - -function getLineToAdd(newEntry, indentation) { - const spaces = Array(indentation + 1).join(' '); - return spaces + newEntry; -} diff --git a/local-cli/link/pods/findLineToAddPod.js b/local-cli/link/pods/findLineToAddPod.js deleted file mode 100644 index d6902838ea336e..00000000000000 --- a/local-cli/link/pods/findLineToAddPod.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = function findLineToAddPod(podLines, firstTargetLine) { - // match line with new target: target 'project_name' do (most likely target inside podfile main target) - const nextTarget = /target (\'|\")\w+(\'|\") do/g; - // match line that has only 'end' (if we don't catch new target or function, this would mean this is end of current target) - const endOfCurrentTarget = /^\s*end\s*$/g; - // match function definition, like: post_install do |installer| (some Podfiles have function defined inside main target - const functionDefinition = /^\s*[a-z_]+\s+do(\s+\|[a-z]+\|)?/g; - - for (let i = firstTargetLine, len = podLines.length; i < len; i++) { - const matchNextConstruct = - podLines[i].match(nextTarget) || podLines[i].match(functionDefinition); - const matchEnd = podLines[i].match(endOfCurrentTarget); - - if (matchNextConstruct || matchEnd) { - const firstNonSpaceCharacter = podLines[i].search(/\S/); - return { - indentation: firstNonSpaceCharacter + (matchEnd ? 2 : 0), - line: i, - }; - } - } - return null; -}; diff --git a/local-cli/link/pods/findMarkedLinesInPodfile.js b/local-cli/link/pods/findMarkedLinesInPodfile.js deleted file mode 100644 index 5df1c33ac2be33..00000000000000 --- a/local-cli/link/pods/findMarkedLinesInPodfile.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; -const MARKER_TEXT = '# Add new pods below this line'; - -module.exports = function findMarkedLinesInPodfile(podLines) { - const result = []; - for (let i = 0, len = podLines.length; i < len; i++) { - if (podLines[i].includes(MARKER_TEXT)) { - result.push({line: i + 1, indentation: podLines[i].indexOf('#')}); - } - } - return result; -}; diff --git a/local-cli/link/pods/findPodTargetLine.js b/local-cli/link/pods/findPodTargetLine.js deleted file mode 100644 index 22070f8ddf8160..00000000000000 --- a/local-cli/link/pods/findPodTargetLine.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = function findPodTargetLine(podLines, projectName) { - const targetName = projectName.replace('.xcodeproj', ''); - //match first target definition in file: target 'target_name' do - const targetRegex = new RegExp( - 'target (\'|")' + targetName + '(\'|") do', - 'g', - ); - for (let i = 0, len = podLines.length; i < len; i++) { - const match = podLines[i].match(targetRegex); - if (match) { - return i + 1; - } - } - return null; -}; diff --git a/local-cli/link/pods/isInstalled.js b/local-cli/link/pods/isInstalled.js deleted file mode 100644 index d7602d14dda18c..00000000000000 --- a/local-cli/link/pods/isInstalled.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const readPodfile = require('./readPodfile'); - -module.exports = function isInstalled(iOSProject, dependencyConfig) { - if (!iOSProject.podfile) { - return false; - } - // match line with pod declaration: pod 'dependencyPodName' (other possible parameters of pod are ignored) - const dependencyRegExp = new RegExp( - 'pod\\s+(\'|")' + dependencyConfig.podspec + '(\'|")', - 'g', - ); - const podLines = readPodfile(iOSProject.podfile); - for (let i = 0, len = podLines.length; i < len; i++) { - const match = podLines[i].match(dependencyRegExp); - if (match) { - return true; - } - } - return false; -}; diff --git a/local-cli/link/pods/readPodfile.js b/local-cli/link/pods/readPodfile.js deleted file mode 100644 index 281a0a0e496d5a..00000000000000 --- a/local-cli/link/pods/readPodfile.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); - -module.exports = function readPodfile(podfilePath) { - const podContent = fs.readFileSync(podfilePath, 'utf8'); - return podContent.split(/\r?\n/g); -}; diff --git a/local-cli/link/pods/registerNativeModule.js b/local-cli/link/pods/registerNativeModule.js deleted file mode 100644 index f8e757b2708607..00000000000000 --- a/local-cli/link/pods/registerNativeModule.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const readPodfile = require('./readPodfile'); -const findPodTargetLine = require('./findPodTargetLine'); -const findLineToAddPod = require('./findLineToAddPod'); -const findMarkedLinesInPodfile = require('./findMarkedLinesInPodfile'); -const addPodEntry = require('./addPodEntry'); -const savePodFile = require('./savePodFile'); - -module.exports = function registerNativeModulePods( - name, - dependencyConfig, - iOSProject, -) { - const podLines = readPodfile(iOSProject.podfile); - const linesToAddEntry = getLinesToAddEntry(podLines, iOSProject); - addPodEntry(podLines, linesToAddEntry, dependencyConfig.podspec, name); - savePodFile(iOSProject.podfile, podLines); -}; - -function getLinesToAddEntry(podLines, {projectName}) { - const linesToAddPodWithMarker = findMarkedLinesInPodfile(podLines); - if (linesToAddPodWithMarker.length > 0) { - return linesToAddPodWithMarker; - } else { - const firstTargetLined = findPodTargetLine(podLines, projectName); - return findLineToAddPod(podLines, firstTargetLined); - } -} diff --git a/local-cli/link/pods/removePodEntry.js b/local-cli/link/pods/removePodEntry.js deleted file mode 100644 index 02ef4746f81b33..00000000000000 --- a/local-cli/link/pods/removePodEntry.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = function removePodEntry(podfileContent, podName) { - // this regex should catch line(s) with full pod definition, like: pod 'podname', :path => '../node_modules/podname', :subspecs => ['Sub2', 'Sub1'] - const podRegex = new RegExp( - '\\n( |\\t)*pod\\s+("|\')' + - podName + - '("|\')(,\\s*(:[a-z]+\\s*=>)?\\s*(("|\').*?("|\')|\\[[\\s\\S]*?\\]))*\\n', - 'g', - ); - return podfileContent.replace(podRegex, '\n'); -}; diff --git a/local-cli/link/pods/savePodFile.js b/local-cli/link/pods/savePodFile.js deleted file mode 100644 index 640bb646f88640..00000000000000 --- a/local-cli/link/pods/savePodFile.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); - -module.exports = function savePodFile(podfilePath, podLines) { - const newPodfile = podLines.join('\n'); - fs.writeFileSync(podfilePath, newPodfile); -}; diff --git a/local-cli/link/pods/unregisterNativeModule.js b/local-cli/link/pods/unregisterNativeModule.js deleted file mode 100644 index 048e3e8de7e075..00000000000000 --- a/local-cli/link/pods/unregisterNativeModule.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const removePodEntry = require('./removePodEntry'); - -/** - * Unregister native module IOS with CocoaPods - */ -module.exports = function unregisterNativeModule(dependencyConfig, iOSProject) { - const podContent = fs.readFileSync(iOSProject.podfile, 'utf8'); - const removed = removePodEntry(podContent, dependencyConfig.podspec); - fs.writeFileSync(iOSProject.podfile, removed); -}; diff --git a/local-cli/link/pollParams.js b/local-cli/link/pollParams.js deleted file mode 100644 index 6cf23020d46f09..00000000000000 --- a/local-cli/link/pollParams.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -var inquirer = require('inquirer'); - -module.exports = questions => - new Promise((resolve, reject) => { - if (!questions) { - return resolve({}); - } - - inquirer.prompt(questions).then(resolve, reject); - }); diff --git a/local-cli/link/promiseWaterfall.js b/local-cli/link/promiseWaterfall.js deleted file mode 100644 index 0a2ddac88cefbe..00000000000000 --- a/local-cli/link/promiseWaterfall.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * Given an array of promise creators, executes them in a sequence. - * - * If any of the promises in the chain fails, all subsequent promises - * will be skipped - * - * Returns the value last promise from a sequence resolved - */ -module.exports = function promiseWaterfall(tasks) { - return tasks.reduce( - (prevTaskPromise, task) => prevTaskPromise.then(task), - Promise.resolve(), - ); -}; diff --git a/local-cli/link/promisify.js b/local-cli/link/promisify.js deleted file mode 100644 index 2605bf95e12140..00000000000000 --- a/local-cli/link/promisify.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -module.exports = func => - new Promise((resolve, reject) => - func((err, res) => (err ? reject(err) : resolve(res))), - ); diff --git a/local-cli/link/unlink.js b/local-cli/link/unlink.js deleted file mode 100644 index 48ed5f192c0e0f..00000000000000 --- a/local-cli/link/unlink.js +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const log = require('npmlog'); - -const getProjectDependencies = require('./getProjectDependencies'); -const getDependencyConfig = require('./getDependencyConfig'); -const difference = require('lodash').difference; -const filter = require('lodash').filter; -const flatten = require('lodash').flatten; -const isEmpty = require('lodash').isEmpty; -const promiseWaterfall = require('./promiseWaterfall'); -const commandStub = require('./commandStub'); -const promisify = require('./promisify'); - -log.heading = 'rnpm-link'; - -const unlinkDependency = ( - platforms, - project, - dependency, - packageName, - otherDependencies, -) => { - Object.keys(platforms || {}).forEach(platform => { - if (!project[platform] || !dependency[platform]) { - return; - } - - const linkConfig = - platforms[platform] && - platforms[platform].linkConfig && - platforms[platform].linkConfig(); - if (!linkConfig || !linkConfig.isInstalled || !linkConfig.unregister) { - return; - } - - const isInstalled = linkConfig.isInstalled( - project[platform], - packageName, - dependency[platform], - ); - - if (!isInstalled) { - log.info(`Platform '${platform}' module ${packageName} is not installed`); - return; - } - - log.info(`Unlinking ${packageName} ${platform} dependency`); - - linkConfig.unregister( - packageName, - dependency[platform], - project[platform], - otherDependencies, - ); - - log.info( - `Platform '${platform}' module ${ - dependency.name - } has been successfully unlinked`, - ); - }); -}; - -/** - * Updates project and unlink specific dependency - * - * If optional argument [packageName] is provided, it's the only one - * that's checked - */ -function unlink(args, config) { - const packageName = args[0]; - - let platforms; - let project; - let dependency; - - try { - platforms = config.getPlatformConfig(); - project = config.getProjectConfig(); - } catch (err) { - log.error( - 'ERRPACKAGEJSON', - "No package found. Are you sure it's a React Native project?", - ); - return Promise.reject(err); - } - - try { - dependency = config.getDependencyConfig(packageName); - } catch (err) { - log.warn( - 'ERRINVALIDPROJ', - `Project ${packageName} is not a react-native library`, - ); - return Promise.reject(err); - } - - const allDependencies = getDependencyConfig(config, getProjectDependencies()); - const otherDependencies = filter( - allDependencies, - d => d.name !== packageName, - ); - - const tasks = [ - () => promisify(dependency.commands.preunlink || commandStub), - () => - unlinkDependency( - platforms, - project, - dependency, - packageName, - otherDependencies, - ), - () => promisify(dependency.commands.postunlink || commandStub), - ]; - - return promiseWaterfall(tasks) - .then(() => { - // @todo move all these to `tasks` array, just like in - // link - const assets = difference( - dependency.assets, - flatten(allDependencies, d => d.assets), - ); - - if (isEmpty(assets)) { - return Promise.resolve(); - } - - Object.keys(platforms || {}).forEach(platform => { - const linkConfig = - platforms[platform] && - platforms[platform].linkConfig && - platforms[platform].linkConfig(); - if (!linkConfig || !linkConfig.unlinkAssets) { - return; - } - - log.info(`Unlinking assets from ${platform} project`); - linkConfig.unlinkAssets(assets, project[platform]); - }); - - log.info( - `${packageName} assets has been successfully unlinked from your project`, - ); - }) - .catch(err => { - log.error( - `It seems something went wrong while unlinking. Error: ${err.message}`, - ); - throw err; - }); -} - -module.exports = { - func: unlink, - description: 'unlink native dependency', - name: 'unlink ', -}; diff --git a/local-cli/logAndroid/logAndroid.js b/local-cli/logAndroid/logAndroid.js deleted file mode 100644 index 322bc8eae444f1..00000000000000 --- a/local-cli/logAndroid/logAndroid.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const chalk = require('chalk'); -const child_process = require('child_process'); - -/** - * Starts adb logcat - */ -function logAndroid() { - return new Promise((resolve, reject) => { - _logAndroid(resolve, reject); - }); -} - -function _logAndroid() { - try { - const adbPath = process.env.ANDROID_HOME - ? process.env.ANDROID_HOME + '/platform-tools/adb' - : 'adb'; - - const adbArgs = ['logcat', '*:S', 'ReactNative:V', 'ReactNativeJS:V']; - - console.log( - chalk.bold(`Starting the logger (${adbPath} ${adbArgs.join(' ')})...`), - ); - - const log = child_process.spawnSync(adbPath, adbArgs, {stdio: 'inherit'}); - - if (log.error !== null) { - throw log.error; - } - } catch (e) { - console.log( - chalk.red('adb invocation failed. Do you have adb in your PATH?'), - ); - return Promise.reject(); - } -} - -module.exports = { - name: 'log-android', - description: 'starts adb logcat', - func: logAndroid, -}; diff --git a/local-cli/logIOS/logIOS.js b/local-cli/logIOS/logIOS.js deleted file mode 100644 index 9d9aa68faf4237..00000000000000 --- a/local-cli/logIOS/logIOS.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const chalk = require('chalk'); -const child_process = require('child_process'); -const os = require('os'); -const path = require('path'); - -/** - * Starts iOS device syslog tail - */ -function logIOS() { - return new Promise((resolve, reject) => { - _logIOS(resolve, reject); - }); -} - -function _logIOS() { - let rawDevices; - - try { - rawDevices = child_process.execFileSync( - 'xcrun', - ['simctl', 'list', 'devices', '--json'], - {encoding: 'utf8'}, - ); - } catch (e) { - console.log( - chalk.red( - 'xcrun invocation failed. Please check that Xcode is installed.', - ), - ); - return Promise.reject(e); - } - - const {devices} = JSON.parse(rawDevices); - - const device = _findAvailableDevice(devices); - if (device === undefined) { - console.log(chalk.red('No active iOS device found')); - return Promise.reject(); - } - - return tailDeviceLogs(device.udid); -} - -function _findAvailableDevice(devices) { - for (const key of Object.keys(devices)) { - for (const device of devices[key]) { - if (device.availability === '(available)' && device.state === 'Booted') { - return device; - } - } - } -} - -function tailDeviceLogs(udid) { - const logDir = path.join( - os.homedir(), - 'Library', - 'Logs', - 'CoreSimulator', - udid, - 'asl', - ); - - const log = child_process.spawnSync( - 'syslog', - ['-w', '-F', 'std', '-d', logDir], - {stdio: 'inherit'}, - ); - - if (log.error !== null) { - console.log(chalk.red('syslog invocation failed.')); - return Promise.reject(log.error); - } -} - -module.exports = { - name: 'log-ios', - description: 'starts iOS device syslog tail', - func: logIOS, -}; diff --git a/local-cli/runAndroid/adb.js b/local-cli/runAndroid/adb.js deleted file mode 100644 index 7846a4724d91d3..00000000000000 --- a/local-cli/runAndroid/adb.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -const child_process = require('child_process'); - -/** - * Parses the output of the 'adb devices' command - */ -function parseDevicesResult(result: string): Array { - if (!result) { - return []; - } - - const devices = []; - const lines = result.trim().split(/\r?\n/); - - for (let i = 0; i < lines.length; i++) { - let words = lines[i].split(/[ ,\t]+/).filter(w => w !== ''); - - if (words[1] === 'device') { - devices.push(words[0]); - } - } - return devices; -} - -/** - * Executes the commands needed to get a list of devices from ADB - */ -function getDevices(): Array { - try { - const devicesResult = child_process.execSync('adb devices'); - return parseDevicesResult(devicesResult.toString()); - } catch (e) { - return []; - } -} - -module.exports = { - parseDevicesResult: parseDevicesResult, - getDevices: getDevices, -}; diff --git a/local-cli/runAndroid/runAndroid.js b/local-cli/runAndroid/runAndroid.js deleted file mode 100644 index f94caa2661b57f..00000000000000 --- a/local-cli/runAndroid/runAndroid.js +++ /dev/null @@ -1,491 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const adb = require('./adb'); -const chalk = require('chalk'); -const child_process = require('child_process'); -const fs = require('fs'); -const isPackagerRunning = require('../util/isPackagerRunning'); -const findReactNativeScripts = require('../util/findReactNativeScripts'); -const isString = require('lodash/isString'); -const path = require('path'); -const Promise = require('promise'); - -// Verifies this is an Android project -function checkAndroid(root) { - return fs.existsSync(path.join(root, 'android/gradlew')); -} - -/** - * Starts the app on a connected Android emulator or device. - */ -function runAndroid(argv, config, args) { - if (!checkAndroid(args.root)) { - const reactNativeScriptsPath = findReactNativeScripts(); - if (reactNativeScriptsPath) { - child_process.spawnSync( - reactNativeScriptsPath, - ['android'].concat(process.argv.slice(1)), - {stdio: 'inherit'}, - ); - } else { - console.log( - chalk.red( - 'Android project not found. Maybe run react-native android first?', - ), - ); - } - return; - } - - if (!args.packager) { - return buildAndRun(args); - } - - return isPackagerRunning(args.port).then(result => { - if (result === 'running') { - console.log(chalk.bold('JS server already running.')); - } else if (result === 'unrecognized') { - console.warn( - chalk.yellow('JS server not recognized, continuing with build...'), - ); - } else { - // result == 'not_running' - console.log(chalk.bold('Starting JS server...')); - startServerInNewWindow(args.port, args.terminal); - } - return buildAndRun(args); - }); -} - -function getAdbPath() { - return process.env.ANDROID_HOME - ? process.env.ANDROID_HOME + '/platform-tools/adb' - : 'adb'; -} - -// Runs ADB reverse tcp:8081 tcp:8081 to allow loading the jsbundle from the packager -function tryRunAdbReverse(packagerPort, device) { - try { - const adbPath = getAdbPath(); - const adbArgs = ['reverse', `tcp:${packagerPort}`, `tcp:${packagerPort}`]; - - // If a device is specified then tell adb to use it - if (device) { - adbArgs.unshift('-s', device); - } - - console.log(chalk.bold(`Running ${adbPath} ${adbArgs.join(' ')}`)); - - child_process.execFileSync(adbPath, adbArgs, { - stdio: [process.stdin, process.stdout, process.stderr], - }); - } catch (e) { - console.log(chalk.yellow(`Could not run adb reverse: ${e.message}`)); - } -} - -function getPackageNameWithSuffix(appId, appIdSuffix, packageName) { - if (appId) { - return appId; - } else if (appIdSuffix) { - return packageName + '.' + appIdSuffix; - } - - return packageName; -} - -// Builds the app and runs it on a connected emulator / device. -function buildAndRun(args) { - process.chdir(path.join(args.root, 'android')); - const cmd = process.platform.startsWith('win') ? 'gradlew.bat' : './gradlew'; - - const packageName = fs - .readFileSync(`${args.appFolder}/src/main/AndroidManifest.xml`, 'utf8') - .match(/package="(.+?)"/)[1]; - - const packageNameWithSuffix = getPackageNameWithSuffix( - args.appId, - args.appIdSuffix, - packageName, - ); - - const adbPath = getAdbPath(); - if (args.deviceId) { - if (isString(args.deviceId)) { - return runOnSpecificDevice( - args, - cmd, - packageNameWithSuffix, - packageName, - adbPath, - ); - } else { - console.log(chalk.red('Argument missing for parameter --deviceId')); - } - } else { - return runOnAllDevices( - args, - cmd, - packageNameWithSuffix, - packageName, - adbPath, - ); - } -} - -function runOnSpecificDevice( - args, - gradlew, - packageNameWithSuffix, - packageName, - adbPath, -) { - let devices = adb.getDevices(); - if (devices && devices.length > 0) { - if (devices.indexOf(args.deviceId) !== -1) { - buildApk(gradlew); - installAndLaunchOnDevice( - args, - args.deviceId, - packageNameWithSuffix, - packageName, - adbPath, - ); - } else { - console.log( - 'Could not find device with the id: "' + args.deviceId + '".', - ); - console.log('Choose one of the following:'); - console.log(devices); - } - } else { - console.log('No Android devices connected.'); - } -} - -function buildApk(gradlew) { - try { - console.log(chalk.bold('Building the app...')); - - // using '-x lint' in order to ignore linting errors while building the apk - child_process.execFileSync(gradlew, ['build', '-x', 'lint'], { - stdio: [process.stdin, process.stdout, process.stderr], - }); - } catch (e) { - console.log( - chalk.red('Could not build the app, read the error above for details.\n'), - ); - } -} - -function tryInstallAppOnDevice(args, device) { - try { - const pathToApk = `${args.appFolder}/build/outputs/apk/${ - args.appFolder - }-debug.apk`; - const adbPath = getAdbPath(); - const adbArgs = ['-s', device, 'install', pathToApk]; - console.log( - chalk.bold( - `Installing the app on the device (cd android && adb -s ${device} install ${pathToApk}`, - ), - ); - child_process.execFileSync(adbPath, adbArgs, { - stdio: [process.stdin, process.stdout, process.stderr], - }); - } catch (e) { - console.log(e.message); - console.log( - chalk.red( - 'Could not install the app on the device, read the error above for details.\n', - ), - ); - } -} - -function tryLaunchAppOnDevice( - device, - packageNameWithSuffix, - packageName, - adbPath, - mainActivity, -) { - try { - const adbArgs = [ - '-s', - device, - 'shell', - 'am', - 'start', - '-n', - packageNameWithSuffix + '/' + packageName + '.' + mainActivity, - ]; - console.log( - chalk.bold( - `Starting the app on ${device} (${adbPath} ${adbArgs.join(' ')})...`, - ), - ); - child_process.spawnSync(adbPath, adbArgs, {stdio: 'inherit'}); - } catch (e) { - console.log( - chalk.red('adb invocation failed. Do you have adb in your PATH?'), - ); - } -} - -function installAndLaunchOnDevice( - args, - selectedDevice, - packageNameWithSuffix, - packageName, - adbPath, -) { - tryRunAdbReverse(args.port, selectedDevice); - tryInstallAppOnDevice(args, selectedDevice); - tryLaunchAppOnDevice( - selectedDevice, - packageNameWithSuffix, - packageName, - adbPath, - args.mainActivity, - ); -} - -function runOnAllDevices( - args, - cmd, - packageNameWithSuffix, - packageName, - adbPath, -) { - try { - const gradleArgs = []; - if (args.variant) { - gradleArgs.push( - 'install' + args.variant[0].toUpperCase() + args.variant.slice(1), - ); - } else if (args.flavor) { - console.warn( - chalk.yellow('--flavor has been deprecated. Use --variant instead'), - ); - gradleArgs.push( - 'install' + args.flavor[0].toUpperCase() + args.flavor.slice(1), - ); - } else { - gradleArgs.push('installDebug'); - } - - if (args.installDebug) { - gradleArgs.push(args.installDebug); - } - - console.log( - chalk.bold( - `Building and installing the app on the device (cd android && ${cmd} ${gradleArgs.join( - ' ', - )})...`, - ), - ); - - child_process.execFileSync(cmd, gradleArgs, { - stdio: [process.stdin, process.stdout, process.stderr], - }); - } catch (e) { - console.log( - chalk.red( - 'Could not install the app on the device, read the error above for details.\n' + - 'Make sure you have an Android emulator running or a device connected and have\n' + - 'set up your Android development environment:\n' + - 'https://facebook.github.io/react-native/docs/getting-started.html', - ), - ); - // stderr is automatically piped from the gradle process, so the user - // should see the error already, there is no need to do - // `console.log(e.stderr)` - return Promise.reject(e); - } - const devices = adb.getDevices(); - if (devices && devices.length > 0) { - devices.forEach(device => { - tryRunAdbReverse(args.port, device); - tryLaunchAppOnDevice( - device, - packageNameWithSuffix, - packageName, - adbPath, - args.mainActivity, - ); - }); - } else { - try { - // If we cannot execute based on adb devices output, fall back to - // shell am start - const fallbackAdbArgs = [ - 'shell', - 'am', - 'start', - '-n', - packageNameWithSuffix + '/' + packageName + '.MainActivity', - ]; - console.log( - chalk.bold( - `Starting the app (${adbPath} ${fallbackAdbArgs.join(' ')}...`, - ), - ); - child_process.spawnSync(adbPath, fallbackAdbArgs, {stdio: 'inherit'}); - } catch (e) { - console.log( - chalk.red('adb invocation failed. Do you have adb in your PATH?'), - ); - // stderr is automatically piped from the gradle process, so the user - // should see the error already, there is no need to do - // `console.log(e.stderr)` - return Promise.reject(e); - } - } -} - -function startServerInNewWindow(port, terminal = process.env.REACT_TERMINAL) { - // set up OS-specific filenames and commands - const isWindows = /^win/.test(process.platform); - const scriptFile = isWindows - ? 'launchPackager.bat' - : 'launchPackager.command'; - const packagerEnvFilename = isWindows ? '.packager.bat' : '.packager.env'; - const portExportContent = isWindows - ? `set RCT_METRO_PORT=${port}` - : `export RCT_METRO_PORT=${port}`; - - // set up the launchpackager.(command|bat) file - const scriptsDir = path.resolve(__dirname, '..', '..', 'scripts'); - const launchPackagerScript = path.resolve(scriptsDir, scriptFile); - const procConfig = {cwd: scriptsDir}; - - // set up the .packager.(env|bat) file to ensure the packager starts on the right port - const packagerEnvFile = path.join( - __dirname, - '..', - '..', - 'scripts', - packagerEnvFilename, - ); - - // ensure we overwrite file by passing the 'w' flag - fs.writeFileSync(packagerEnvFile, portExportContent, { - encoding: 'utf8', - flag: 'w', - }); - - if (process.platform === 'darwin') { - if (terminal) { - return child_process.spawnSync( - 'open', - ['-a', terminal, launchPackagerScript], - procConfig, - ); - } - return child_process.spawnSync('open', [launchPackagerScript], procConfig); - } else if (process.platform === 'linux') { - if (terminal) { - procConfig.detached = true; - return child_process.spawn( - terminal, - ['-e', 'sh ' + launchPackagerScript], - procConfig, - ); - } - // By default, the child shell process will be attached to the parent - procConfig.detached = false; - return child_process.spawn('sh', [launchPackagerScript], procConfig); - } else if (/^win/.test(process.platform)) { - procConfig.detached = true; - procConfig.stdio = 'ignore'; - return child_process.spawn( - 'cmd.exe', - ['/C', launchPackagerScript], - procConfig, - ); - } else { - console.log( - chalk.red( - `Cannot start the packager. Unknown platform ${process.platform}`, - ), - ); - } -} - -module.exports = { - name: 'run-android', - description: - 'builds your app and starts it on a connected Android emulator or device', - func: runAndroid, - options: [ - { - command: '--install-debug', - }, - { - command: '--root [string]', - description: - 'Override the root directory for the android build (which contains the android directory)', - default: '', - }, - { - command: '--flavor [string]', - description: '--flavor has been deprecated. Use --variant instead', - }, - { - command: '--variant [string]', - }, - { - command: '--appFolder [string]', - description: - 'Specify a different application folder name for the android source.', - default: 'app', - }, - { - command: '--appId [string]', - description: 'Specify an applicationId to launch after build.', - default: '', - }, - { - command: '--appIdSuffix [string]', - description: 'Specify an applicationIdSuffix to launch after build.', - default: '', - }, - { - command: '--main-activity [string]', - description: 'Name of the activity to start', - default: 'MainActivity', - }, - { - command: '--deviceId [string]', - description: - 'builds your app and starts it on a specific device/simulator with the ' + - 'given device id (listed by running "adb devices" on the command line).', - }, - { - command: '--no-packager', - description: 'Do not launch packager while building', - }, - { - command: '--port [number]', - default: process.env.RCT_METRO_PORT || 8081, - parse: (val: string) => Number(val), - }, - { - command: '--terminal [string]', - description: - 'Launches the Metro Bundler in a new window using the specified terminal path.', - default: '', - }, - ], -}; diff --git a/local-cli/runIOS/__tests__/findMatchingSimulator-test.js b/local-cli/runIOS/__tests__/findMatchingSimulator-test.js deleted file mode 100644 index 8b9a19552a4e87..00000000000000 --- a/local-cli/runIOS/__tests__/findMatchingSimulator-test.js +++ /dev/null @@ -1,717 +0,0 @@ -/** - * /** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.dontMock('../findMatchingSimulator'); - -const findMatchingSimulator = require('../findMatchingSimulator'); - -describe('findMatchingSimulator', () => { - it('should find simulator', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - }, - }, - 'iPhone 6', - ), - ).toEqual({ - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - name: 'iPhone 6', - booted: false, - version: 'iOS 9.2', - }); - }); - - it('should find simulator with new xcrun format', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 12.1': [ - { - state: 'Shutdown', - isAvailable: 'YES', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - { - state: 'Shutdown', - isAvailable: 'YES', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - isAvailable: 'YES', - name: 'iPhone XS Max', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - availabilityError: '', - }, - { - state: 'Shutdown', - isAvailable: 'YES', - name: 'iPad Air', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - availabilityError: '', - }, - { - state: 'Shutdown', - isAvailable: 'YES', - name: 'iPad (5th generation)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - availabilityError: '', - }, - ], - }, - }, - 'iPhone 6', - ), - ).toEqual({ - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - name: 'iPhone 6', - booted: false, - version: 'iOS 12.1', - }); - }); - - it('should return null if no simulators available', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - }, - }, - 'iPhone 6', - ), - ).toEqual(null); - }); - - it('should return null if an odd input', () => { - expect(findMatchingSimulator('random string input', 'iPhone 6')).toEqual( - null, - ); - }); - - it('should return the first simulator in list if none is defined', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - }, - }, - null, - ), - ).toEqual({ - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - name: 'iPhone 5', - booted: false, - version: 'iOS 9.2', - }); - }); - - it('should return the first simulator in list if none is defined', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - 'iOS 10.0': [ - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: '2FF48AE5-CC3B-4C80-8D25-48966A6BE2C0', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '841E33FE-E8A1-4B65-9FF8-6EAA6442A3FC', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'CBBB8FB8-77AB-49A9-8297-4CCFE3189C22', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 7', - udid: '3A409DC5-5188-42A6-8598-3AA6F34607A5', - }, - ], - }, - }, - null, - ), - ).toEqual({ - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - name: 'iPhone 5', - booted: false, - version: 'iOS 9.2', - }); - }); - - it('should return the booted simulator in list if none is defined', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Booted', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - }, - }, - null, - ), - ).toEqual({ - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - name: 'iPhone 6s', - booted: true, - version: 'iOS 9.2', - }); - }); - - it('should return the defined simulator in list even if another device is booted', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Booted', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - }, - }, - 'iPhone 6', - ), - ).toEqual({ - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - name: 'iPhone 6', - booted: false, - version: 'iOS 9.2', - }); - }); - - it('should return the booted simulator in list if none is defined (multi ios versions)', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - 'iOS 10.0': [ - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: '2FF48AE5-CC3B-4C80-8D25-48966A6BE2C0', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '841E33FE-E8A1-4B65-9FF8-6EAA6442A3FC', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'CBBB8FB8-77AB-49A9-8297-4CCFE3189C22', - }, - { - state: 'Booted', - availability: '(available)', - name: 'iPhone 7', - udid: '3A409DC5-5188-42A6-8598-3AA6F34607A5', - }, - ], - }, - }, - null, - ), - ).toEqual({ - udid: '3A409DC5-5188-42A6-8598-3AA6F34607A5', - name: 'iPhone 7', - booted: true, - version: 'iOS 10.0', - }); - }); - - it('should return the defined simulator in list even if another device is booted (multi ios versions)', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - 'iOS 10.0': [ - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: '2FF48AE5-CC3B-4C80-8D25-48966A6BE2C0', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '841E33FE-E8A1-4B65-9FF8-6EAA6442A3FC', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'CBBB8FB8-77AB-49A9-8297-4CCFE3189C22', - }, - { - state: 'Booted', - availability: '(available)', - name: 'iPhone 7', - udid: '3A409DC5-5188-42A6-8598-3AA6F34607A5', - }, - ], - }, - }, - 'iPhone 6s', - ), - ).toEqual({ - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - name: 'iPhone 6s', - booted: false, - version: 'iOS 9.2', - }); - }); - - it('should return the simulator with the specified version (multi ios versions)', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - 'iOS 10.0': [ - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: '2FF48AE5-CC3B-4C80-8D25-48966A6BE2C0', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '841E33FE-E8A1-4B65-9FF8-6EAA6442A3FC', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'CBBB8FB8-77AB-49A9-8297-4CCFE3189C22', - }, - { - state: 'Booted', - availability: '(available)', - name: 'iPhone 7', - udid: '3A409DC5-5188-42A6-8598-3AA6F34607A5', - }, - ], - }, - }, - 'iPhone 6s (10.0)', - ), - ).toEqual({ - udid: 'CBBB8FB8-77AB-49A9-8297-4CCFE3189C22', - name: 'iPhone 6s', - booted: false, - version: 'iOS 10.0', - }); - }); - - it('should return null if the version is specified and no device with the exact version exists (multi ios versions)', () => { - expect( - findMatchingSimulator( - { - devices: { - 'iOS 9.2': [ - { - state: 'Shutdown', - availability: '(unavailable, runtime profile not found)', - name: 'iPhone 4s', - udid: 'B9B5E161-416B-43C4-A78F-729CB96CC8C6', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 5', - udid: '1CCBBF8B-5773-4EA6-BD6F-C308C87A1ADB', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: 'BA0D93BD-07E6-4182-9B0A-F60A2474139C', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '9564ABEE-9EC2-4B4A-B443-D3710929A45A', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6s', - udid: 'D0F29BE7-CC3C-4976-888D-C739B4F50508', - }, - ], - 'iOS 10.0': [ - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6', - udid: '2FF48AE5-CC3B-4C80-8D25-48966A6BE2C0', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'iPhone 6 (Plus)', - udid: '841E33FE-E8A1-4B65-9FF8-6EAA6442A3FC', - }, - { - state: 'Booted', - availability: '(available)', - name: 'iPhone 7', - udid: '3A409DC5-5188-42A6-8598-3AA6F34607A5', - }, - ], - }, - }, - 'iPhone 6s (10.0)', - ), - ).toEqual(null); - }); - - it('should return AppleTV devices if in the list', () => { - expect( - findMatchingSimulator( - { - devices: { - 'tvOS 11.2': [ - { - state: 'Booted', - availability: '(available)', - name: 'Apple TV', - udid: '816C30EA-38EA-41AC-BFDA-96FB632D522E', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'Apple TV 4K', - udid: 'BCBB7E4B-D872-4D61-BC61-7C9805551075', - }, - { - state: 'Shutdown', - availability: '(available)', - name: 'Apple TV 4K (at 1080p)', - udid: '1DE12308-1C14-4F0F-991E-A3ADC41BDFFC', - }, - ], - }, - }, - 'Apple TV', - ), - ).toEqual({ - udid: '816C30EA-38EA-41AC-BFDA-96FB632D522E', - name: 'Apple TV', - booted: true, - version: 'tvOS 11.2', - }); - }); -}); diff --git a/local-cli/runIOS/__tests__/findXcodeProject-test.js b/local-cli/runIOS/__tests__/findXcodeProject-test.js deleted file mode 100644 index 8071d728f5a59b..00000000000000 --- a/local-cli/runIOS/__tests__/findXcodeProject-test.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.dontMock('../findXcodeProject'); - -const findXcodeProject = require('../findXcodeProject'); - -describe('findXcodeProject', () => { - it('should find *.xcodeproj file', () => { - expect( - findXcodeProject([ - '.DS_Store', - 'AwesomeApp', - 'AwesomeApp.xcodeproj', - 'AwesomeAppTests', - 'PodFile', - 'Podfile.lock', - 'Pods', - ]), - ).toEqual({ - name: 'AwesomeApp.xcodeproj', - isWorkspace: false, - }); - }); - - it('should prefer *.xcworkspace', () => { - expect( - findXcodeProject([ - '.DS_Store', - 'AwesomeApp', - 'AwesomeApp.xcodeproj', - 'AwesomeApp.xcworkspace', - 'AwesomeAppTests', - 'PodFile', - 'Podfile.lock', - 'Pods', - ]), - ).toEqual({ - name: 'AwesomeApp.xcworkspace', - isWorkspace: true, - }); - }); - - it('should return null if nothing found', () => { - expect( - findXcodeProject([ - '.DS_Store', - 'AwesomeApp', - 'AwesomeAppTests', - 'PodFile', - 'Podfile.lock', - 'Pods', - ]), - ).toEqual(null); - }); -}); diff --git a/local-cli/runIOS/__tests__/parseIOSDevicesList-test.js b/local-cli/runIOS/__tests__/parseIOSDevicesList-test.js deleted file mode 100644 index 8914b5937396dd..00000000000000 --- a/local-cli/runIOS/__tests__/parseIOSDevicesList-test.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -'use strict'; - -jest.dontMock('../parseIOSDevicesList'); -var parseIOSDevicesList = require('../parseIOSDevicesList'); - -describe('parseIOSDevicesList', () => { - it('parses typical output', () => { - var devices = parseIOSDevicesList( - [ - 'Known Devices:', - 'Maxs MacBook Pro [11111111-1111-1111-1111-111111111111]', - "Max's iPhone (9.2) [11111111111111111111aaaaaaaaaaaaaaaaaaaa]", - 'iPad 2 (9.3) [07538CE4-675B-4EDA-90F2-3DD3CD93309D] (Simulator)', - 'iPad Air (9.3) [0745F6D1-6DC5-4427-B9A6-6FBA327ED65A] (Simulator)', - 'iPhone 6s (9.3) [3DBE4ECF-9A86-469E-921B-EE0F9C9AB8F4] (Simulator)', - 'Known Templates:', - 'Activity Monitor', - 'Blank', - 'System Usage', - 'Zombies', - ].join('\n'), - ); - - expect(devices).toEqual([ - { - name: "Max's iPhone", - udid: '11111111111111111111aaaaaaaaaaaaaaaaaaaa', - version: '9.2', - }, - ]); - }); - - it('ignores garbage', () => { - expect(parseIOSDevicesList('Something went terribly wrong (-42)')).toEqual( - [], - ); - }); -}); diff --git a/local-cli/runIOS/findMatchingSimulator.js b/local-cli/runIOS/findMatchingSimulator.js deleted file mode 100644 index 30e2156d421fee..00000000000000 --- a/local-cli/runIOS/findMatchingSimulator.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -/** - * Takes in a parsed simulator list and a desired name, and returns an object with the matching simulator. The desired - * name can optionally include the iOS version in between parenthesis after the device name. Ex: "iPhone 6 (9.2)" in - * which case it'll attempt to find a simulator with the exact version specified. - * - * If the simulatorString argument is null, we'll go into default mode and return the currently booted simulator, or if - * none is booted, it will be the first in the list. - * - * @param Object simulators a parsed list from `xcrun simctl list --json devices` command - * @param String|null simulatorString the string with the name of desired simulator. If null, it will use the currently - * booted simulator, or if none are booted, the first in the list. - * @returns {Object} {udid, name, version} - */ -function findMatchingSimulator(simulators, simulatorString) { - if (!simulators.devices) { - return null; - } - const devices = simulators.devices; - - const parsedSimulatorName = simulatorString - ? simulatorString.match(/(.*)? (?:\((.*)?\))?/) - : []; - if (parsedSimulatorName[2] !== undefined) { - var simulatorVersion = parsedSimulatorName[2]; - var simulatorName = parsedSimulatorName[1]; - } else { - simulatorName = simulatorString; - } - - var match; - for (let version in devices) { - // Making sure the version of the simulator is an iOS or tvOS (Removes Apple Watch, etc) - if (!version.startsWith('iOS') && !version.startsWith('tvOS')) { - continue; - } - if (simulatorVersion && !version.endsWith(simulatorVersion)) { - continue; - } - for (let i in devices[version]) { - let simulator = devices[version][i]; - // Skipping non-available simulator - if ( - simulator.availability !== '(available)' && - simulator.isAvailable !== 'YES' - ) { - continue; - } - let booted = simulator.state === 'Booted'; - if (booted && simulatorName === null) { - return { - udid: simulator.udid, - name: simulator.name, - booted, - version, - }; - } - if (simulator.name === simulatorName && !match) { - match = { - udid: simulator.udid, - name: simulator.name, - booted, - version, - }; - } - // Keeps track of the first available simulator for use if we can't find one above. - if (simulatorName === null && !match) { - match = { - udid: simulator.udid, - name: simulator.name, - booted, - version, - }; - } - } - } - if (match) { - return match; - } - return null; -} - -module.exports = findMatchingSimulator; diff --git a/local-cli/runIOS/findXcodeProject.js b/local-cli/runIOS/findXcodeProject.js deleted file mode 100644 index 318f11ec849870..00000000000000 --- a/local-cli/runIOS/findXcodeProject.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -'use strict'; - -const path = require('path'); - -type ProjectInfo = { - name: string, - isWorkspace: boolean, -}; - -function findXcodeProject(files: Array): ?ProjectInfo { - const sortedFiles = files.sort(); - for (let i = sortedFiles.length - 1; i >= 0; i--) { - const fileName = files[i]; - const ext = path.extname(fileName); - - if (ext === '.xcworkspace') { - return { - name: fileName, - isWorkspace: true, - }; - } - if (ext === '.xcodeproj') { - return { - name: fileName, - isWorkspace: false, - }; - } - } - - return null; -} - -module.exports = findXcodeProject; diff --git a/local-cli/runIOS/parseIOSDevicesList.js b/local-cli/runIOS/parseIOSDevicesList.js deleted file mode 100644 index 0209c796b39807..00000000000000 --- a/local-cli/runIOS/parseIOSDevicesList.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -'use strict'; - -type IOSDeviceInfo = { - name: string, - udid: string, - version: string, -}; - -/** - * Parses the output of `xcrun simctl list devices` command - */ -function parseIOSDevicesList(text: string): Array { - const devices = []; - text.split('\n').forEach(line => { - const device = line.match(/(.*?) \((.*?)\) \[(.*?)\]/); - const noSimulator = line.match(/(.*?) \((.*?)\) \[(.*?)\] \((.*?)\)/); - if (device != null && noSimulator == null) { - var name = device[1]; - var version = device[2]; - var udid = device[3]; - devices.push({udid, name, version}); - } - }); - - return devices; -} - -module.exports = parseIOSDevicesList; diff --git a/local-cli/runIOS/runIOS.js b/local-cli/runIOS/runIOS.js deleted file mode 100644 index a7ecf7d6ddc471..00000000000000 --- a/local-cli/runIOS/runIOS.js +++ /dev/null @@ -1,455 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const child_process = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const findXcodeProject = require('./findXcodeProject'); -const findReactNativeScripts = require('../util/findReactNativeScripts'); -const parseIOSDevicesList = require('./parseIOSDevicesList'); -const findMatchingSimulator = require('./findMatchingSimulator'); -const getBuildPath = function(configuration = 'Debug', appName, isDevice) { - let device; - - if (isDevice) { - device = 'iphoneos'; - } else if (appName.toLowerCase().includes('tvos')) { - device = 'appletvsimulator'; - } else { - device = 'iphonesimulator'; - } - - return `build/Build/Products/${configuration}-${device}/${appName}.app`; -}; -const xcprettyAvailable = function() { - try { - child_process.execSync('xcpretty --version', { - stdio: [0, 'pipe', 'ignore'], - }); - } catch (error) { - return false; - } - return true; -}; - -function runIOS(argv, config, args) { - if (!fs.existsSync(args.projectPath)) { - const reactNativeScriptsPath = findReactNativeScripts(); - if (reactNativeScriptsPath) { - child_process.spawnSync( - reactNativeScriptsPath, - ['ios'].concat(process.argv.slice(1)), - {stdio: 'inherit'}, - ); - return; - } else { - throw new Error( - 'iOS project folder not found. Are you sure this is a React Native project?', - ); - } - } - process.chdir(args.projectPath); - const xcodeProject = findXcodeProject(fs.readdirSync('.')); - if (!xcodeProject) { - throw new Error('Could not find Xcode project files in ios folder'); - } - - const inferredSchemeName = path.basename( - xcodeProject.name, - path.extname(xcodeProject.name), - ); - const scheme = args.scheme || inferredSchemeName; - console.log( - `Found Xcode ${xcodeProject.isWorkspace ? 'workspace' : 'project'} ${ - xcodeProject.name - }`, - ); - const devices = parseIOSDevicesList( - child_process.execFileSync('xcrun', ['instruments', '-s'], { - encoding: 'utf8', - }), - ); - if (args.device) { - const selectedDevice = matchingDevice(devices, args.device); - if (selectedDevice) { - return runOnDevice( - selectedDevice, - scheme, - xcodeProject, - args.configuration, - args.packager, - args.verbose, - args.port, - ); - } else { - if (devices && devices.length > 0) { - console.log( - 'Could not find device with the name: "' + args.device + '".', - ); - console.log('Choose one of the following:'); - printFoundDevices(devices); - } else { - console.log('No iOS devices connected.'); - } - } - } else if (args.udid) { - return runOnDeviceByUdid(args, scheme, xcodeProject, devices); - } else { - return runOnSimulator(xcodeProject, args, scheme); - } -} - -function runOnDeviceByUdid(args, scheme, xcodeProject, devices) { - const selectedDevice = matchingDeviceByUdid(devices, args.udid); - if (selectedDevice) { - return runOnDevice( - selectedDevice, - scheme, - xcodeProject, - args.configuration, - args.packager, - args.verbose, - args.port, - ); - } else { - if (devices && devices.length > 0) { - console.log('Could not find device with the udid: "' + args.udid + '".'); - console.log('Choose one of the following:'); - printFoundDevices(devices); - } else { - console.log('No iOS devices connected.'); - } - } -} - -function runOnSimulator(xcodeProject, args, scheme) { - return new Promise(resolve => { - try { - var simulators = JSON.parse( - child_process.execFileSync( - 'xcrun', - ['simctl', 'list', '--json', 'devices'], - {encoding: 'utf8'}, - ), - ); - } catch (e) { - throw new Error('Could not parse the simulator list output'); - } - - const selectedSimulator = findMatchingSimulator(simulators, args.simulator); - if (!selectedSimulator) { - throw new Error(`Could not find ${args.simulator} simulator`); - } - - /** - * Booting simulator through `xcrun simctl boot` will boot it in the `headless` mode - * (running in the background). - * - * In order for user to see the app and the simulator itself, we have to make sure - * that the Simulator.app is running. - * - * We also pass it `-CurrentDeviceUDID` so that when we launch it for the first time, - * it will not boot the "default" device, but the one we set. If the app is already running, - * this flag has no effect. - */ - const activeDeveloperDir = child_process - .execFileSync('xcode-select', ['-p'], {encoding: 'utf8'}) - .trim(); - child_process.execFileSync('open', [ - `${activeDeveloperDir}/Applications/Simulator.app`, - '--args', - '-CurrentDeviceUDID', - selectedSimulator.udid, - ]); - - if (!selectedSimulator.booted) { - const simulatorFullName = formattedDeviceName(selectedSimulator); - console.log(`Launching ${simulatorFullName}...`); - try { - child_process.spawnSync('xcrun', [ - 'instruments', - '-w', - selectedSimulator.udid, - ]); - } catch (e) { - // instruments always fail with 255 because it expects more arguments, - // but we want it to only launch the simulator - } - } - - buildProject( - xcodeProject, - selectedSimulator.udid, - scheme, - args.configuration, - args.packager, - args.verbose, - args.port, - ).then(appName => resolve({udid: selectedSimulator.udid, appName})); - }).then(({udid, appName}) => { - if (!appName) { - appName = scheme; - } - let appPath = getBuildPath(args.configuration, appName); - console.log(`Installing ${appPath}`); - child_process.spawnSync('xcrun', ['simctl', 'install', udid, appPath], { - stdio: 'inherit', - }); - - const bundleID = child_process - .execFileSync( - '/usr/libexec/PlistBuddy', - ['-c', 'Print:CFBundleIdentifier', path.join(appPath, 'Info.plist')], - {encoding: 'utf8'}, - ) - .trim(); - - console.log(`Launching ${bundleID}`); - child_process.spawnSync('xcrun', ['simctl', 'launch', udid, bundleID], { - stdio: 'inherit', - }); - }); -} - -function runOnDevice( - selectedDevice, - scheme, - xcodeProject, - configuration, - launchPackager, - verbose, - port, -) { - return buildProject( - xcodeProject, - selectedDevice.udid, - scheme, - configuration, - launchPackager, - verbose, - port, - ).then(appName => { - if (!appName) { - appName = scheme; - } - const iosDeployInstallArgs = [ - '--bundle', - getBuildPath(configuration, appName, true), - '--id', - selectedDevice.udid, - '--justlaunch', - ]; - console.log( - `installing and launching your app on ${selectedDevice.name}...`, - ); - const iosDeployOutput = child_process.spawnSync( - 'ios-deploy', - iosDeployInstallArgs, - {encoding: 'utf8'}, - ); - if (iosDeployOutput.error) { - console.log(''); - console.log('** INSTALLATION FAILED **'); - console.log('Make sure you have ios-deploy installed globally.'); - console.log('(e.g "npm install -g ios-deploy")'); - } else { - console.log('** INSTALLATION SUCCEEDED **'); - } - }); -} - -function buildProject( - xcodeProject, - udid, - scheme, - configuration = 'Debug', - launchPackager = false, - verbose, - port, -) { - return new Promise((resolve, reject) => { - var xcodebuildArgs = [ - xcodeProject.isWorkspace ? '-workspace' : '-project', - xcodeProject.name, - '-configuration', - configuration, - '-scheme', - scheme, - '-destination', - `id=${udid}`, - '-derivedDataPath', - 'build', - ]; - console.log(`Building using "xcodebuild ${xcodebuildArgs.join(' ')}"`); - let xcpretty; - if (!verbose) { - xcpretty = - xcprettyAvailable() && - child_process.spawn('xcpretty', [], { - stdio: ['pipe', process.stdout, process.stderr], - }); - } - const buildProcess = child_process.spawn( - 'xcodebuild', - xcodebuildArgs, - getProcessOptions(launchPackager, port), - ); - let buildOutput = ''; - buildProcess.stdout.on('data', function(data) { - buildOutput += data.toString(); - if (xcpretty) { - xcpretty.stdin.write(data); - } else { - console.log(data.toString()); - } - }); - buildProcess.stderr.on('data', function(data) { - console.error(data.toString()); - }); - buildProcess.on('close', function(code) { - if (xcpretty) { - xcpretty.stdin.end(); - } - //FULL_PRODUCT_NAME is the actual file name of the app, which actually comes from the Product Name in the build config, which does not necessary match a scheme name, example output line: export FULL_PRODUCT_NAME="Super App Dev.app" - let productNameMatch = /export FULL_PRODUCT_NAME="?(.+).app"?$/m.exec( - buildOutput, - ); - if ( - productNameMatch && - productNameMatch.length && - productNameMatch.length > 1 - ) { - return resolve(productNameMatch[1]); //0 is the full match, 1 is the app name - } - return buildProcess.error ? reject(buildProcess.error) : resolve(); - }); - }); -} - -function matchingDevice(devices, deviceName) { - if (deviceName === true && devices.length === 1) { - console.log( - `Using first available device ${ - devices[0].name - } due to lack of name supplied.`, - ); - return devices[0]; - } - for (let i = devices.length - 1; i >= 0; i--) { - if ( - devices[i].name === deviceName || - formattedDeviceName(devices[i]) === deviceName - ) { - return devices[i]; - } - } -} - -function matchingDeviceByUdid(devices, udid) { - for (let i = devices.length - 1; i >= 0; i--) { - if (devices[i].udid === udid) { - return devices[i]; - } - } -} - -function formattedDeviceName(simulator) { - return `${simulator.name} (${simulator.version})`; -} - -function printFoundDevices(devices) { - for (let i = devices.length - 1; i >= 0; i--) { - console.log(devices[i].name + ' Udid: ' + devices[i].udid); - } -} - -function getProcessOptions(launchPackager, port) { - if (launchPackager) { - return { - env: {...process.env, RCT_METRO_PORT: port}, - }; - } - - return { - env: {...process.env, RCT_NO_LAUNCH_PACKAGER: true}, - }; -} - -module.exports = { - name: 'run-ios', - description: 'builds your app and starts it on iOS simulator', - func: runIOS, - examples: [ - { - desc: 'Run on a different simulator, e.g. iPhone 5', - cmd: 'react-native run-ios --simulator "iPhone 5"', - }, - { - desc: 'Pass a non-standard location of iOS directory', - cmd: 'react-native run-ios --project-path "./app/ios"', - }, - { - desc: "Run on a connected device, e.g. Max's iPhone", - cmd: 'react-native run-ios --device "Max\'s iPhone"', - }, - { - desc: 'Run on the AppleTV simulator', - cmd: - 'react-native run-ios --simulator "Apple TV" --scheme "helloworld-tvOS"', - }, - ], - options: [ - { - command: '--simulator [string]', - description: - 'Explicitly set simulator to use. Optionally include iOS version between' + - 'parenthesis at the end to match an exact version: "iPhone 6 (10.0)"', - default: 'iPhone X', - }, - { - command: '--configuration [string]', - description: 'Explicitly set the scheme configuration to use', - }, - { - command: '--scheme [string]', - description: 'Explicitly set Xcode scheme to use', - }, - { - command: '--project-path [string]', - description: - 'Path relative to project root where the Xcode project ' + - "(.xcodeproj) lives. The default is 'ios'.", - default: 'ios', - }, - { - command: '--device [string]', - description: - 'Explicitly set device to use by name. The value is not required if you have a single device connected.', - }, - { - command: '--udid [string]', - description: 'Explicitly set device to use by udid', - }, - { - command: '--no-packager', - description: 'Do not launch packager while building', - }, - { - command: '--verbose', - description: 'Do not use xcpretty even if installed', - }, - { - command: '--port [number]', - default: process.env.RCT_METRO_PORT || 8081, - parse: (val: string) => Number(val), - }, - ], -}; diff --git a/local-cli/server/checkNodeVersion.js b/local-cli/server/checkNodeVersion.js deleted file mode 100644 index 1f73a1e38fb9f3..00000000000000 --- a/local-cli/server/checkNodeVersion.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * Be mindful that this script may be run by legacy NodeJS runtimes. Keep this - * script ES5 compatible (e.g. do not insert the `@format` pragma here which - * may introduce non-ES5 compatible syntax.) - * - */ - -'use strict'; - -var chalk = require('chalk'); -var formatBanner = require('metro-core/src/formatBanner'); -var semver = require('semver'); - -module.exports = function() { - if (!semver.satisfies(process.version, '>=8.3')) { - var engine = semver.satisfies(process.version, '<1') ? 'Node' : 'io.js'; - - var message = - 'You are currently running ' + - engine + - ' ' + - process.version + - '.\n' + - '\n' + - 'React Native runs on Node 8.3 or newer. There are several ways to ' + - 'upgrade Node.js depending on your preference.\n' + - '\n' + - 'nvm: nvm install 8.3 --reinstall-packages-from=node\n' + - 'Homebrew: brew update && brew upgrade node\n' + - 'Installer: download from https://nodejs.org/\n'; - console.log( - formatBanner(message, { - chalkFunction: chalk.green, - marginLeft: 1, - marginRight: 1, - paddingBottom: 1, - }) - ); - process.exit(1); - } -}; diff --git a/local-cli/server/middleware/MiddlewareManager.js b/local-cli/server/middleware/MiddlewareManager.js deleted file mode 100644 index 50c8a59f077d4c..00000000000000 --- a/local-cli/server/middleware/MiddlewareManager.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @strict - * @flow - */ - -const compression = require('compression'); -const connect = require('connect'); -const errorhandler = require('errorhandler'); -const path = require('path'); -const serveStatic = require('serve-static'); -const WebSocketServer = require('ws').Server; - -const indexPageMiddleware = require('./indexPage'); -const copyToClipBoardMiddleware = require('./copyToClipBoardMiddleware'); -const getSecurityHeadersMiddleware = require('./getSecurityHeadersMiddleware'); -const loadRawBodyMiddleware = require('./loadRawBodyMiddleware'); -const openStackFrameInEditorMiddleware = require('./openStackFrameInEditorMiddleware'); -const statusPageMiddleware = require('./statusPageMiddleware'); -const systraceProfileMiddleware = require('./systraceProfileMiddleware'); -const getDevToolsMiddleware = require('./getDevToolsMiddleware'); - -type Options = { - +watchFolders: $ReadOnlyArray, - +host?: string, -} - -type WebSocketProxy = { - server: WebSocketServer, - isChromeConnected: () => boolean, -}; - -type Connect = $Call; - -module.exports = class MiddlewareManager { - app: Connect; - options: Options; - - constructor(options: Options) { - const debuggerUIFolder = path.join(__dirname, '..', 'util', 'debugger-ui'); - - this.options = options; - this.app = connect() - .use(getSecurityHeadersMiddleware) - .use(loadRawBodyMiddleware) - .use(compression()) - .use('/debugger-ui', serveStatic(debuggerUIFolder)) - .use(openStackFrameInEditorMiddleware(this.options)) - .use(copyToClipBoardMiddleware) - .use(statusPageMiddleware) - .use(systraceProfileMiddleware) - .use(indexPageMiddleware) - .use(errorhandler()); - } - - serveStatic = (folder: string) => { - this.app.use(serveStatic(folder)); - }; - - getConnectInstance = () => this.app; - - attachDevToolsSocket = (socket: WebSocketProxy) => { - this.app.use( - getDevToolsMiddleware(this.options, () => socket.isChromeConnected()), - ); - }; -}; diff --git a/local-cli/server/middleware/copyToClipBoardMiddleware.js b/local-cli/server/middleware/copyToClipBoardMiddleware.js deleted file mode 100644 index 69a3171f958645..00000000000000 --- a/local-cli/server/middleware/copyToClipBoardMiddleware.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const copyToClipBoard = require('../util/copyToClipBoard'); -var chalk = require('chalk'); - -/** - * Handle the request from JS to copy contents onto host system clipboard. - * This is only supported on Mac for now. - */ -module.exports = function(req, res, next) { - if (req.url === '/copy-to-clipboard') { - var ret = copyToClipBoard(req.rawBody); - if (!ret) { - console.warn(chalk.red('Copy button is not supported on this platform!')); - } - res.end('OK'); - } else { - next(); - } -}; diff --git a/local-cli/server/middleware/getDevToolsMiddleware.js b/local-cli/server/middleware/getDevToolsMiddleware.js deleted file mode 100644 index f03fd0bbcec1c6..00000000000000 --- a/local-cli/server/middleware/getDevToolsMiddleware.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ -'use strict'; - -const launchChrome = require('../util/launchChrome'); - -const {exec} = require('child_process'); - -function launchChromeDevTools(host, args = '') { - var debuggerURL = 'http://' + host + '/debugger-ui' + args; - console.log('Launching Dev Tools...'); - launchChrome(debuggerURL); -} - -function escapePath(pathname) { - // " Can escape paths with spaces in OS X, Windows, and *nix - return '"' + pathname + '"'; -} - -function launchDevTools({host, watchFolders}, isChromeConnected) { - // Explicit config always wins - var customDebugger = process.env.REACT_DEBUGGER; - if (customDebugger) { - var folders = watchFolders.map(escapePath).join(' '); - var command = customDebugger + ' ' + folders; - console.log('Starting custom debugger by executing: ' + command); - exec(command, function(error, stdout, stderr) { - if (error !== null) { - console.log('Error while starting custom debugger: ' + error); - } - }); - } else if (!isChromeConnected()) { - // Dev tools are not yet open; we need to open a session - launchChromeDevTools(host); - } -} - -module.exports = function(options, isChromeConnected) { - return function(req, res, next) { - var host = req.headers.host; - if (req.url === '/launch-safari-devtools') { - // TODO: remove `console.log` and dev tools binary - console.log( - 'We removed support for Safari dev-tools. ' + - 'If you still need this, please let us know.', - ); - } else if (req.url === '/launch-chrome-devtools') { - // TODO: Remove this case in the future - console.log( - 'The method /launch-chrome-devtools is deprecated. You are ' + - ' probably using an application created with an older CLI with the ' + - ' packager of a newer CLI. Please upgrade your application: ' + - 'https://facebook.github.io/react-native/docs/upgrading.html', - ); - launchDevTools(options, isChromeConnected); - res.end('OK'); - } else if (req.url === '/launch-js-devtools') { - launchDevTools({...options, host}, isChromeConnected); - res.end('OK'); - } else { - next(); - } - }; -}; diff --git a/local-cli/server/middleware/getSecurityHeadersMiddleware.js b/local-cli/server/middleware/getSecurityHeadersMiddleware.js deleted file mode 100644 index d3bad6bf9511b4..00000000000000 --- a/local-cli/server/middleware/getSecurityHeadersMiddleware.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @strict - * @format - */ - -module.exports = function(req, res, next) { - const address = req.client.server.address(); - - // Block any cross origin request. - if ( - req.headers.origin && - req.headers.origin !== `http://localhost:${address.port}` - ) { - next(new Error('Unauthorized')); - return; - } - - // Block MIME-type sniffing. - res.setHeader('X-Content-Type-Options', 'nosniff'); - - next(); -}; diff --git a/local-cli/server/middleware/index.html b/local-cli/server/middleware/index.html deleted file mode 100644 index fdf6bf418090e1..00000000000000 --- a/local-cli/server/middleware/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - React Native - - -

React Native packager is running.

-

Visit documentation

- - diff --git a/local-cli/server/middleware/indexPage.js b/local-cli/server/middleware/indexPage.js deleted file mode 100644 index ee6fc61ad6db8b..00000000000000 --- a/local-cli/server/middleware/indexPage.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -module.exports = function(req, res, next) { - if (req.url === '/') { - res.end(fs.readFileSync(path.join(__dirname, 'index.html'))); - } else { - next(); - } -}; diff --git a/local-cli/server/middleware/loadRawBodyMiddleware.js b/local-cli/server/middleware/loadRawBodyMiddleware.js deleted file mode 100644 index 553f041292576f..00000000000000 --- a/local-cli/server/middleware/loadRawBodyMiddleware.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = function(req, res, next) { - req.rawBody = ''; - req.setEncoding('utf8'); - - req.on('data', function(chunk) { - req.rawBody += chunk; - }); - - req.on('end', function() { - next(); - }); -}; diff --git a/local-cli/server/middleware/openStackFrameInEditorMiddleware.js b/local-cli/server/middleware/openStackFrameInEditorMiddleware.js deleted file mode 100644 index 36cc69ba0d9217..00000000000000 --- a/local-cli/server/middleware/openStackFrameInEditorMiddleware.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const launchEditor = require('../util/launchEditor'); - -module.exports = function({watchFolders}) { - return function(req, res, next) { - if (req.url === '/open-stack-frame') { - const frame = JSON.parse(req.rawBody); - launchEditor(frame.file, frame.lineNumber, watchFolders); - res.end('OK'); - } else { - next(); - } - }; -}; diff --git a/local-cli/server/middleware/statusPageMiddleware.js b/local-cli/server/middleware/statusPageMiddleware.js deleted file mode 100644 index b08539d57d647b..00000000000000 --- a/local-cli/server/middleware/statusPageMiddleware.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -/** - * Status page so that anyone who needs to can verify that the packager is - * running on 8081 and not another program / service. - */ -module.exports = function(req, res, next) { - if (req.url === '/status') { - res.end('packager-status:running'); - } else { - next(); - } -}; diff --git a/local-cli/server/middleware/systraceProfileMiddleware.js b/local-cli/server/middleware/systraceProfileMiddleware.js deleted file mode 100644 index c66d6f7beaa8c4..00000000000000 --- a/local-cli/server/middleware/systraceProfileMiddleware.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); - -module.exports = function(req, res, next) { - if (req.url !== '/systrace') { - next(); - return; - } - - console.log('Dumping profile information...'); - var dumpName = '/tmp/dump_' + Date.now() + '.json'; - fs.writeFileSync(dumpName, req.rawBody); - var response = - 'Your profile was saved at:\n' + - dumpName + - '\n\n' + - 'On Google Chrome navigate to chrome://tracing and then click on "load" ' + - 'to load and visualise your profile.\n\n' + - 'This message is also printed to your console by the packager so you can copy it :)'; - console.log(response); - res.end(response); -}; diff --git a/local-cli/server/middleware/unless.js b/local-cli/server/middleware/unless.js deleted file mode 100644 index e1aa78ac636008..00000000000000 --- a/local-cli/server/middleware/unless.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports = (url, middleware) => { - return (req, res, next) => { - if (req.url === url || req.url.startsWith(url + '/')) { - middleware(req, res, next); - } else { - next(); - } - }; -}; diff --git a/local-cli/server/runServer.js b/local-cli/server/runServer.js deleted file mode 100644 index e9439bf60b0f93..00000000000000 --- a/local-cli/server/runServer.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow - * @format - */ - -'use strict'; - -require('../../setupBabel')(); - -const Metro = require('metro'); - -const {Terminal} = require('metro-core'); - -const messageSocket = require('./util/messageSocket'); -const morgan = require('morgan'); -const path = require('path'); -const webSocketProxy = require('./util/webSocketProxy'); -const MiddlewareManager = require('./middleware/MiddlewareManager'); - -import type {ConfigT} from 'metro-config/src/configTypes.flow'; - -export type Args = {| - +assetExts: $ReadOnlyArray, - +cert: string, - +customLogReporterPath?: string, - +host: string, - +https: boolean, - +maxWorkers: number, - +key: string, - +nonPersistent: boolean, - +platforms: $ReadOnlyArray, - +port: number, - +projectRoot: string, - +providesModuleNodeModules: Array, - +resetCache: boolean, - +sourceExts: $ReadOnlyArray, - +transformer?: string, - +verbose: boolean, - +watchFolders: $ReadOnlyArray, -|}; - -async function runServer(args: Args, config: ConfigT) { - const terminal = new Terminal(process.stdout); - const ReporterImpl = getReporterImpl(args.customLogReporterPath || null); - const reporter = new ReporterImpl(terminal); - const middlewareManager = new MiddlewareManager(args); - - middlewareManager.getConnectInstance().use(morgan('combined')); - - args.watchFolders.forEach(middlewareManager.serveStatic); - - // $FlowFixMe Metro configuration is immutable. - config.maxWorkers = args.maxWorkers; - // $FlowFixMe Metro configuration is immutable. - config.server.port = args.port; - // $FlowFixMe Metro configuration is immutable. - config.reporter = reporter; - // $FlowFixMe Metro configuration is immutable. - config.resetCache = args.resetCache; - // $FlowFixMe Metro configuration is immutable. - config.projectRoot = args.projectRoot; - // $FlowFixMe Metro configuration is immutable. - config.watchFolders = args.watchFolders.slice(0); - // $FlowFixMe Metro configuration is immutable. - config.server.enhanceMiddleware = middleware => - middlewareManager.getConnectInstance().use(middleware); - - if (args.sourceExts !== config.resolver.sourceExts) { - // $FlowFixMe Metro configuration is immutable. - config.resolver.sourceExts = args.sourceExts.concat( - config.resolver.sourceExts, - ); - } - - const serverInstance = await Metro.runServer(config, { - host: args.host, - secure: args.https, - secureCert: args.cert, - secureKey: args.key, - hmrEnabled: true, - }); - - const wsProxy = webSocketProxy.attachToServer( - serverInstance, - '/debugger-proxy', - ); - const ms = messageSocket.attachToServer(serverInstance, '/message'); - middlewareManager.attachDevToolsSocket(wsProxy); - middlewareManager.attachDevToolsSocket(ms); - - // In Node 8, the default keep-alive for an HTTP connection is 5 seconds. In - // early versions of Node 8, this was implemented in a buggy way which caused - // some HTTP responses (like those containing large JS bundles) to be - // terminated early. - // - // As a workaround, arbitrarily increase the keep-alive from 5 to 30 seconds, - // which should be enough to send even the largest of JS bundles. - // - // For more info: https://github.com/nodejs/node/issues/13391 - // - serverInstance.keepAliveTimeout = 30000; -} - -function getReporterImpl(customLogReporterPath: ?string) { - if (customLogReporterPath == null) { - return require('metro/src/lib/TerminalReporter'); - } - try { - // First we let require resolve it, so we can require packages in node_modules - // as expected. eg: require('my-package/reporter'); - /* $FlowFixMe: can't type dynamic require */ - return require(customLogReporterPath); - } catch (e) { - if (e.code !== 'MODULE_NOT_FOUND') { - throw e; - } - // If that doesn't work, then we next try relative to the cwd, eg: - // require('./reporter'); - /* $FlowFixMe: can't type dynamic require */ - return require(path.resolve(customLogReporterPath)); - } -} - -module.exports = runServer; diff --git a/local-cli/server/server.js b/local-cli/server/server.js deleted file mode 100644 index f7ded732ff139c..00000000000000 --- a/local-cli/server/server.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -const runServer = require('./runServer'); - -import type {RNConfig} from '../core'; -import type {ConfigT} from 'metro-config/src/configTypes.flow'; -import type {Args as RunServerArgs} from './runServer'; - -/** - * Starts the React Native Packager Server. - */ -function server(argv: mixed, config: RNConfig, args: RunServerArgs) { - /* $FlowFixMe(site=react_native_fb) ConfigT shouldn't be extendable. */ - const configT: ConfigT = config; - runServer(args, configT); -} - -module.exports = { - name: 'start', - func: server, - description: 'starts the webserver', - options: [ - { - command: '--port [number]', - parse: (val: string) => Number(val), - default: (config: ConfigT) => config.server.port, - }, - { - command: '--host [string]', - default: '', - }, - { - command: '--projectRoot [string]', - description: 'Specify the main project root', - default: (config: ConfigT) => config.projectRoot, - }, - { - command: '--watchFolders [list]', - description: - 'Specify any additional folders to be added to the watch list', - parse: (val: string) => val.split(','), - default: (config: ConfigT) => config.watchFolders, - }, - { - command: '--assetExts [list]', - description: - 'Specify any additional asset extensions to be used by the packager', - parse: (val: string) => val.split(','), - default: (config: ConfigT) => config.resolver.assetExts, - }, - { - command: '--sourceExts [list]', - description: - 'Specify any additional source extensions to be used by the packager', - parse: (val: string) => val.split(','), - default: (config: ConfigT) => config.resolver.sourceExts, - }, - { - command: '--platforms [list]', - description: - 'Specify any additional platforms to be used by the packager', - parse: (val: string) => val.split(','), - default: (config: ConfigT) => config.resolver.platforms, - }, - { - command: '--providesModuleNodeModules [list]', - description: - 'Specify any npm packages that import dependencies with providesModule', - parse: (val: string) => val.split(','), - default: (config: ConfigT) => config.resolver.providesModuleNodeModules, - }, - { - command: '--max-workers [number]', - description: - 'Specifies the maximum number of workers the worker-pool ' + - 'will spawn for transforming files. This defaults to the number of the ' + - 'cores available on your machine.', - default: (config: ConfigT) => config.maxWorkers, - parse: (workers: string) => Number(workers), - }, - { - command: '--skipflow', - description: 'Disable flow checks', - }, - { - command: '--nonPersistent', - description: 'Disable file watcher', - }, - { - command: '--transformer [string]', - description: 'Specify a custom transformer to be used', - }, - { - command: '--reset-cache, --resetCache', - description: 'Removes cached files', - }, - { - command: '--custom-log-reporter-path, --customLogReporterPath [string]', - description: - 'Path to a JavaScript file that exports a log reporter as a replacement for TerminalReporter', - }, - { - command: '--verbose', - description: 'Enables logging', - }, - { - command: '--https', - description: 'Enables https connections to the server', - }, - { - command: '--key [path]', - description: 'Path to custom SSL key', - }, - { - command: '--cert [path]', - description: 'Path to custom SSL cert', - }, - ], -}; diff --git a/local-cli/server/util/copyToClipBoard.js b/local-cli/server/util/copyToClipBoard.js deleted file mode 100644 index 1f22477b9b16a3..00000000000000 --- a/local-cli/server/util/copyToClipBoard.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -var child_process = require('child_process'); -var spawn = child_process.spawn; -var path = require('path'); -var fs = require('fs'); - -const xsel = path.join(__dirname, 'external/xsel'); -fs.chmodSync(xsel, '0755'); -/** - * Copy the content to host system clipboard. - */ -function copyToClipBoard(content) { - switch (process.platform) { - case 'darwin': - var child = spawn('pbcopy', []); - child.stdin.end(new Buffer(content, 'utf8')); - return true; - case 'win32': - var child = spawn('clip', []); - child.stdin.end(new Buffer(content, 'utf8')); - return true; - case 'linux': - var child = spawn(xsel, ['--clipboard', '--input']); - child.stdin.end(new Buffer(content, 'utf8')); - return true; - default: - return false; - } -} - -module.exports = copyToClipBoard; diff --git a/local-cli/server/util/debugger-ui/DeltaPatcher.js b/local-cli/server/util/debugger-ui/DeltaPatcher.js deleted file mode 100644 index d96030c671cc03..00000000000000 --- a/local-cli/server/util/debugger-ui/DeltaPatcher.js +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/** - * This file is a copy of the reference `DeltaPatcher`, located in - * metro. The reason to not reuse that file is that in this context - * we cannot have flow annotations or CJS syntax (since this file is directly) - * injected into a static HTML page. - * - * TODO: Find a simple and lightweight way to compile `DeltaPatcher` to avoid - * having this duplicated file. - */ -(function(global) { - 'use strict'; - - /** - * This is a reference client for the Delta Bundler: it maintains cached the - * last patched bundle delta and it's capable of applying new Deltas received - * from the Bundler. - */ - class DeltaPatcher { - constructor() { - this._lastBundle = { - revisionId: undefined, - pre: '', - post: '', - modules: new Map(), - }; - this._initialized = false; - this._lastNumModifiedFiles = 0; - this._lastModifiedDate = new Date(); - } - - static get(id) { - let deltaPatcher = this._deltaPatchers.get(id); - - if (!deltaPatcher) { - deltaPatcher = new DeltaPatcher(); - this._deltaPatchers.set(id, deltaPatcher); - } - - return deltaPatcher; - } - - /** - * Applies a Delta Bundle to the current bundle. - */ - applyDelta(bundle) { - // Make sure that the first received bundle is a base. - if (!this._initialized && !bundle.base) { - throw new Error( - 'DeltaPatcher should receive a base Bundle when being initialized', - ); - } - - this._initialized = true; - - // Reset the current bundle when we receive a base bundle. - if (bundle.base) { - this._lastBundle = { - revisionId: undefined, - pre: bundle.pre, - post: bundle.post, - modules: new Map(), - }; - } - - this._lastNumModifiedFiles = bundle.modules.size; - - if (this._lastNumModifiedFiles > 0) { - this._lastModifiedDate = new Date(); - } - - this._patchMap(this._lastBundle.modules, bundle.modules); - - this._lastBundle.revisionId = bundle.revisionId; - - return this; - } - - getLastRevisionId() { - return this._lastBundle.revisionId; - } - - /** - * Returns the number of modified files in the last received Delta. This is - * currently used to populate the `X-Metro-Files-Changed-Count` HTTP header - * when metro serves the whole JS bundle, and can potentially be removed once - * we only send the actual deltas to clients. - */ - getLastNumModifiedFiles() { - return this._lastNumModifiedFiles; - } - - getLastModifiedDate() { - return this._lastModifiedDate; - } - - getAllModules() { - return [].concat( - this._lastBundle.pre, - Array.from(this._lastBundle.modules.values()), - this._lastBundle.post, - ); - } - - _patchMap(original, patch) { - for (const [key, value] of patch.entries()) { - if (value == null) { - original.delete(key); - } else { - original.set(key, value); - } - } - } - } - - DeltaPatcher._deltaPatchers = new Map(); - - global.DeltaPatcher = DeltaPatcher; -})(window); diff --git a/local-cli/server/util/debugger-ui/debuggerWorker.js b/local-cli/server/util/debugger-ui/debuggerWorker.js deleted file mode 100644 index 070d753b712485..00000000000000 --- a/local-cli/server/util/debugger-ui/debuggerWorker.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -/* global __fbBatchedBridge, self, importScripts, postMessage, onmessage: true */ -/* eslint no-unused-vars: 0 */ - -'use strict'; - -onmessage = (function() { - var visibilityState; - var showVisibilityWarning = (function() { - var hasWarned = false; - return function() { - // Wait until `YellowBox` gets initialized before displaying the warning. - if (hasWarned || console.warn.toString().includes('[native code]')) { - return; - } - hasWarned = true; - console.warn( - 'Remote debugger is in a background tab which may cause apps to ' + - 'perform slowly. Fix this by foregrounding the tab (or opening it in ' + - 'a separate window).', - ); - }; - })(); - - var messageHandlers = { - executeApplicationScript: function(message, sendReply) { - for (var key in message.inject) { - self[key] = JSON.parse(message.inject[key]); - } - var error; - try { - importScripts(message.url); - } catch (err) { - error = err.message; - } - sendReply(null /* result */, error); - }, - setDebuggerVisibility: function(message) { - visibilityState = message.visibilityState; - }, - }; - - return function(message) { - if (visibilityState === 'hidden') { - showVisibilityWarning(); - } - - var object = message.data; - - var sendReply = function(result, error) { - postMessage({replyID: object.id, result: result, error: error}); - }; - - var handler = messageHandlers[object.method]; - if (handler) { - // Special cased handlers - handler(object, sendReply); - } else { - // Other methods get called on the bridge - var returnValue = [[], [], [], 0]; - var error; - try { - if (typeof __fbBatchedBridge === 'object') { - returnValue = __fbBatchedBridge[object.method].apply( - null, - object.arguments, - ); - } else { - error = 'Failed to call function, __fbBatchedBridge is undefined'; - } - } catch (err) { - error = err.message; - } finally { - sendReply(JSON.stringify(returnValue), error); - } - } - }; -})(); diff --git a/local-cli/server/util/debugger-ui/deltaUrlToBlobUrl.js b/local-cli/server/util/debugger-ui/deltaUrlToBlobUrl.js deleted file mode 100644 index 6032be956c32bc..00000000000000 --- a/local-cli/server/util/debugger-ui/deltaUrlToBlobUrl.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict - * @format - */ - -/* global Blob, URL: true */ - -(function(global) { - 'use strict'; - - let cachedBundleUrls = new Map(); - - /** - * Converts the passed delta URL into an URL object containing already the - * whole JS bundle Blob. - */ - async function deltaUrlToBlobUrl(deltaUrl) { - const client = global.DeltaPatcher.get(deltaUrl); - - const revisionId = client.getLastRevisionId() - ? `&revisionId=${client.getLastRevisionId()}` - : ''; - - const data = await fetch(deltaUrl + revisionId); - const bundle = await data.json(); - - const deltaPatcher = client.applyDelta({ - base: bundle.base, - revisionId: bundle.revisionId, - pre: bundle.pre, - post: bundle.post, - modules: new Map(bundle.modules), - }); - - let cachedBundle = cachedBundleUrls.get(deltaUrl); - - // If nothing changed, avoid recreating a bundle blob by reusing the - // previous one. - if ( - deltaPatcher.getLastNumModifiedFiles() === 0 && - cachedBundle != null && - cachedBundle !== '' - ) { - return cachedBundle; - } - - // Clean up the previous bundle URL to not leak memory. - if (cachedBundle != null && cachedBundle !== '') { - URL.revokeObjectURL(cachedBundle); - } - - // To make Source Maps work correctly, we need to add a newline between - // modules. - const blobContent = deltaPatcher - .getAllModules() - .map(module => module + '\n'); - - // Build the blob with the whole JS bundle. - const blob = new Blob(blobContent, { - type: 'application/javascript', - }); - - const bundleContents = URL.createObjectURL(blob); - cachedBundleUrls.set(deltaUrl, bundleContents); - - return bundleContents; - } - - global.deltaUrlToBlobUrl = deltaUrlToBlobUrl; -})(window || {}); diff --git a/local-cli/server/util/debugger-ui/index.html b/local-cli/server/util/debugger-ui/index.html deleted file mode 100644 index 320b482899363e..00000000000000 --- a/local-cli/server/util/debugger-ui/index.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - -React Native Debugger - - - - - - -
- - -

- React Native JS code runs as a web worker inside this tab. -

-

Press ⌘⌥I to open Developer Tools. Enable Pause On Caught Exceptions for a better debugging experience.

-

You may also install the standalone version of React Developer Tools to inspect the React component hierarchy, their props, and state.

-

Status: Loading...

-
- - - diff --git a/local-cli/server/util/external/xsel b/local-cli/server/util/external/xsel deleted file mode 100755 index a6b2fd3d5937e605e3f3fdb3c9634bad8aa5816f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129416 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 Q`Y-&Qm48BXz%u>+1%L4+cmMzZ diff --git a/local-cli/server/util/jsPackagerClient.js b/local-cli/server/util/jsPackagerClient.js deleted file mode 100644 index 08e6516f5aae16..00000000000000 --- a/local-cli/server/util/jsPackagerClient.js +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const WebSocket = require('ws'); - -const parseMessage = require('./messageSocket').parseMessage; - -const PROTOCOL_VERSION = 2; -const TARGET_SERVER = 'server'; - -function getMessageId() { - return `${Date.now()}:${Math.random()}`; -} - -class JsPackagerClient { - constructor(url) { - this.ws = new WebSocket(url); - this.msgCallbacks = new Map(); - - this.openPromise = new Promise((resolve, reject) => { - this.ws.on('error', error => reject(error)); - this.ws.on('open', resolve); - }); - - this.ws.on('message', (data, flags) => { - const message = parseMessage(data, flags.binary); - const msgCallback = this.msgCallbacks.get(message.id); - if (message === undefined || message.id === undefined) { - // gracefully ignore wrong messages or broadcasts - } else if (msgCallback === undefined) { - console.warn(`Response with non-existing message id: '${message.id}'`); - } else { - if (message.error === undefined) { - msgCallback.resolve(message.result); - } else { - msgCallback.reject(message.error); - } - } - }); - } - - sendRequest(method, target, params) { - return this.openPromise.then( - () => - new Promise((resolve, reject) => { - const messageId = getMessageId(); - this.msgCallbacks.set(messageId, {resolve: resolve, reject: reject}); - this.ws.send( - JSON.stringify({ - version: PROTOCOL_VERSION, - target: target, - method: method, - id: messageId, - params: params, - }), - error => { - if (error !== undefined) { - this.msgCallbacks.delete(messageId); - reject(error); - } - }, - ); - }), - ); - } - - sendNotification(method, target, params) { - return this.openPromise.then( - () => - new Promise((resolve, reject) => { - this.ws.send( - JSON.stringify({ - version: PROTOCOL_VERSION, - target: target, - method: method, - params: params, - }), - error => { - if (error !== undefined) { - reject(error); - } else { - resolve(); - } - }, - ); - }), - ); - } - - sendBroadcast(method, params) { - return this.sendNotification(method, undefined, params); - } - - getPeers() { - return new Promise((resolve, reject) => { - this.sendRequest('getpeers', TARGET_SERVER, undefined).then(response => { - if (!response instanceof Map) { - reject( - 'Results received from server are of wrong format:\n' + - JSON.stringify(response), - ); - } else { - resolve(response); - } - }, reject); - }); - } - - getId() { - return this.sendRequest('getid', TARGET_SERVER, undefined); - } -} - -module.exports = JsPackagerClient; diff --git a/local-cli/server/util/launchChrome.js b/local-cli/server/util/launchChrome.js deleted file mode 100644 index 854ae20c80b805..00000000000000 --- a/local-cli/server/util/launchChrome.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ - -'use strict'; - -/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error - * found when Flow v0.54 was deployed. To see the error delete this comment and - * run Flow. */ -const opn = require('opn'); -const execSync = require('child_process').execSync; - -function commandExistsUnixSync(commandName, callback) { - try { - var stdout = execSync( - 'command -v ' + - commandName + - ' 2>/dev/null' + - " && { echo >&1 '" + - commandName + - " found'; exit 0; }", - ); - return !!stdout; - } catch (error) { - return false; - } -} - -function getChromeAppName(): string { - switch (process.platform) { - case 'darwin': - return 'google chrome'; - case 'win32': - return 'chrome'; - case 'linux': - if (commandExistsUnixSync('google-chrome')) { - return 'google-chrome'; - } else if (commandExistsUnixSync('chromium-browser')) { - return 'chromium-browser'; - } else { - return 'chromium'; - } - default: - return 'google-chrome'; - } -} - -function launchChrome(url: string) { - opn(url, {app: [getChromeAppName()]}, function(err) { - if (err) { - console.error('Google Chrome exited with error:', err); - } - }); -} - -module.exports = launchChrome; diff --git a/local-cli/server/util/launchEditor.js b/local-cli/server/util/launchEditor.js deleted file mode 100644 index ac965b08531285..00000000000000 --- a/local-cli/server/util/launchEditor.js +++ /dev/null @@ -1,247 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -var chalk = require('chalk'); -var fs = require('fs'); -var path = require('path'); -var child_process = require('child_process'); -const isAbsolutePath = require('absolute-path'); -const shellQuote = require('shell-quote'); - -function isTerminalEditor(editor) { - switch (editor) { - case 'vim': - case 'emacs': - case 'nano': - return true; - } - return false; -} - -// Map from full process name to binary that starts the process -// We can't just re-use full process name, because it will spawn a new instance -// of the app every time -var COMMON_EDITORS = { - '/Applications/Atom.app/Contents/MacOS/Atom': 'atom', - '/Applications/Atom Beta.app/Contents/MacOS/Atom Beta': - '/Applications/Atom Beta.app/Contents/MacOS/Atom Beta', - '/Applications/IntelliJ IDEA.app/Contents/MacOS/idea': 'idea', - '/Applications/Sublime Text.app/Contents/MacOS/Sublime Text': - '/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl', - '/Applications/Sublime Text 2.app/Contents/MacOS/Sublime Text 2': - '/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl', - '/Applications/Visual Studio Code.app/Contents/MacOS/Electron': 'code', - '/Applications/WebStorm.app/Contents/MacOS/webstorm': 'webstorm', -}; - -// Transpiled version of: /^[\p{L}0-9/.\-_\\]+$/u -// Non-transpiled version requires support for Unicode property regex. Allows -// alphanumeric characters, periods, dashes, slashes, and underscores. -const WINDOWS_FILE_NAME_WHITELIST = /^(?:[\x2D-9A-Z\\_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7B9\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFF1]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])+$/; - -function addWorkspaceToArgumentsIfExists(args, workspace) { - if (workspace) { - args.unshift(workspace); - } - return args; -} - -function getArgumentsForLineNumber(editor, fileName, lineNumber, workspace) { - switch (path.basename(editor)) { - case 'vim': - case 'mvim': - return [fileName, '+' + lineNumber]; - case 'atom': - case 'Atom': - case 'Atom Beta': - case 'subl': - case 'sublime': - case 'webstorm': - case 'wstorm': - case 'appcode': - case 'charm': - case 'idea': - return [fileName + ':' + lineNumber]; - case 'joe': - case 'emacs': - case 'emacsclient': - return ['+' + lineNumber, fileName]; - case 'rmate': - case 'mate': - case 'mine': - return ['--line', lineNumber, fileName]; - case 'code': - return addWorkspaceToArgumentsIfExists( - ['-g', fileName + ':' + lineNumber], - workspace, - ); - } - - // For all others, drop the lineNumber until we have - // a mapping above, since providing the lineNumber incorrectly - // can result in errors or confusing behavior. - return [fileName]; -} - -function guessEditor() { - // Explicit config always wins - if (process.env.REACT_EDITOR) { - return shellQuote.parse(process.env.REACT_EDITOR); - } - - // Using `ps x` on OSX we can find out which editor is currently running. - // Potentially we could use similar technique for Windows and Linux - if (process.platform === 'darwin') { - try { - var output = child_process.execSync('ps x').toString(); - var processNames = Object.keys(COMMON_EDITORS); - for (var i = 0; i < processNames.length; i++) { - var processName = processNames[i]; - if (output.indexOf(processName) !== -1) { - return [COMMON_EDITORS[processName]]; - } - } - } catch (error) { - // Ignore... - } - } - - // Last resort, use old skool env vars - if (process.env.VISUAL) { - return [process.env.VISUAL]; - } else if (process.env.EDITOR) { - return [process.env.EDITOR]; - } - - return [null]; -} - -function printInstructions(title) { - console.log( - [ - '', - chalk.bgBlue.white.bold(' ' + title + ' '), - ' When you see Red Box with stack trace, you can click any ', - ' stack frame to jump to the source file. The packager will launch your ', - ' editor of choice. It will first look at REACT_EDITOR environment ', - ' variable, then at EDITOR. To set it up, you can add something like ', - ' export REACT_EDITOR=atom to your ~/.bashrc or ~/.zshrc depending on ', - ' which shell you use.', - '', - ].join('\n'), - ); -} - -function transformToAbsolutePathIfNeeded(pathName) { - if (!isAbsolutePath(pathName)) { - pathName = path.resolve(process.cwd(), pathName); - } - return pathName; -} - -function findRootForFile(projectRoots, fileName) { - fileName = transformToAbsolutePathIfNeeded(fileName); - return projectRoots.find(root => { - root = transformToAbsolutePathIfNeeded(root); - return fileName.startsWith(root + path.sep); - }); -} - -var _childProcess = null; -function launchEditor(fileName, lineNumber, projectRoots) { - if (!fs.existsSync(fileName)) { - return; - } - - // Sanitize lineNumber to prevent malicious use on win32 - // via: https://github.com/nodejs/node/blob/c3bb4b1aa5e907d489619fb43d233c3336bfc03d/lib/child_process.js#L333 - if (lineNumber && isNaN(lineNumber)) { - return; - } - - let [editor, ...args] = guessEditor(); - if (!editor) { - printInstructions('PRO TIP'); - return; - } - - var workspace = findRootForFile(projectRoots, fileName); - if (lineNumber) { - args = args.concat( - getArgumentsForLineNumber(editor, fileName, lineNumber, workspace), - ); - } else { - args.push(fileName); - } - - // cmd.exe on Windows is vulnerable to RCE attacks given a file name of the - // form "C:\Users\myusername\Downloads\& curl 172.21.93.52". Use a whitelist - // to validate user-provided file names. This doesn't cover the entire range - // of valid file names but should cover almost all of them in practice. - if ( - process.platform === 'win32' && - !WINDOWS_FILE_NAME_WHITELIST.test(fileName.trim()) - ) { - console.log(); - console.log( - chalk.red( - 'Could not open ' + path.basename(fileName) + ' in the editor.', - ), - ); - console.log(); - console.log( - 'When running on Windows, file names are checked against a whitelist ' + - 'to protect against remote code execution attacks. File names may ' + - 'consist only of alphanumeric characters (all languages), periods, ' + - 'dashes, slashes, and underscores.', - ); - console.log(); - return; - } - - console.log( - 'Opening ' + chalk.underline(fileName) + ' with ' + chalk.bold(editor), - ); - - if (_childProcess && isTerminalEditor(editor)) { - // There's an existing editor process already and it's attached - // to the terminal, so go kill it. Otherwise two separate editor - // instances attach to the stdin/stdout which gets confusing. - _childProcess.kill('SIGKILL'); - } - - if (process.platform === 'win32') { - // On Windows, launch the editor in a shell because spawn can only - // launch .exe files. - _childProcess = child_process.spawn( - 'cmd.exe', - ['/C', editor].concat(args), - {stdio: 'inherit'}, - ); - } else { - _childProcess = child_process.spawn(editor, args, {stdio: 'inherit'}); - } - _childProcess.on('exit', function(errorCode) { - _childProcess = null; - - if (errorCode) { - console.log(chalk.red('Your editor exited with an error!')); - printInstructions('Keep these instructions in mind:'); - } - }); - - _childProcess.on('error', function(error) { - console.log(chalk.red(error.message)); - printInstructions('How to fix:'); - }); -} - -module.exports = launchEditor; diff --git a/local-cli/server/util/messageSocket.js b/local-cli/server/util/messageSocket.js deleted file mode 100644 index a151f7916ba5f2..00000000000000 --- a/local-cli/server/util/messageSocket.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const url = require('url'); -const WebSocketServer = require('ws').Server; -const PROTOCOL_VERSION = 2; -const notifier = require('node-notifier'); - -function parseMessage(data, binary) { - if (binary) { - console.error('Expected text message, got binary!'); - return undefined; - } - try { - const message = JSON.parse(data); - if (message.version === PROTOCOL_VERSION) { - return message; - } - console.error( - 'Received message had wrong protocol version: ' + message.version, - ); - } catch (e) { - console.error('Failed to parse the message as JSON:\n' + data); - } - return undefined; -} - -function isBroadcast(message) { - return ( - typeof message.method === 'string' && - message.id === undefined && - message.target === undefined - ); -} - -function isRequest(message) { - return ( - typeof message.method === 'string' && typeof message.target === 'string' - ); -} - -function isResponse(message) { - return ( - typeof message.id === 'object' && - typeof message.id.requestId !== undefined && - typeof message.id.clientId === 'string' && - (message.result !== undefined || message.error !== undefined) - ); -} - -function attachToServer(server, path) { - const wss = new WebSocketServer({ - server: server, - path: path, - }); - const clients = new Map(); - let nextClientId = 0; - - function getClientWs(clientId) { - const clientWs = clients.get(clientId); - if (clientWs === undefined) { - throw `could not find id "${clientId}" while forwarding request`; - } - return clientWs; - } - - function handleSendBroadcast(broadcasterId, message) { - const forwarded = { - version: PROTOCOL_VERSION, - method: message.method, - params: message.params, - }; - if (clients.size === 0) { - notifier.notify({ - title: 'React Native: No apps connected', - message: - `Sending '${message.method}' to all React Native apps ` + - 'failed. Make sure your app is running in the simulator ' + - 'or on a phone connected via USB.', - }); - } - for (const [otherId, otherWs] of clients) { - if (otherId !== broadcasterId) { - try { - otherWs.send(JSON.stringify(forwarded)); - } catch (e) { - console.error( - `Failed to send broadcast to client: '${otherId}' ` + - `due to:\n ${e.toString()}`, - ); - } - } - } - } - - wss.on('connection', function(clientWs) { - const clientId = `client#${nextClientId++}`; - - function handleCaughtError(message, error) { - const errorMessage = { - id: message.id, - method: message.method, - target: message.target, - error: message.error === undefined ? 'undefined' : 'defined', - params: message.params === undefined ? 'undefined' : 'defined', - result: message.result === undefined ? 'undefined' : 'defined', - }; - - if (message.id === undefined) { - console.error( - `Handling message from ${clientId} failed with:\n${error}\n` + - `message:\n${JSON.stringify(errorMessage)}`, - ); - } else { - try { - clientWs.send( - JSON.stringify({ - version: PROTOCOL_VERSION, - error: error, - id: message.id, - }), - ); - } catch (e) { - console.error( - `Failed to reply to ${clientId} with error:\n${error}` + - `\nmessage:\n${JSON.stringify(errorMessage)}` + - `\ndue to error: ${e.toString()}`, - ); - } - } - } - - function handleServerRequest(message) { - let result = null; - switch (message.method) { - case 'getid': - result = clientId; - break; - case 'getpeers': - result = {}; - clients.forEach((otherWs, otherId) => { - if (clientId !== otherId) { - result[otherId] = url.parse(otherWs.upgradeReq.url, true).query; - } - }); - break; - default: - throw `unknown method: ${message.method}`; - } - - clientWs.send( - JSON.stringify({ - version: PROTOCOL_VERSION, - result: result, - id: message.id, - }), - ); - } - - function forwardRequest(message) { - getClientWs(message.target).send( - JSON.stringify({ - version: PROTOCOL_VERSION, - method: message.method, - params: message.params, - id: - message.id === undefined - ? undefined - : {requestId: message.id, clientId: clientId}, - }), - ); - } - - function forwardResponse(message) { - getClientWs(message.id.clientId).send( - JSON.stringify({ - version: PROTOCOL_VERSION, - result: message.result, - error: message.error, - id: message.id.requestId, - }), - ); - } - - clients.set(clientId, clientWs); - clientWs.onclose = clientWs.onerror = () => { - clientWs.onmessage = null; - clients.delete(clientId); - }; - clientWs.onmessage = event => { - const message = parseMessage(event.data, event.binary); - if (message === undefined) { - console.error('Received message not matching protocol'); - return; - } - - try { - if (isBroadcast(message)) { - handleSendBroadcast(clientId, message); - } else if (isRequest(message)) { - if (message.target === 'server') { - handleServerRequest(message); - } else { - forwardRequest(message); - } - } else if (isResponse(message)) { - forwardResponse(message); - } else { - throw 'Invalid message, did not match the protocol'; - } - } catch (e) { - handleCaughtError(message, e.toString()); - } - }; - }); - - return { - broadcast: (method, params) => { - handleSendBroadcast(null, {method: method, params: params}); - }, - }; -} - -module.exports = { - attachToServer: attachToServer, - parseMessage: parseMessage, -}; diff --git a/local-cli/server/util/webSocketProxy.js b/local-cli/server/util/webSocketProxy.js deleted file mode 100644 index 097a5de53003a7..00000000000000 --- a/local-cli/server/util/webSocketProxy.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -function attachToServer(server, path) { - var WebSocketServer = require('ws').Server; - var wss = new WebSocketServer({ - server: server, - path: path, - }); - var debuggerSocket, clientSocket; - - function send(dest, message) { - if (!dest) { - return; - } - - try { - dest.send(message); - } catch (e) { - console.warn(e); - // Sometimes this call throws 'not opened' - } - } - - wss.on('connection', function(ws) { - const {url} = ws.upgradeReq; - - if (url.indexOf('role=debugger') > -1) { - if (debuggerSocket) { - ws.close(1011, 'Another debugger is already connected'); - return; - } - debuggerSocket = ws; - debuggerSocket.onerror = debuggerSocket.onclose = () => { - debuggerSocket = null; - if (clientSocket) { - clientSocket.close(1011, 'Debugger was disconnected'); - } - }; - debuggerSocket.onmessage = ({data}) => send(clientSocket, data); - } else if (url.indexOf('role=client') > -1) { - if (clientSocket) { - clientSocket.onerror = clientSocket.onclose = clientSocket.onmessage = null; - clientSocket.close(1011, 'Another client connected'); - } - clientSocket = ws; - clientSocket.onerror = clientSocket.onclose = () => { - clientSocket = null; - send(debuggerSocket, JSON.stringify({method: '$disconnected'})); - }; - clientSocket.onmessage = ({data}) => send(debuggerSocket, data); - } else { - ws.close(1011, 'Missing role param'); - } - }); - - return { - server: wss, - isChromeConnected: function() { - return !!debuggerSocket; - }, - }; -} - -module.exports = { - attachToServer: attachToServer, -}; diff --git a/local-cli/setup_env.bat b/local-cli/setup_env.bat deleted file mode 100755 index 68318546b76c55..00000000000000 --- a/local-cli/setup_env.bat +++ /dev/null @@ -1,4 +0,0 @@ -:: Copyright (c) Facebook, Inc. and its affiliates. -:: -:: This source code is licensed under the MIT license found in the -:: LICENSE file in the root directory of this source tree. diff --git a/local-cli/setup_env.sh b/local-cli/setup_env.sh deleted file mode 100755 index eaf581048964b4..00000000000000 --- a/local-cli/setup_env.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) Facebook, Inc. and its affiliates. -# -# This source code is licensed under the MIT license found in the -# LICENSE file in the root directory of this source tree. - -# 2048 is the max for non root users on Mac -ulimit -n 2048 diff --git a/local-cli/templates/HelloWorld/App.js b/local-cli/templates/HelloWorld/App.js deleted file mode 100644 index bb48232958e854..00000000000000 --- a/local-cli/templates/HelloWorld/App.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - * @flow - * @lint-ignore-every XPLATJSCOPYRIGHT1 - */ - -import React, {Component} from 'react'; -import {Platform, StyleSheet, Text, View} from 'react-native'; - -const instructions = Platform.select({ - ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu', - android: - 'Double tap R on your keyboard to reload,\n' + - 'Shake or press menu button for dev menu', -}); - -type Props = {}; -export default class App extends Component { - render() { - return ( - - Welcome to React Native! - To get started, edit App.js - {instructions} - - ); - } -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: '#F5FCFF', - }, - welcome: { - fontSize: 20, - textAlign: 'center', - margin: 10, - }, - instructions: { - textAlign: 'center', - color: '#333333', - marginBottom: 5, - }, -}); diff --git a/local-cli/templates/HelloWorld/__tests__/App.js b/local-cli/templates/HelloWorld/__tests__/App.js deleted file mode 100644 index a79ec3d587efc7..00000000000000 --- a/local-cli/templates/HelloWorld/__tests__/App.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @format - * @lint-ignore-every XPLATJSCOPYRIGHT1 - */ - -import 'react-native'; -import React from 'react'; -import App from '../App'; - -// Note: test renderer must be required after react-native. -import renderer from 'react-test-renderer'; - -it('renders correctly', () => { - renderer.create(); -}); diff --git a/local-cli/templates/HelloWorld/_babelrc b/local-cli/templates/HelloWorld/_babelrc deleted file mode 100644 index d4b74b5be7b43d..00000000000000 --- a/local-cli/templates/HelloWorld/_babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["module:metro-react-native-babel-preset"] -} diff --git a/local-cli/templates/HelloWorld/_buckconfig b/local-cli/templates/HelloWorld/_buckconfig deleted file mode 100644 index 934256cb29d4a3..00000000000000 --- a/local-cli/templates/HelloWorld/_buckconfig +++ /dev/null @@ -1,6 +0,0 @@ - -[android] - target = Google Inc.:Google APIs:23 - -[maven_repositories] - central = https://repo1.maven.org/maven2 diff --git a/local-cli/templates/HelloWorld/_flowconfig b/local-cli/templates/HelloWorld/_flowconfig deleted file mode 100644 index f3eb74de673239..00000000000000 --- a/local-cli/templates/HelloWorld/_flowconfig +++ /dev/null @@ -1,70 +0,0 @@ -[ignore] -; We fork some components by platform -.*/*[.]android.js - -; Ignore "BUCK" generated dirs -/\.buckd/ - -; Ignore unexpected extra "@providesModule" -.*/node_modules/.*/node_modules/fbjs/.* - -; Ignore duplicate module providers -; For RN Apps installed via npm, "Libraries" folder is inside -; "node_modules/react-native" but in the source repo it is in the root -.*/Libraries/react-native/React.js - -; Ignore polyfills -.*/Libraries/polyfills/.* - -; Ignore metro -.*/node_modules/metro/.* - -[include] - -[libs] -node_modules/react-native/Libraries/react-native/react-native-interface.js -node_modules/react-native/flow/ -node_modules/react-native/flow-github/ - -[options] -emoji=true - -esproposal.optional_chaining=enable -esproposal.nullish_coalescing=enable - -module.system=haste -module.system.haste.use_name_reducers=true -# get basename -module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' -# strip .js or .js.flow suffix -module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' -# strip .ios suffix -module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' -module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' -module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' -module.system.haste.paths.blacklist=.*/__tests__/.* -module.system.haste.paths.blacklist=.*/__mocks__/.* -module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* -module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* - -munge_underscores=true - -module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' - -module.file_ext=.js -module.file_ext=.jsx -module.file_ext=.json -module.file_ext=.native.js - -suppress_type=$FlowIssue -suppress_type=$FlowFixMe -suppress_type=$FlowFixMeProps -suppress_type=$FlowFixMeState - -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy -suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError - -[version] -^0.85.0 diff --git a/local-cli/templates/HelloWorld/_gitattributes b/local-cli/templates/HelloWorld/_gitattributes deleted file mode 100644 index d42ff18354df61..00000000000000 --- a/local-cli/templates/HelloWorld/_gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.pbxproj -text diff --git a/local-cli/templates/HelloWorld/_gitignore b/local-cli/templates/HelloWorld/_gitignore deleted file mode 100644 index 5d647565fa9ef7..00000000000000 --- a/local-cli/templates/HelloWorld/_gitignore +++ /dev/null @@ -1,56 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -# BUCK -buck-out/ -\.buckd/ -*.keystore - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/ - -*/fastlane/report.xml -*/fastlane/Preview.html -*/fastlane/screenshots - -# Bundle artifact -*.jsbundle diff --git a/local-cli/templates/HelloWorld/_watchmanconfig b/local-cli/templates/HelloWorld/_watchmanconfig deleted file mode 100644 index 9e26dfeeb6e641..00000000000000 --- a/local-cli/templates/HelloWorld/_watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/local-cli/templates/HelloWorld/android/app/_BUCK b/local-cli/templates/HelloWorld/android/app/_BUCK deleted file mode 100644 index 0e779048347e02..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/_BUCK +++ /dev/null @@ -1,55 +0,0 @@ -# To learn about Buck see [Docs](https://buckbuild.com/). -# To run your application with Buck: -# - install Buck -# - `npm start` - to start the packager -# - `cd android` -# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` -# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck -# - `buck install -r android/app` - compile, install and run application -# - -load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") - -lib_deps = [] - -create_aar_targets(glob(["libs/*.aar"])) - -create_jar_targets(glob(["libs/*.jar"])) - -android_library( - name = "all-libs", - exported_deps = lib_deps, -) - -android_library( - name = "app-code", - srcs = glob([ - "src/main/java/**/*.java", - ]), - deps = [ - ":all-libs", - ":build_config", - ":res", - ], -) - -android_build_config( - name = "build_config", - package = "com.helloworld", -) - -android_resource( - name = "res", - package = "com.helloworld", - res = "src/main/res", -) - -android_binary( - name = "app", - keystore = "//android/keystores:debug", - manifest = "src/main/AndroidManifest.xml", - package_type = "debug", - deps = [ - ":app-code", - ], -) diff --git a/local-cli/templates/HelloWorld/android/app/build.gradle b/local-cli/templates/HelloWorld/android/app/build.gradle deleted file mode 100644 index a123b6cfb34a73..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/build.gradle +++ /dev/null @@ -1,147 +0,0 @@ -apply plugin: "com.android.application" - -import com.android.build.OutputFile - -/** - * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets - * and bundleReleaseJsAndAssets). - * These basically call `react-native bundle` with the correct arguments during the Android build - * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the - * bundle directly from the development server. Below you can see all the possible configurations - * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "../../node_modules/react-native/react.gradle"` line. - * - * project.ext.react = [ - * // the name of the generated asset file containing your JS bundle - * bundleAssetName: "index.android.bundle", - * - * // the entry file for bundle generation - * entryFile: "index.android.js", - * - * // whether to bundle JS and assets in debug mode - * bundleInDebug: false, - * - * // whether to bundle JS and assets in release mode - * bundleInRelease: true, - * - * // whether to bundle JS and assets in another build variant (if configured). - * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants - * // The configuration property can be in the following formats - * // 'bundleIn${productFlavor}${buildType}' - * // 'bundleIn${buildType}' - * // bundleInFreeDebug: true, - * // bundleInPaidRelease: true, - * // bundleInBeta: true, - * - * // whether to disable dev mode in custom build variants (by default only disabled in release) - * // for example: to disable dev mode in the staging build type (if configured) - * devDisabledInStaging: true, - * // The configuration property can be in the following formats - * // 'devDisabledIn${productFlavor}${buildType}' - * // 'devDisabledIn${buildType}' - * - * // the root of your project, i.e. where "package.json" lives - * root: "../../", - * - * // where to put the JS bundle asset in debug mode - * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", - * - * // where to put the JS bundle asset in release mode - * jsBundleDirRelease: "$buildDir/intermediates/assets/release", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in debug mode - * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", - * - * // where to put drawable resources / React Native assets, e.g. the ones you use via - * // require('./image.png')), in release mode - * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", - * - * // by default the gradle tasks are skipped if none of the JS files or assets change; this means - * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to - * // date; if you have any other folders that you want to ignore for performance reasons (gradle - * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ - * // for example, you might want to remove it from here. - * inputExcludes: ["android/**", "ios/**"], - * - * // override which node gets called and with what additional arguments - * nodeExecutableAndArgs: ["node"], - * - * // supply additional arguments to the packager - * extraPackagerArgs: [] - * ] - */ - -project.ext.react = [ - entryFile: "index.js" -] - -apply from: "../../node_modules/react-native/react.gradle" - -/** - * Set this to true to create two separate APKs instead of one: - * - An APK that only works on ARM devices - * - An APK that only works on x86 devices - * The advantage is the size of the APK is reduced by about 4MB. - * Upload all the APKs to the Play Store and people will download - * the correct one based on the CPU architecture of their device. - */ -def enableSeparateBuildPerCPUArchitecture = false - -/** - * Run Proguard to shrink the Java bytecode in release builds. - */ -def enableProguardInReleaseBuilds = false - -android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - - defaultConfig { - applicationId "com.helloworld" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - } - splits { - abi { - reset() - enable enableSeparateBuildPerCPUArchitecture - universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a" - } - } - buildTypes { - release { - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } - // applicationVariants are e.g. debug, release - applicationVariants.all { variant -> - variant.outputs.each { output -> - // For each separate APK per architecture, set a unique version code as described here: - // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits - def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3] - def abi = output.getFilter(OutputFile.ABI) - if (abi != null) { // null for the universal-debug, universal-release variants - output.versionCodeOverride = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode - } - } - } -} - -dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" - implementation "com.facebook.react:react-native:+" // From node_modules -} - -// Run this once to be able to run the application with BUCK -// puts all compile dependencies into folder libs for BUCK to use -task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile - into 'libs' -} diff --git a/local-cli/templates/HelloWorld/android/app/build_defs.bzl b/local-cli/templates/HelloWorld/android/app/build_defs.bzl deleted file mode 100644 index fff270f8d1d484..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/build_defs.bzl +++ /dev/null @@ -1,19 +0,0 @@ -"""Helper definitions to glob .aar and .jar targets""" - -def create_aar_targets(aarfiles): - for aarfile in aarfiles: - name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] - lib_deps.append(":" + name) - android_prebuilt_aar( - name = name, - aar = aarfile, - ) - -def create_jar_targets(jarfiles): - for jarfile in jarfiles: - name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] - lib_deps.append(":" + name) - prebuilt_jar( - name = name, - binary_jar = jarfile, - ) diff --git a/local-cli/templates/HelloWorld/android/app/proguard-rules.pro b/local-cli/templates/HelloWorld/android/app/proguard-rules.pro deleted file mode 100644 index a92fa177ee49f0..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/local-cli/templates/HelloWorld/android/app/src/main/AndroidManifest.xml b/local-cli/templates/HelloWorld/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index a6eda6784a2950..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainActivity.java b/local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainActivity.java deleted file mode 100644 index 1e9c1894804cbf..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainActivity.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.helloworld; - -import com.facebook.react.ReactActivity; - -public class MainActivity extends ReactActivity { - - /** - * Returns the name of the main component registered from JavaScript. - * This is used to schedule rendering of the component. - */ - @Override - protected String getMainComponentName() { - return "HelloWorld"; - } -} diff --git a/local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainApplication.java b/local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainApplication.java deleted file mode 100644 index 8b5a7f97bea556..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/src/main/java/com/helloworld/MainApplication.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.helloworld; - -import android.app.Application; - -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; -import com.facebook.react.shell.MainReactPackage; -import com.facebook.soloader.SoLoader; - -import java.util.Arrays; -import java.util.List; - -public class MainApplication extends Application implements ReactApplication { - - private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - @Override - protected List getPackages() { - return Arrays.asList( - new MainReactPackage() - ); - } - - @Override - protected String getJSMainModuleName() { - return "index"; - } - }; - - @Override - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } - - @Override - public void onCreate() { - super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); - } -} diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a2f5908281d070150700378b64a84c7db1f97aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3056 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 axPAxe%7rDusX+w*00006jj zwslyNbxW4-gAj;v!J{u#G1>?8h`uw{1?o<0nB+tYjKOW@kQM}bUbgE7^CRD4K zgurXDRXWsX-Q$uVZ0o5KpKdOl5?!YGV|1Cict&~YiG*r%TU43m2Hf99&})mPEvepe z0_$L1e8*kL@h2~YPCajw6Kkw%Bh1Pp)6B|t06|1rR3xRYjBxjSEUmZk@7wX+2&-~! z!V&EdUw!o7hqZI=T4a)^N1D|a=2scW6oZU|Q=}_)gz4pu#43{muRW1cW2WC&m-ik? zskL0dHaVZ5X4PN*v4ZEAB9m;^6r-#eJH?TnU#SN&MO`Aj%)ybFYE+Pf8Vg^T3ybTl zu50EU=3Q60vA7xg@YQ$UKD-7(jf%}8gWS$_9%)wD1O2xB!_VxzcJdN!_qQ9j8#o^Kb$2+XTKxM8p>Ve{O8LcI(e2O zeg{tPSvIFaM+_Ivk&^FEk!WiV^;s?v8fmLglKG<7EO3ezShZ_0J-`(fM;C#i5~B@w zzx;4Hu{-SKq1{ftxbjc(dX3rj46zWzu02-kR>tAoFYDaylWMJ`>FO2QR%cfi+*^9A z54;@nFhVJEQ{88Q7n&mUvLn33icX`a355bQ=TDRS4Uud|cnpZ?a5X|cXgeBhYN7btgj zfrwP+iKdz4?L7PUDFA_HqCI~GMy`trF@g!KZ#+y6U%p5#-nm5{bUh>vhr^77p~ zq~UTK6@uhDVAQcL4g#8p-`vS4CnD9M_USvfi(M-;7nXjlk)~pr>zOI`{;$VXt;?VTNcCePv4 zgZm`^)VCx8{D=H2c!%Y*Sj3qbx z3Bcvv7qRAl|BGZCts{+>FZrE;#w(Yo2zD#>s3a*Bm!6{}vF_;i)6sl_+)pUj?b%BL!T1ELx|Q*Gi=7{Z_>n0I(uv>N^kh|~nJfab z-B6Q6i-x>YYa_42Hv&m>NNuPj31wOaHZ2`_8f~BtbXc@`9CZpHzaE@9sme%_D-HH! z_+C&VZ5tjE65?}X&u-D4AHRJ|7M{hR!}PYPpANP?7wnur`Z(&LFwzUmDz}m6%m#_` zN1ihq8f|zZ&zTL92M2b-hMpPyjp;j(qwgP9x)qI?EZx@<$g#>i7(MC}@*J1VGXm6J ztz1=RK@?%Qz^vmWNydd0K7oyrXw`TLb`z;fP6eV|NZ@9kKH zIyMqzZ9Y_)PZnC#UgW6&o7RiGXSCtSQvnrvJ07P9WCuE5TE27za*L6r1qX7pIDFiP znSaHYJF8sl^n0|3j!i{?fD%?fpQ8-}VX4%STy1t@8)G-8??Fy}j}~2_iJ79Y<9BW~ z!~)T{3Y|lwcVD5s4z^GP5M=~t`V?*Wng7gTvC9%p>ErZpM)pQVx57>AIcf1j4QFg^w>YYB%MypIj2syoXw9$K!N8%s=iPIw!LE-+6v6*Rm zvCqdN&kwI+@pEX0FTb&P)ujD9Td-sLBVV=A$;?RiFOROnT^LC^+PZR*u<3yl z7b%>viF-e48L=c`4Yhgb^U=+w7snP$R-gzx379%&q-0#fsMgvQlo>14~`1YOv{?^ z*^VYyiSJO8fE65P0FORgqSz#mi#9@40VO@TaPOT7pJq3WTK9*n;Niogu+4zte1FUa zyN7rIFbaQxeK{^RC3Iu@_J~ii&CvyWn^W}4wpexHwV9>GKO$zR3a&*L9&AgL=QfA$ z+G-YMq;1D{;N38`jTdN}Pw77sDCR|$2s+->;9gh-ObE_muwxq>sEpX)ywtgCHKIATY}p&%F4bRV>R9rYpeWbT(xnE7}?(HDXFgNDdC^@gUdK& zk=MolYT3>rpR*$Ell2!`c zjrIZftl&PUxlH2EgV+3VfQy&FjhL&5*Zg&R8xrSx?WgB?YuLO-JDaP3jr*I~qiywy z`-52AwB_6L#X ztms{{yRkRfQLbsb#Ov%`)acN(OCewI3Ex__xed17hg#g4c1blx?sK}UQg%PM@N;5d zsg{y6(|`H1Xfbz@5x{1688tu7TGkzFEBhOPDdFK(H_NQIFf|(>)ltFd!WdnkrY&mp z0y@5yU2;u1_enx%+U9tyY-LNWrd4^Wi?x<^r`QbaLBngWL`HzX@G550 zrdyNjhPTknrrJn#jT0WD0Z)WJRi&3FKJ#Sa&|883%QxM-?S%4niK{~k81<(c11sLk|!_7%s zH>c$`*nP-wA8Dx-K(HE~JG_@Yxxa;J+2yr+*iVlh;2Eiw?e`D1vu6*qY1+XTe8RVu z?RV%L|Mk!wO}j^S)p4H%?G37StD0Rx{_Y00%3a+V^SyOkfV@ZuFlEc;vR9r-D>cYU&plUkXL|M%1AYBQ3DI;;hF%_X@m*cTQAMZ4+FO74@AQB{A*_HtoXT@}l=8awaa7{RHC>07s?E%G{iSeRbh z?h#NM)bP`z`zdp5lij!N*df;4+sgz&U_JEr?N9#1{+UG3^11oQUOvU4W%tD1Cie3; z4zcz0SIrK-PG0(mp9gTYr(4ngx;ieH{NLq{* z;Pd=vS6KZYPV?DLbo^)~2dTpiKVBOh?|v2XNA)li)4V6B6PA!iq#XV5eO{{vL%OmU z0z3ZE2kcEkZ`kK(g^#s)#&#Zn5zw!R93cW^4+g0D=ydf&j4o_ti<@2WbzC>{(QhCL z(=%Zb;Ax8U=sdec9pkk|cW)1Ko;gK{-575HsDZ!w@WOQ^Up)GGorc38cGxe<$8O!6 zmQ`=@;TG{FjWq(s0eBn5I~vVgoE}un8+#YuR$Asq?lobvVAO-`SBs3!&;QEKT>gZ0T)jG^Foo~J2YkV&mi-axlvC}-(J4S2 z;opuO)+FIV#}&4;wwisb>{XU+FJ~tyK7UaG@ZD^C1^brazu7Xkh5Od}&P)GufW=u# zMxOwfWJ3a^MZha>9OmQ)@!Y;v*4@+dg~s~NQ;q@hV~l>lw`P)d`4XF9rE?aEFe(JV zI>11}Ny%^CkO=VN>wCV?P!-?VdT3vWe4zBLV*?6XPqsC%n93bQXvydh0Mo+tXHO4^ zxQ{x0?CG{fmToCyYny7>*-tNh;Sh9=THLzkS~lBiV9)IKa^C~_p8MVZWAUb)Btjt< zVZ;l7?_KnLHelj>)M1|Q_%pk5b?Bod_&86o-#36xIEag%b+8JqlDy@B^*YS*1; zGYT`@5nPgt)S^6Ap@b160C4d9do0iE;wYdn_Tr(vY{MS!ja!t*Z7G=Vz-=j5Z⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 459ca609d3ae0d3943ab44cdc27feef9256dc6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7098 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 diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 8ca12fe024be86e868d14e91120a6902f8e88ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6464 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 B0*L?s diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8e19b410a1b15ff180f3dacac19395fe3046cdec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10676 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 diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/local-cli/templates/HelloWorld/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 4c19a13c239cb67b8a2134ddd5f325db1d2d5bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15523 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 BIP(Ai diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/values/strings.xml b/local-cli/templates/HelloWorld/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 0c79c4bad47cb7..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Hello App Display Name - diff --git a/local-cli/templates/HelloWorld/android/app/src/main/res/values/styles.xml b/local-cli/templates/HelloWorld/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 319eb0ca100b5a..00000000000000 --- a/local-cli/templates/HelloWorld/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/local-cli/templates/HelloWorld/android/build.gradle b/local-cli/templates/HelloWorld/android/build.gradle deleted file mode 100644 index 7fde4f576be839..00000000000000 --- a/local-cli/templates/HelloWorld/android/build.gradle +++ /dev/null @@ -1,39 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - buildToolsVersion = "27.0.3" - minSdkVersion = 16 - compileSdkVersion = 27 - targetSdkVersion = 27 - supportLibVersion = "27.1.1" - } - repositories { - google() - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - mavenLocal() - google() - jcenter() - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url "$rootDir/../node_modules/react-native/android" - } - } -} - - -task wrapper(type: Wrapper) { - gradleVersion = '4.4' - distributionUrl = distributionUrl.replace("bin", "all") -} diff --git a/local-cli/templates/HelloWorld/android/gradle.properties b/local-cli/templates/HelloWorld/android/gradle.properties deleted file mode 100644 index 89e0d99e2173fc..00000000000000 --- a/local-cli/templates/HelloWorld/android/gradle.properties +++ /dev/null @@ -1,18 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true diff --git a/local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.jar b/local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 01b8bf6b1f99cad9213fc495b33ad5bbab8efd20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54329 zcmagFV|ZrKvM!pAZQHhO+qP}9lTNj?q^^Y^VFp)SH8qbSJ)2BQ2giqeFT zAwqu@)c?v~^Z#E_K}1nTQbJ9gQ9<%vVRAxVj)8FwL5_iTdUB>&m3fhE=kRWl;g`&m z!W5kh{WsV%fO*%je&j+Lv4xxK~zsEYQls$Q-p&dwID|A)!7uWtJF-=Tm1{V@#x*+kUI$=%KUuf2ka zjiZ{oiL1MXE2EjciJM!jrjFNwCh`~hL>iemrqwqnX?T*MX;U>>8yRcZb{Oy+VKZos zLiFKYPw=LcaaQt8tj=eoo3-@bG_342HQ%?jpgAE?KCLEHC+DmjxAfJ%Og^$dpC8Xw zAcp-)tfJm}BPNq_+6m4gBgBm3+CvmL>4|$2N$^Bz7W(}fz1?U-u;nE`+9`KCLuqg} zwNstNM!J4Uw|78&Y9~9>MLf56to!@qGkJw5Thx%zkzj%Ek9Nn1QA@8NBXbwyWC>9H z#EPwjMNYPigE>*Ofz)HfTF&%PFj$U6mCe-AFw$U%-L?~-+nSXHHKkdgC5KJRTF}`G zE_HNdrE}S0zf4j{r_f-V2imSqW?}3w-4=f@o@-q+cZgaAbZ((hn))@|eWWhcT2pLpTpL!;_5*vM=sRL8 zqU##{U#lJKuyqW^X$ETU5ETeEVzhU|1m1750#f}38_5N9)B_2|v@1hUu=Kt7-@dhA zq_`OMgW01n`%1dB*}C)qxC8q;?zPeF_r;>}%JYmlER_1CUbKa07+=TV45~symC*g8 zW-8(gag#cAOuM0B1xG8eTp5HGVLE}+gYTmK=`XVVV*U!>H`~j4+ROIQ+NkN$LY>h4 zqpwdeE_@AX@PL};e5vTn`Ro(EjHVf$;^oiA%@IBQq>R7_D>m2D4OwwEepkg}R_k*M zM-o;+P27087eb+%*+6vWFCo9UEGw>t&WI17Pe7QVuoAoGHdJ(TEQNlJOqnjZ8adCb zI`}op16D@v7UOEo%8E-~m?c8FL1utPYlg@m$q@q7%mQ4?OK1h%ODjTjFvqd!C z-PI?8qX8{a@6d&Lb_X+hKxCImb*3GFemm?W_du5_&EqRq!+H?5#xiX#w$eLti-?E$;Dhu`{R(o>LzM4CjO>ICf z&DMfES#FW7npnbcuqREgjPQM#gs6h>`av_oEWwOJZ2i2|D|0~pYd#WazE2Bbsa}X@ zu;(9fi~%!VcjK6)?_wMAW-YXJAR{QHxrD5g(ou9mR6LPSA4BRG1QSZT6A?kelP_g- zH(JQjLc!`H4N=oLw=f3{+WmPA*s8QEeEUf6Vg}@!xwnsnR0bl~^2GSa5vb!Yl&4!> zWb|KQUsC$lT=3A|7vM9+d;mq=@L%uWKwXiO9}a~gP4s_4Yohc!fKEgV7WbVo>2ITbE*i`a|V!^p@~^<={#?Gz57 zyPWeM2@p>D*FW#W5Q`1`#5NW62XduP1XNO(bhg&cX`-LYZa|m-**bu|>}S;3)eP8_ zpNTnTfm8 ze+7wDH3KJ95p)5tlwk`S7mbD`SqHnYD*6`;gpp8VdHDz%RR_~I_Ar>5)vE-Pgu7^Y z|9Px+>pi3!DV%E%4N;ii0U3VBd2ZJNUY1YC^-e+{DYq+l@cGtmu(H#Oh%ibUBOd?C z{y5jW3v=0eV0r@qMLgv1JjZC|cZ9l9Q)k1lLgm))UR@#FrJd>w^`+iy$c9F@ic-|q zVHe@S2UAnc5VY_U4253QJxm&Ip!XKP8WNcnx9^cQ;KH6PlW8%pSihSH2(@{2m_o+m zr((MvBja2ctg0d0&U5XTD;5?d?h%JcRJp{_1BQW1xu&BrA3(a4Fh9hon-ly$pyeHq zG&;6q?m%NJ36K1Sq_=fdP(4f{Hop;_G_(i?sPzvB zDM}>*(uOsY0I1j^{$yn3#U(;B*g4cy$-1DTOkh3P!LQ;lJlP%jY8}Nya=h8$XD~%Y zbV&HJ%eCD9nui-0cw!+n`V~p6VCRqh5fRX z8`GbdZ@73r7~myQLBW%db;+BI?c-a>Y)m-FW~M=1^|<21_Sh9RT3iGbO{o-hpN%d6 z7%++#WekoBOP^d0$$|5npPe>u3PLvX_gjH2x(?{&z{jJ2tAOWTznPxv-pAv<*V7r$ z6&glt>7CAClWz6FEi3bToz-soY^{ScrjwVPV51=>n->c(NJngMj6TyHty`bfkF1hc zkJS%A@cL~QV0-aK4>Id!9dh7>0IV;1J9(myDO+gv76L3NLMUm9XyPauvNu$S<)-|F zZS}(kK_WnB)Cl`U?jsdYfAV4nrgzIF@+%1U8$poW&h^c6>kCx3;||fS1_7JvQT~CV zQ8Js+!p)3oW>Df(-}uqC`Tcd%E7GdJ0p}kYj5j8NKMp(KUs9u7?jQ94C)}0rba($~ zqyBx$(1ae^HEDG`Zc@-rXk1cqc7v0wibOR4qpgRDt#>-*8N3P;uKV0CgJE2SP>#8h z=+;i_CGlv+B^+$5a}SicVaSeaNn29K`C&=}`=#Nj&WJP9Xhz4mVa<+yP6hkrq1vo= z1rX4qg8dc4pmEvq%NAkpMK>mf2g?tg_1k2%v}<3`$6~Wlq@ItJ*PhHPoEh1Yi>v57 z4k0JMO)*=S`tKvR5gb-(VTEo>5Y>DZJZzgR+j6{Y`kd|jCVrg!>2hVjz({kZR z`dLlKhoqT!aI8=S+fVp(5*Dn6RrbpyO~0+?fy;bm$0jmTN|t5i6rxqr4=O}dY+ROd zo9Et|x}!u*xi~>-y>!M^+f&jc;IAsGiM_^}+4|pHRn{LThFFpD{bZ|TA*wcGm}XV^ zr*C6~@^5X-*R%FrHIgo-hJTBcyQ|3QEj+cSqp#>&t`ZzB?cXM6S(lRQw$I2?m5=wd z78ki`R?%;o%VUhXH?Z#(uwAn9$m`npJ=cA+lHGk@T7qq_M6Zoy1Lm9E0UUysN)I_x zW__OAqvku^>`J&CB=ie@yNWsaFmem}#L3T(x?a`oZ+$;3O-icj2(5z72Hnj=9Z0w% z<2#q-R=>hig*(t0^v)eGq2DHC%GymE-_j1WwBVGoU=GORGjtaqr0BNigOCqyt;O(S zKG+DoBsZU~okF<7ahjS}bzwXxbAxFfQAk&O@>LsZMsZ`?N?|CDWM(vOm%B3CBPC3o z%2t@%H$fwur}SSnckUm0-k)mOtht`?nwsDz=2#v=RBPGg39i#%odKq{K^;bTD!6A9 zskz$}t)sU^=a#jLZP@I=bPo?f-L}wpMs{Tc!m7-bi!Ldqj3EA~V;4(dltJmTXqH0r z%HAWKGutEc9vOo3P6Q;JdC^YTnby->VZ6&X8f{obffZ??1(cm&L2h7q)*w**+sE6dG*;(H|_Q!WxU{g)CeoT z(KY&bv!Usc|m+Fqfmk;h&RNF|LWuNZ!+DdX*L=s-=_iH=@i` z?Z+Okq^cFO4}_n|G*!)Wl_i%qiMBaH8(WuXtgI7EO=M>=i_+;MDjf3aY~6S9w0K zUuDO7O5Ta6+k40~xh~)D{=L&?Y0?c$s9cw*Ufe18)zzk%#ZY>Tr^|e%8KPb0ht`b( zuP@8#Ox@nQIqz9}AbW0RzE`Cf>39bOWz5N3qzS}ocxI=o$W|(nD~@EhW13Rj5nAp; zu2obEJa=kGC*#3=MkdkWy_%RKcN=?g$7!AZ8vBYKr$ePY(8aIQ&yRPlQ=mudv#q$q z4%WzAx=B{i)UdLFx4os?rZp6poShD7Vc&mSD@RdBJ=_m^&OlkEE1DFU@csgKcBifJ zz4N7+XEJhYzzO=86 z#%eBQZ$Nsf2+X0XPHUNmg#(sNt^NW1Y0|M(${e<0kW6f2q5M!2YE|hSEQ*X-%qo(V zHaFwyGZ0on=I{=fhe<=zo{=Og-_(to3?cvL4m6PymtNsdDINsBh8m>a%!5o3s(en) z=1I z6O+YNertC|OFNqd6P=$gMyvmfa`w~p9*gKDESFqNBy(~Zw3TFDYh}$iudn)9HxPBi zdokK@o~nu?%imcURr5Y~?6oo_JBe}t|pU5qjai|#JDyG=i^V~7+a{dEnO<(y>ahND#_X_fcEBNiZ)uc&%1HVtx8Ts z*H_Btvx^IhkfOB#{szN*n6;y05A>3eARDXslaE>tnLa>+`V&cgho?ED+&vv5KJszf zG4@G;7i;4_bVvZ>!mli3j7~tPgybF5|J6=Lt`u$D%X0l}#iY9nOXH@(%FFJLtzb%p zzHfABnSs;v-9(&nzbZytLiqqDIWzn>JQDk#JULcE5CyPq_m#4QV!}3421haQ+LcfO*>r;rg6K|r#5Sh|y@h1ao%Cl)t*u`4 zMTP!deC?aL7uTxm5^nUv#q2vS-5QbBKP|drbDXS%erB>fYM84Kpk^au99-BQBZR z7CDynflrIAi&ahza+kUryju5LR_}-Z27g)jqOc(!Lx9y)e z{cYc&_r947s9pteaa4}dc|!$$N9+M38sUr7h(%@Ehq`4HJtTpA>B8CLNO__@%(F5d z`SmX5jbux6i#qc}xOhumzbAELh*Mfr2SW99=WNOZRZgoCU4A2|4i|ZVFQt6qEhH#B zK_9G;&h*LO6tB`5dXRSBF0hq0tk{2q__aCKXYkP#9n^)@cq}`&Lo)1KM{W+>5mSed zKp~=}$p7>~nK@va`vN{mYzWN1(tE=u2BZhga5(VtPKk(*TvE&zmn5vSbjo zZLVobTl%;t@6;4SsZ>5+U-XEGUZGG;+~|V(pE&qqrp_f~{_1h@5ZrNETqe{bt9ioZ z#Qn~gWCH!t#Ha^n&fT2?{`}D@s4?9kXj;E;lWV9Zw8_4yM0Qg-6YSsKgvQ*fF{#Pq z{=(nyV>#*`RloBVCs;Lp*R1PBIQOY=EK4CQa*BD0MsYcg=opP?8;xYQDSAJBeJpw5 zPBc_Ft9?;<0?pBhCmOtWU*pN*;CkjJ_}qVic`}V@$TwFi15!mF1*m2wVX+>5p%(+R zQ~JUW*zWkalde{90@2v+oVlkxOZFihE&ZJ){c?hX3L2@R7jk*xjYtHi=}qb+4B(XJ z$gYcNudR~4Kz_WRq8eS((>ALWCO)&R-MXE+YxDn9V#X{_H@j616<|P(8h(7z?q*r+ zmpqR#7+g$cT@e&(%_|ipI&A%9+47%30TLY(yuf&*knx1wNx|%*H^;YB%ftt%5>QM= z^i;*6_KTSRzQm%qz*>cK&EISvF^ovbS4|R%)zKhTH_2K>jP3mBGn5{95&G9^a#4|K zv+!>fIsR8z{^x4)FIr*cYT@Q4Z{y}};rLHL+atCgHbfX*;+k&37DIgENn&=k(*lKD zG;uL-KAdLn*JQ?@r6Q!0V$xXP=J2i~;_+i3|F;_En;oAMG|I-RX#FwnmU&G}w`7R{ z788CrR-g1DW4h_`&$Z`ctN~{A)Hv_-Bl!%+pfif8wN32rMD zJDs$eVWBYQx1&2sCdB0!vU5~uf)=vy*{}t{2VBpcz<+~h0wb7F3?V^44*&83Z2#F` z32!rd4>uc63rQP$3lTH3zb-47IGR}f)8kZ4JvX#toIpXH`L%NnPDE~$QI1)0)|HS4 zVcITo$$oWWwCN@E-5h>N?Hua!N9CYb6f8vTFd>h3q5Jg-lCI6y%vu{Z_Uf z$MU{{^o~;nD_@m2|E{J)q;|BK7rx%`m``+OqZAqAVj-Dy+pD4-S3xK?($>wn5bi90CFAQ+ACd;&m6DQB8_o zjAq^=eUYc1o{#+p+ zn;K<)Pn*4u742P!;H^E3^Qu%2dM{2slouc$AN_3V^M7H_KY3H)#n7qd5_p~Za7zAj|s9{l)RdbV9e||_67`#Tu*c<8!I=zb@ z(MSvQ9;Wrkq6d)!9afh+G`!f$Ip!F<4ADdc*OY-y7BZMsau%y?EN6*hW4mOF%Q~bw z2==Z3^~?q<1GTeS>xGN-?CHZ7a#M4kDL zQxQr~1ZMzCSKFK5+32C%+C1kE#(2L=15AR!er7GKbp?Xd1qkkGipx5Q~FI-6zt< z*PTpeVI)Ngnnyaz5noIIgNZtb4bQdKG{Bs~&tf)?nM$a;7>r36djllw%hQxeCXeW^ z(i6@TEIuxD<2ulwLTt|&gZP%Ei+l!(%p5Yij6U(H#HMkqM8U$@OKB|5@vUiuY^d6X zW}fP3;Kps6051OEO(|JzmVU6SX(8q>*yf*x5QoxDK={PH^F?!VCzES_Qs>()_y|jg6LJlJWp;L zKM*g5DK7>W_*uv}{0WUB0>MHZ#oJZmO!b3MjEc}VhsLD~;E-qNNd?x7Q6~v zR=0$u>Zc2Xr}>x_5$-s#l!oz6I>W?lw;m9Ae{Tf9eMX;TI-Wf_mZ6sVrMnY#F}cDd z%CV*}fDsXUF7Vbw>PuDaGhu631+3|{xp<@Kl|%WxU+vuLlcrklMC!Aq+7n~I3cmQ! z`e3cA!XUEGdEPSu``&lZEKD1IKO(-VGvcnSc153m(i!8ohi`)N2n>U_BemYJ`uY>8B*Epj!oXRLV}XK}>D*^DHQ7?NY*&LJ9VSo`Ogi9J zGa;clWI8vIQqkngv2>xKd91K>?0`Sw;E&TMg&6dcd20|FcTsnUT7Yn{oI5V4@Ow~m zz#k~8TM!A9L7T!|colrC0P2WKZW7PNj_X4MfESbt<-soq*0LzShZ}fyUx!(xIIDwx zRHt^_GAWe0-Vm~bDZ(}XG%E+`XhKpPlMBo*5q_z$BGxYef8O!ToS8aT8pmjbPq)nV z%x*PF5ZuSHRJqJ!`5<4xC*xb2vC?7u1iljB_*iUGl6+yPyjn?F?GOF2_KW&gOkJ?w z3e^qc-te;zez`H$rsUCE0<@7PKGW?7sT1SPYWId|FJ8H`uEdNu4YJjre`8F*D}6Wh z|FQ`xf7yiphHIAkU&OYCn}w^ilY@o4larl?^M7&8YI;hzBIsX|i3UrLsx{QDKwCX< zy;a>yjfJ6!sz`NcVi+a!Fqk^VE^{6G53L?@Tif|j!3QZ0fk9QeUq8CWI;OmO-Hs+F zuZ4sHLA3{}LR2Qlyo+{d@?;`tpp6YB^BMoJt?&MHFY!JQwoa0nTSD+#Ku^4b{5SZVFwU9<~APYbaLO zu~Z)nS#dxI-5lmS-Bnw!(u15by(80LlC@|ynj{TzW)XcspC*}z0~8VRZq>#Z49G`I zgl|C#H&=}n-ajxfo{=pxPV(L*7g}gHET9b*s=cGV7VFa<;Htgjk>KyW@S!|z`lR1( zGSYkEl&@-bZ*d2WQ~hw3NpP=YNHF^XC{TMG$Gn+{b6pZn+5=<()>C!N^jncl0w6BJ zdHdnmSEGK5BlMeZD!v4t5m7ct7{k~$1Ie3GLFoHjAH*b?++s<|=yTF+^I&jT#zuMx z)MLhU+;LFk8bse|_{j+d*a=&cm2}M?*arjBPnfPgLwv)86D$6L zLJ0wPul7IenMvVAK$z^q5<^!)7aI|<&GGEbOr=E;UmGOIa}yO~EIr5xWU_(ol$&fa zR5E(2vB?S3EvJglTXdU#@qfDbCYs#82Yo^aZN6`{Ex#M)easBTe_J8utXu(fY1j|R z9o(sQbj$bKU{IjyhosYahY{63>}$9_+hWxB3j}VQkJ@2$D@vpeRSldU?&7I;qd2MF zSYmJ>zA(@N_iK}m*AMPIJG#Y&1KR)6`LJ83qg~`Do3v^B0>fU&wUx(qefuTgzFED{sJ65!iw{F2}1fQ3= ziFIP{kezQxmlx-!yo+sC4PEtG#K=5VM9YIN0z9~c4XTX?*4e@m;hFM!zVo>A`#566 z>f&3g94lJ{r)QJ5m7Xe3SLau_lOpL;A($wsjHR`;xTXgIiZ#o&vt~ zGR6KdU$FFbLfZCC3AEu$b`tj!9XgOGLSV=QPIYW zjI!hSP#?8pn0@ezuenOzoka8!8~jXTbiJ6+ZuItsWW03uzASFyn*zV2kIgPFR$Yzm zE<$cZlF>R8?Nr2_i?KiripBc+TGgJvG@vRTY2o?(_Di}D30!k&CT`>+7ry2!!iC*X z<@=U0_C#16=PN7bB39w+zPwDOHX}h20Ap);dx}kjXX0-QkRk=cr};GYsjSvyLZa-t zzHONWddi*)RDUH@RTAsGB_#&O+QJaaL+H<<9LLSE+nB@eGF1fALwjVOl8X_sdOYme z0lk!X=S(@25=TZHR7LlPp}fY~yNeThMIjD}pd9+q=j<_inh0$>mIzWVY+Z9p<{D^#0Xk+b_@eNSiR8;KzSZ#7lUsk~NGMcB8C2c=m2l5paHPq`q{S(kdA7Z1a zyfk2Y;w?^t`?@yC5Pz9&pzo}Hc#}mLgDmhKV|PJ3lKOY(Km@Fi2AV~CuET*YfUi}u zfInZnqDX(<#vaS<^fszuR=l)AbqG{}9{rnyx?PbZz3Pyu!eSJK`uwkJU!ORQXy4x83r!PNgOyD33}}L=>xX_93l6njNTuqL8J{l%*3FVn3MG4&Fv*`lBXZ z?=;kn6HTT^#SrPX-N)4EZiIZI!0ByXTWy;;J-Tht{jq1mjh`DSy7yGjHxIaY%*sTx zuy9#9CqE#qi>1misx=KRWm=qx4rk|}vd+LMY3M`ow8)}m$3Ggv&)Ri*ON+}<^P%T5 z_7JPVPfdM=Pv-oH<tecoE}(0O7|YZc*d8`Uv_M*3Rzv7$yZnJE6N_W=AQ3_BgU_TjA_T?a)U1csCmJ&YqMp-lJe`y6>N zt++Bi;ZMOD%%1c&-Q;bKsYg!SmS^#J@8UFY|G3!rtyaTFb!5@e(@l?1t(87ln8rG? z--$1)YC~vWnXiW3GXm`FNSyzu!m$qT=Eldf$sMl#PEfGmzQs^oUd=GIQfj(X=}dw+ zT*oa0*oS%@cLgvB&PKIQ=Ok?>x#c#dC#sQifgMwtAG^l3D9nIg(Zqi;D%807TtUUCL3_;kjyte#cAg?S%e4S2W>9^A(uy8Ss0Tc++ZTjJw1 z&Em2g!3lo@LlDyri(P^I8BPpn$RE7n*q9Q-c^>rfOMM6Pd5671I=ZBjAvpj8oIi$! zl0exNl(>NIiQpX~FRS9UgK|0l#s@#)p4?^?XAz}Gjb1?4Qe4?j&cL$C8u}n)?A@YC zfmbSM`Hl5pQFwv$CQBF=_$Sq zxsV?BHI5bGZTk?B6B&KLdIN-40S426X3j_|ceLla*M3}3gx3(_7MVY1++4mzhH#7# zD>2gTHy*%i$~}mqc#gK83288SKp@y3wz1L_e8fF$Rb}ex+`(h)j}%~Ld^3DUZkgez zOUNy^%>>HHE|-y$V@B}-M|_{h!vXpk01xaD%{l{oQ|~+^>rR*rv9iQen5t?{BHg|% zR`;S|KtUb!X<22RTBA4AAUM6#M?=w5VY-hEV)b`!y1^mPNEoy2K)a>OyA?Q~Q*&(O zRzQI~y_W=IPi?-OJX*&&8dvY0zWM2%yXdFI!D-n@6FsG)pEYdJbuA`g4yy;qrgR?G z8Mj7gv1oiWq)+_$GqqQ$(ZM@#|0j7})=#$S&hZwdoijFI4aCFLVI3tMH5fLreZ;KD zqA`)0l~D2tuIBYOy+LGw&hJ5OyE+@cnZ0L5+;yo2pIMdt@4$r^5Y!x7nHs{@>|W(MzJjATyWGNwZ^4j+EPU0RpAl-oTM@u{lx*i0^yyWPfHt6QwPvYpk9xFMWfBFt!+Gu6TlAmr zeQ#PX71vzN*_-xh&__N`IXv6`>CgV#eA_%e@7wjgkj8jlKzO~Ic6g$cT`^W{R{606 zCDP~+NVZ6DMO$jhL~#+!g*$T!XW63#(ngDn#Qwy71yj^gazS{e;3jGRM0HedGD@pt z?(ln3pCUA(ekqAvvnKy0G@?-|-dh=eS%4Civ&c}s%wF@0K5Bltaq^2Os1n6Z3%?-Q zAlC4goQ&vK6TpgtzkHVt*1!tBYt-`|5HLV1V7*#45Vb+GACuU+QB&hZ=N_flPy0TY zR^HIrdskB#<$aU;HY(K{a3(OQa$0<9qH(oa)lg@Uf>M5g2W0U5 zk!JSlhrw8quBx9A>RJ6}=;W&wt@2E$7J=9SVHsdC?K(L(KACb#z)@C$xXD8^!7|uv zZh$6fkq)aoD}^79VqdJ!Nz-8$IrU(_-&^cHBI;4 z^$B+1aPe|LG)C55LjP;jab{dTf$0~xbXS9!!QdcmDYLbL^jvxu2y*qnx2%jbL%rB z{aP85qBJe#(&O~Prk%IJARcdEypZ)vah%ZZ%;Zk{eW(U)Bx7VlzgOi8)x z`rh4l`@l_Ada7z&yUK>ZF;i6YLGwI*Sg#Fk#Qr0Jg&VLax(nNN$u-XJ5=MsP3|(lEdIOJ7|(x3iY;ea)5#BW*mDV%^=8qOeYO&gIdJVuLLN3cFaN=xZtFB=b zH{l)PZl_j^u+qx@89}gAQW7ofb+k)QwX=aegihossZq*+@PlCpb$rpp>Cbk9UJO<~ zDjlXQ_Ig#W0zdD3&*ei(FwlN#3b%FSR%&M^ywF@Fr>d~do@-kIS$e%wkIVfJ|Ohh=zc zF&Rnic^|>@R%v?@jO}a9;nY3Qrg_!xC=ZWUcYiA5R+|2nsM*$+c$TOs6pm!}Z}dfM zGeBhMGWw3$6KZXav^>YNA=r6Es>p<6HRYcZY)z{>yasbC81A*G-le8~QoV;rtKnkx z;+os8BvEe?0A6W*a#dOudsv3aWs?d% z0oNngyVMjavLjtjiG`!007#?62ClTqqU$@kIY`=x^$2e>iqIy1>o|@Tw@)P)B8_1$r#6>DB_5 zmaOaoE~^9TolgDgooKFuEFB#klSF%9-~d2~_|kQ0Y{Ek=HH5yq9s zDq#1S551c`kSiWPZbweN^A4kWiP#Qg6er1}HcKv{fxb1*BULboD0fwfaNM_<55>qM zETZ8TJDO4V)=aPp_eQjX%||Ud<>wkIzvDlpNjqW>I}W!-j7M^TNe5JIFh#-}zAV!$ICOju8Kx)N z0vLtzDdy*rQN!7r>Xz7rLw8J-(GzQlYYVH$WK#F`i_i^qVlzTNAh>gBWKV@XC$T-` z3|kj#iCquDhiO7NKum07i|<-NuVsX}Q}mIP$jBJDMfUiaWR3c|F_kWBMw0_Sr|6h4 zk`_r5=0&rCR^*tOy$A8K;@|NqwncjZ>Y-75vlpxq%Cl3EgH`}^^~=u zoll6xxY@a>0f%Ddpi;=cY}fyG!K2N-dEyXXmUP5u){4VnyS^T4?pjN@Ot4zjL(Puw z_U#wMH2Z#8Pts{olG5Dy0tZj;N@;fHheu>YKYQU=4Bk|wcD9MbA`3O4bj$hNRHwzb zSLcG0SLV%zywdbuwl(^E_!@&)TdXge4O{MRWk2RKOt@!8E{$BU-AH(@4{gxs=YAz9LIob|Hzto0}9cWoz6Tp2x0&xi#$ zHh$dwO&UCR1Ob2w00-2eG7d4=cN(Y>0R#$q8?||q@iTi+7-w-xR%uMr&StFIthC<# zvK(aPduwuNB}oJUV8+Zl)%cnfsHI%4`;x6XW^UF^e4s3Z@S<&EV8?56Wya;HNs0E> z`$0dgRdiUz9RO9Au3RmYq>K#G=X%*_dUbSJHP`lSfBaN8t-~@F>)BL1RT*9I851A3 z<-+Gb#_QRX>~av#Ni<#zLswtu-c6{jGHR>wflhKLzC4P@b%8&~u)fosoNjk4r#GvC zlU#UU9&0Hv;d%g72Wq?Ym<&&vtA3AB##L}=ZjiTR4hh7J)e>ei} zt*u+>h%MwN`%3}b4wYpV=QwbY!jwfIj#{me)TDOG`?tI!%l=AwL2G@9I~}?_dA5g6 zCKgK(;6Q0&P&K21Tx~k=o6jwV{dI_G+Ba*Zts|Tl6q1zeC?iYJTb{hel*x>^wb|2RkHkU$!+S4OU4ZOKPZjV>9OVsqNnv5jK8TRAE$A&^yRwK zj-MJ3Pl?)KA~fq#*K~W0l4$0=8GRx^9+?w z!QT8*-)w|S^B0)ZeY5gZPI2G(QtQf?DjuK(s^$rMA!C%P22vynZY4SuOE=wX2f8$R z)A}mzJi4WJnZ`!bHG1=$lwaxm!GOnRbR15F$nRC-M*H<*VfF|pQw(;tbSfp({>9^5 zw_M1-SJ9eGF~m(0dvp*P8uaA0Yw+EkP-SWqu zqal$hK8SmM7#Mrs0@OD+%_J%H*bMyZiWAZdsIBj#lkZ!l2c&IpLu(5^T0Ge5PHzR} zn;TXs$+IQ_&;O~u=Jz+XE0wbOy`=6>m9JVG} zJ~Kp1e5m?K3x@@>!D)piw^eMIHjD4RebtR`|IlckplP1;r21wTi8v((KqNqn%2CB< zifaQc&T}*M&0i|LW^LgdjIaX|o~I$`owHolRqeH_CFrqCUCleN130&vH}dK|^kC>) z-r2P~mApHotL4dRX$25lIcRh_*kJaxi^%ZN5-GAAMOxfB!6flLPY-p&QzL9TE%ho( zRwftE3sy5<*^)qYzKkL|rE>n@hyr;xPqncY6QJ8125!MWr`UCWuC~A#G1AqF1@V$kv>@NBvN&2ygy*{QvxolkRRb%Ui zsmKROR%{*g*WjUUod@@cS^4eF^}yQ1>;WlGwOli z+Y$(8I`0(^d|w>{eaf!_BBM;NpCoeem2>J}82*!em=}}ymoXk>QEfJ>G(3LNA2-46 z5PGvjr)Xh9>aSe>vEzM*>xp{tJyZox1ZRl}QjcvX2TEgNc^(_-hir@Es>NySoa1g^ zFow_twnHdx(j?Q_3q51t3XI7YlJ4_q&(0#)&a+RUy{IcBq?)eaWo*=H2UUVIqtp&lW9JTJiP&u zw8+4vo~_IJXZIJb_U^&=GI1nSD%e;P!c{kZALNCm5c%%oF+I3DrA63_@4)(v4(t~JiddILp7jmoy+>cD~ivwoctFfEL zP*#2Rx?_&bCpX26MBgp^4G>@h`Hxc(lnqyj!*t>9sOBcXN(hTwEDpn^X{x!!gPX?1 z*uM$}cYRwHXuf+gYTB}gDTcw{TXSOUU$S?8BeP&sc!Lc{{pEv}x#ELX>6*ipI1#>8 zKes$bHjiJ1OygZge_ak^Hz#k;=od1wZ=o71ba7oClBMq>Uk6hVq|ePPt)@FM5bW$I z;d2Or@wBjbTyZj|;+iHp%Bo!Vy(X3YM-}lasMItEV_QrP-Kk_J4C>)L&I3Xxj=E?| zsAF(IfVQ4w+dRRnJ>)}o^3_012YYgFWE)5TT=l2657*L8_u1KC>Y-R{7w^S&A^X^U}h20jpS zQsdeaA#WIE*<8KG*oXc~$izYilTc#z{5xhpXmdT-YUnGh9v4c#lrHG6X82F2-t35} zB`jo$HjKe~E*W$=g|j&P>70_cI`GnOQ;Jp*JK#CT zuEGCn{8A@bC)~0%wsEv?O^hSZF*iqjO~_h|>xv>PO+?525Nw2472(yqS>(#R)D7O( zg)Zrj9n9$}=~b00=Wjf?E418qP-@8%MQ%PBiCTX=$B)e5cHFDu$LnOeJ~NC;xmOk# z>z&TbsK>Qzk)!88lNI8fOE2$Uxso^j*1fz>6Ot49y@=po)j4hbTIcVR`ePHpuJSfp zxaD^Dn3X}Na3@<_Pc>a;-|^Pon(>|ytG_+U^8j_JxP=_d>L$Hj?|0lz>_qQ#a|$+( z(x=Lipuc8p4^}1EQhI|TubffZvB~lu$zz9ao%T?%ZLyV5S9}cLeT?c} z>yCN9<04NRi~1oR)CiBakoNhY9BPnv)kw%*iv8vdr&&VgLGIs(-FbJ?d_gfbL2={- zBk4lkdPk~7+jIxd4{M(-W1AC_WcN&Oza@jZoj zaE*9Y;g83#m(OhA!w~LNfUJNUuRz*H-=$s*z+q+;snKPRm9EptejugC-@7-a-}Tz0 z@KHra#Y@OXK+KsaSN9WiGf?&jlZ!V7L||%KHP;SLksMFfjkeIMf<1e~t?!G3{n)H8 zQAlFY#QwfKuj;l@<$YDATAk;%PtD%B(0<|8>rXU< zJ66rkAVW_~Dj!7JGdGGi4NFuE?7ZafdMxIh65Sz7yQoA7fBZCE@WwysB=+`kT^LFX zz8#FlSA5)6FG9(qL3~A24mpzL@@2D#>0J7mMS1T*9UJ zvOq!!a(%IYY69+h45CE?(&v9H4FCr>gK0>mK~F}5RdOuH2{4|}k@5XpsX7+LZo^Qa4sH5`eUj>iffoBVm+ zz4Mtf`h?NW$*q1yr|}E&eNl)J``SZvTf6Qr*&S%tVv_OBpbjnA0&Vz#(;QmGiq-k! zgS0br4I&+^2mgA15*~Cd00cXLYOLA#Ep}_)eED>m+K@JTPr_|lSN}(OzFXQSBc6fM z@f-%2;1@BzhZa*LFV z-LrLmkmB%<<&jEURBEW>soaZ*rSIJNwaV%-RSaCZi4X)qYy^PxZ=oL?6N-5OGOMD2 z;q_JK?zkwQ@b3~ln&sDtT5SpW9a0q+5Gm|fpVY2|zqlNYBR}E5+ahgdj!CvK$Tlk0 z9g$5N;aar=CqMsudQV>yb4l@hN(9Jcc=1(|OHsqH6|g=K-WBd8GxZ`AkT?OO z-z_Ued-??Z*R4~L7jwJ%-`s~FK|qNAJ;EmIVDVpk{Lr7T4l{}vL)|GuUuswe9c5F| zv*5%u01hlv08?00Vpwyk*Q&&fY8k6MjOfpZfKa@F-^6d=Zv|0@&4_544RP5(s|4VPVP-f>%u(J@23BHqo2=zJ#v9g=F!cP((h zpt0|(s++ej?|$;2PE%+kc6JMmJjDW)3BXvBK!h!E`8Y&*7hS{c_Z?4SFP&Y<3evqf z9-ke+bSj$%Pk{CJlJbWwlBg^mEC^@%Ou?o>*|O)rl&`KIbHrjcpqsc$Zqt0^^F-gU2O=BusO+(Op}!jNzLMc zT;0YT%$@ClS%V+6lMTfhuzzxomoat=1H?1$5Ei7&M|gxo`~{UiV5w64Np6xV zVK^nL$)#^tjhCpTQMspXI({TW^U5h&Wi1Jl8g?P1YCV4=%ZYyjSo#5$SX&`r&1PyC zzc;uzCd)VTIih|8eNqFNeBMe#j_FS6rq81b>5?aXg+E#&$m++Gz9<+2)h=K(xtn}F ziV{rmu+Y>A)qvF}ms}4X^Isy!M&1%$E!rTO~5(p+8{U6#hWu>(Ll1}eD64Xa>~73A*538wry?v$vW z>^O#FRdbj(k0Nr&)U`Tl(4PI*%IV~;ZcI2z&rmq=(k^}zGOYZF3b2~Klpzd2eZJl> zB=MOLwI1{$RxQ7Y4e30&yOx?BvAvDkTBvWPpl4V8B7o>4SJn*+h1Ms&fHso%XLN5j z-zEwT%dTefp~)J_C8;Q6i$t!dnlh-!%haR1X_NuYUuP-)`IGWjwzAvp!9@h`kPZhf zwLwFk{m3arCdx8rD~K2`42mIN4}m%OQ|f)4kf%pL?Af5Ul<3M2fv>;nlhEPR8b)u} zIV*2-wyyD%%) zl$G@KrC#cUwoL?YdQyf9WH)@gWB{jd5w4evI& zOFF)p_D8>;3-N1z6mES!OPe>B^<;9xsh)){Cw$Vs-ez5nXS95NOr3s$IU;>VZSzKn zBvub8_J~I%(DozZW@{)Vp37-zevxMRZ8$8iRfwHmYvyjOxIOAF2FUngKj289!(uxY zaClWm!%x&teKmr^ABrvZ(ikx{{I-lEzw5&4t3P0eX%M~>$wG0ZjA4Mb&op+0$#SO_ z--R`>X!aqFu^F|a!{Up-iF(K+alKB{MNMs>e(i@Tpy+7Z-dK%IEjQFO(G+2mOb@BO zP>WHlS#fSQm0et)bG8^ZDScGnh-qRKIFz zfUdnk=m){ej0i(VBd@RLtRq3Ep=>&2zZ2%&vvf?Iex01hx1X!8U+?>ER;yJlR-2q4 z;Y@hzhEC=d+Le%=esE>OQ!Q|E%6yG3V_2*uh&_nguPcZ{q?DNq8h_2ahaP6=pP-+x zK!(ve(yfoYC+n(_+chiJ6N(ZaN+XSZ{|H{TR1J_s8x4jpis-Z-rlRvRK#U%SMJ(`C z?T2 zF(NNfO_&W%2roEC2j#v*(nRgl1X)V-USp-H|CwFNs?n@&vpRcj@W@xCJwR6@T!jt377?XjZ06=`d*MFyTdyvW!`mQm~t3luzYzvh^F zM|V}rO>IlBjZc}9Z zd$&!tthvr>5)m;5;96LWiAV0?t)7suqdh0cZis`^Pyg@?t>Ms~7{nCU;z`Xl+raSr zXpp=W1oHB*98s!Tpw=R5C)O{{Inl>9l7M*kq%#w9a$6N~v?BY2GKOVRkXYCgg*d

<5G2M1WZP5 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/local-cli/templates/HelloWorld/android/gradlew.bat b/local-cli/templates/HelloWorld/android/gradlew.bat deleted file mode 100644 index e95643d6a2ca62..00000000000000 --- a/local-cli/templates/HelloWorld/android/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/local-cli/templates/HelloWorld/android/keystores/_BUCK b/local-cli/templates/HelloWorld/android/keystores/_BUCK deleted file mode 100644 index 88e4c31b28d497..00000000000000 --- a/local-cli/templates/HelloWorld/android/keystores/_BUCK +++ /dev/null @@ -1,8 +0,0 @@ -keystore( - name = "debug", - properties = "debug.keystore.properties", - store = "debug.keystore", - visibility = [ - "PUBLIC", - ], -) diff --git a/local-cli/templates/HelloWorld/android/keystores/debug.keystore.properties b/local-cli/templates/HelloWorld/android/keystores/debug.keystore.properties deleted file mode 100644 index 121bfb49f0dfda..00000000000000 --- a/local-cli/templates/HelloWorld/android/keystores/debug.keystore.properties +++ /dev/null @@ -1,4 +0,0 @@ -key.store=debug.keystore -key.alias=androiddebugkey -key.store.password=android -key.alias.password=android diff --git a/local-cli/templates/HelloWorld/android/settings.gradle b/local-cli/templates/HelloWorld/android/settings.gradle deleted file mode 100644 index 32e6f44c4b2df5..00000000000000 --- a/local-cli/templates/HelloWorld/android/settings.gradle +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = 'HelloWorld' - -include ':app' diff --git a/local-cli/templates/HelloWorld/app.json b/local-cli/templates/HelloWorld/app.json deleted file mode 100644 index 114d929c1581c5..00000000000000 --- a/local-cli/templates/HelloWorld/app.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "HelloWorld", - "displayName": "HelloWorld" -} \ No newline at end of file diff --git a/local-cli/templates/HelloWorld/index.js b/local-cli/templates/HelloWorld/index.js deleted file mode 100644 index 3ac66525d84311..00000000000000 --- a/local-cli/templates/HelloWorld/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @format - * @lint-ignore-every XPLATJSCOPYRIGHT1 - */ - -import {AppRegistry} from 'react-native'; -import App from './App'; -import {name as appName} from './app.json'; - -AppRegistry.registerComponent(appName, () => App); diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld-tvOS/Info.plist b/local-cli/templates/HelloWorld/ios/HelloWorld-tvOS/Info.plist deleted file mode 100644 index 2fb6a11c2c3356..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld-tvOS/Info.plist +++ /dev/null @@ -1,54 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - NSLocationWhenInUseUsageDescription - - NSAppTransportSecurity - - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - - diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld-tvOSTests/Info.plist b/local-cli/templates/HelloWorld/ios/HelloWorld-tvOSTests/Info.plist deleted file mode 100644 index 886825ccc9bf0d..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld-tvOSTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/project.pbxproj b/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/project.pbxproj deleted file mode 100644 index 975ce5700159f2..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1502 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; - 00E356F31AD99517003FC87E /* HelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* HelloWorldTests.m */; }; - 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; - 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; - 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; - 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; - 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; - 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; - 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; - 2DCD954D1E0B4F2C00145EB5 /* HelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* HelloWorldTests.m */; }; - 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; - ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; }; - ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTActionSheet; - }; - 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTGeolocation; - }; - 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5115D1A9E6B3D00147676; - remoteInfo = RCTImage; - }; - 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B511DB1A9E6C8500147676; - remoteInfo = RCTNetwork; - }; - 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; - remoteInfo = RCTVibration; - }; - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = HelloWorld; - }; - 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTSettings; - }; - 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3C86DF461ADF2C930047B81A; - remoteInfo = RCTWebSocket; - }; - 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; - remoteInfo = React; - }; - 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; - remoteInfo = "HelloWorld-tvOS"; - }; - 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = ADD01A681E09402E00F6D226; - remoteInfo = "RCTBlob-tvOS"; - }; - 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; - remoteInfo = fishhook; - }; - 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; - remoteInfo = "fishhook-tvOS"; - }; - 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EBF21BDC1FC498900052F4D5; - remoteInfo = jsinspector; - }; - 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5; - remoteInfo = "jsinspector-tvOS"; - }; - 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; - remoteInfo = "third-party"; - }; - 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; - remoteInfo = "third-party-tvOS"; - }; - 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 139D7E881E25C6D100323FB7; - remoteInfo = "double-conversion"; - }; - 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D383D621EBD27B9005632C8; - remoteInfo = "double-conversion-tvOS"; - }; - 2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 9936F3131F5F2E4B0010BF04; - remoteInfo = privatedata; - }; - 2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 9936F32F1F5F2E5B0010BF04; - remoteInfo = "privatedata-tvOS"; - }; - 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; - remoteInfo = "RCTImage-tvOS"; - }; - 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28471D9B043800D4039D; - remoteInfo = "RCTLinking-tvOS"; - }; - 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28541D9B044C00D4039D; - remoteInfo = "RCTNetwork-tvOS"; - }; - 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28611D9B046600D4039D; - remoteInfo = "RCTSettings-tvOS"; - }; - 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A287B1D9B048500D4039D; - remoteInfo = "RCTText-tvOS"; - }; - 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28881D9B049200D4039D; - remoteInfo = "RCTWebSocket-tvOS"; - }; - 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28131D9B038B00D4039D; - remoteInfo = "React-tvOS"; - }; - 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C059A1DE3340900C268FA; - remoteInfo = yoga; - }; - 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C06751DE3340C00C268FA; - remoteInfo = "yoga-tvOS"; - }; - 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; - remoteInfo = cxxreact; - }; - 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; - remoteInfo = "cxxreact-tvOS"; - }; - 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; - remoteInfo = jschelpers; - }; - 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; - remoteInfo = "jschelpers-tvOS"; - }; - 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTAnimation; - }; - 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28201D9B03D100D4039D; - remoteInfo = "RCTAnimation-tvOS"; - }; - 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTLinking; - }; - 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5119B1A9E6C1200147676; - remoteInfo = RCTText; - }; - ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 358F4ED71D1E81A9004DF814; - remoteInfo = RCTBlob; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* HelloWorldTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HelloWorldTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* HelloWorldTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HelloWorldTests.m; sourceTree = ""; }; - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* HelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = HelloWorld/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = HelloWorld/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = HelloWorld/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = HelloWorld/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = HelloWorld/main.m; sourceTree = ""; }; - 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 2D02E47B1E0B4A5D006451C7 /* HelloWorld-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "HelloWorld-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D02E4901E0B4A5D006451C7 /* HelloWorld-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "HelloWorld-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */, - ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, - 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */, - 146834051AC3E58100842450 /* libReact.a in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, - 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */, - 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, - 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, - 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, - 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, - 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, - 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, - 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00C302A81ABCB8CE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302B61ABCB90400DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302BC1ABCB91800DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, - 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302D41ABCB9D200DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, - 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302E01ABCB9EE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, - ); - name = Products; - sourceTree = ""; - }; - 00E356EF1AD99517003FC87E /* HelloWorldTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* HelloWorldTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = HelloWorldTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 139105B71AF99BAD00B5F7CC /* Products */ = { - isa = PBXGroup; - children = ( - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, - 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 139FDEE71B06529A00C62182 /* Products */ = { - isa = PBXGroup; - children = ( - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, - 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, - 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */, - 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* HelloWorld */ = { - isa = PBXGroup; - children = ( - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = HelloWorld; - sourceTree = ""; - }; - 146834001AC3E56700842450 /* Products */ = { - isa = PBXGroup; - children = ( - 146834041AC3E56700842450 /* libReact.a */, - 3DAD3EA31DF850E9000B6D8A /* libReact.a */, - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, - 2DF0FFDF2056DD460020B375 /* libjsinspector.a */, - 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */, - 2DF0FFE32056DD460020B375 /* libthird-party.a */, - 2DF0FFE52056DD460020B375 /* libthird-party.a */, - 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */, - 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */, - 2DF0FFEB2056DD460020B375 /* libprivatedata.a */, - 2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - ED2971642150620600B7C4FE /* JavaScriptCore.framework */, - 2D16E6891FA4F8E400B85C8A /* libReact.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 5E91572E1DD0AC6500FF2AA8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, - ); - name = Products; - sourceTree = ""; - }; - 78C398B11ACF4ADC00677621 /* Products */ = { - isa = PBXGroup; - children = ( - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, - 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, - 146833FF1AC3E56700842450 /* React.xcodeproj */, - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, - ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - ); - name = Libraries; - sourceTree = ""; - }; - 832341B11AAA6A8300B99B32 /* Products */ = { - isa = PBXGroup; - children = ( - 832341B51AAA6A8300B99B32 /* libRCTText.a */, - 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* HelloWorld */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* HelloWorldTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* HelloWorld.app */, - 00E356EE1AD99517003FC87E /* HelloWorldTests.xctest */, - 2D02E47B1E0B4A5D006451C7 /* HelloWorld-tvOS.app */, - 2D02E4901E0B4A5D006451C7 /* HelloWorld-tvOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - ADBDB9201DFEBF0600ED6528 /* Products */ = { - isa = PBXGroup; - children = ( - ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, - 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* HelloWorldTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "HelloWorldTests" */; - buildPhases = ( - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = HelloWorldTests; - productName = HelloWorldTests; - productReference = 00E356EE1AD99517003FC87E /* HelloWorldTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* HelloWorld */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */; - buildPhases = ( - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = HelloWorld; - productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* HelloWorld.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E47A1E0B4A5D006451C7 /* HelloWorld-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "HelloWorld-tvOS" */; - buildPhases = ( - 2D02E4771E0B4A5D006451C7 /* Sources */, - 2D02E4781E0B4A5D006451C7 /* Frameworks */, - 2D02E4791E0B4A5D006451C7 /* Resources */, - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "HelloWorld-tvOS"; - productName = "HelloWorld-tvOS"; - productReference = 2D02E47B1E0B4A5D006451C7 /* HelloWorld-tvOS.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E48F1E0B4A5D006451C7 /* HelloWorld-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "HelloWorld-tvOSTests" */; - buildPhases = ( - 2D02E48C1E0B4A5D006451C7 /* Sources */, - 2D02E48D1E0B4A5D006451C7 /* Frameworks */, - 2D02E48E1E0B4A5D006451C7 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, - ); - name = "HelloWorld-tvOSTests"; - productName = "HelloWorld-tvOSTests"; - productReference = 2D02E4901E0B4A5D006451C7 /* HelloWorld-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0940; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 2D02E47A1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - 2D02E48F1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - TestTargetID = 2D02E47A1E0B4A5D006451C7; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HelloWorld" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; - ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - }, - { - ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; - ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - }, - { - ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; - ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; - }, - { - ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; - ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - }, - { - ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; - ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - }, - { - ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; - ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - }, - { - ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; - ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - }, - { - ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; - ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - }, - { - ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; - ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - }, - { - ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; - ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - }, - { - ProductGroup = 139FDEE71B06529A00C62182 /* Products */; - ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - }, - { - ProductGroup = 146834001AC3E56700842450 /* Products */; - ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* HelloWorld */, - 00E356ED1AD99517003FC87E /* HelloWorldTests */, - 2D02E47A1E0B4A5D006451C7 /* HelloWorld-tvOS */, - 2D02E48F1E0B4A5D006451C7 /* HelloWorld-tvOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTActionSheet.a; - remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTGeolocation.a; - remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTImage.a; - remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTNetwork.a; - remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTVibration.a; - remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTSettings.a; - remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebSocket.a; - remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 146834041AC3E56700842450 /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTBlob-tvOS.a"; - remoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libfishhook.a; - remoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libfishhook-tvOS.a"; - remoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjsinspector.a; - remoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libjsinspector-tvOS.a"; - remoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFE32056DD460020B375 /* libthird-party.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libthird-party.a"; - remoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFE52056DD460020B375 /* libthird-party.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libthird-party.a"; - remoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libdouble-conversion.a"; - remoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libdouble-conversion.a"; - remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFEB2056DD460020B375 /* libprivatedata.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libprivatedata.a; - remoteRef = 2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libprivatedata-tvOS.a"; - remoteRef = 2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTImage-tvOS.a"; - remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTLinking-tvOS.a"; - remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTNetwork-tvOS.a"; - remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTSettings-tvOS.a"; - remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTText-tvOS.a"; - remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTWebSocket-tvOS.a"; - remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAnimation.a; - remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAnimation.a; - remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTLinking.a; - remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTText.a; - remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTBlob.a; - remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4791E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48E1E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; - }; - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native Code And Images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* HelloWorldTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4771E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48C1E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2DCD954D1E0B4F2C00145EB5 /* HelloWorldTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* HelloWorld */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 2D02E47A1E0B4A5D006451C7 /* HelloWorld-tvOS */; - targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = HelloWorld; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = HelloWorldTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloWorld.app/HelloWorld"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - INFOPLIST_FILE = HelloWorldTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloWorld.app/HelloWorld"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = NO; - INFOPLIST_FILE = HelloWorld/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = HelloWorld; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = HelloWorld/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = HelloWorld; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 2D02E4971E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "HelloWorld-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.HelloWorld-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Debug; - }; - 2D02E4981E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "HelloWorld-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.HelloWorld-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Release; - }; - 2D02E4991E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "HelloWorld-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.HelloWorld-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloWorld-tvOS.app/HelloWorld-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Debug; - }; - 2D02E49A1E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "HelloWorld-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.HelloWorld-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HelloWorld-tvOS.app/HelloWorld-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* 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_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - 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_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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* 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_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - 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; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "HelloWorldTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "HelloWorld" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "HelloWorld-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4971E0B4A5E006451C7 /* Debug */, - 2D02E4981E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "HelloWorld-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4991E0B4A5E006451C7 /* Debug */, - 2D02E49A1E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "HelloWorld" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld-tvOS.xcscheme b/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld-tvOS.xcscheme deleted file mode 100644 index a4c88796c96134..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld-tvOS.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme b/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme deleted file mode 100644 index 2c4df7880c02ac..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld.xcodeproj/xcshareddata/xcschemes/HelloWorld.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.h b/local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.h deleted file mode 100644 index 4b5644f21d2c18..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.h +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import - -@interface AppDelegate : UIResponder - -@property (nonatomic, strong) UIWindow *window; - -@end diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.m b/local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.m deleted file mode 100644 index d4d87a689fb567..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/AppDelegate.m +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "AppDelegate.h" - -#import -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - NSURL *jsCodeLocation; - - jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; - - RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation - moduleName:@"HelloWorld" - initialProperties:nil - launchOptions:launchOptions]; - rootView.backgroundColor = [UIColor blackColor]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIViewController *rootViewController = [UIViewController new]; - rootViewController.view = rootView; - self.window.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; - return YES; -} - -@end diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/Base.lproj/LaunchScreen.xib b/local-cli/templates/HelloWorld/ios/HelloWorld/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 0b83e7b2ddb38b..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json b/local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 118c98f7461bf9..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,38 +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" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/Contents.json b/local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/Contents.json deleted file mode 100644 index 2d92bd53fdb222..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/Info.plist b/local-cli/templates/HelloWorld/ios/HelloWorld/Info.plist deleted file mode 100644 index 1a61ccf151e341..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/Info.plist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - Hello App Display Name - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSLocationWhenInUseUsageDescription - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - NSLocationWhenInUseUsageDescription - - NSAppTransportSecurity - - - NSAllowsArbitraryLoads - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - - diff --git a/local-cli/templates/HelloWorld/ios/HelloWorld/main.m b/local-cli/templates/HelloWorld/ios/HelloWorld/main.m deleted file mode 100644 index c316cf816e736a..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorld/main.m +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/local-cli/templates/HelloWorld/ios/HelloWorldTests/HelloWorldTests.m b/local-cli/templates/HelloWorld/ios/HelloWorldTests/HelloWorldTests.m deleted file mode 100644 index e9db2f118ab97e..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorldTests/HelloWorldTests.m +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" - -@interface HelloWorldTests : XCTestCase - -@end - -@implementation HelloWorldTests - -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test -{ - if (test(view)) { - return YES; - } - for (UIView *subview in [view subviews]) { - if ([self findSubviewInView:subview matching:test]) { - return YES; - } - } - return NO; -} - -- (void)testRendersWelcomeScreen -{ - UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; - RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - - RCTSetLogFunction(RCTDefaultLogFunction); - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - - -@end diff --git a/local-cli/templates/HelloWorld/ios/HelloWorldTests/Info.plist b/local-cli/templates/HelloWorld/ios/HelloWorldTests/Info.plist deleted file mode 100644 index ba72822e8728ef..00000000000000 --- a/local-cli/templates/HelloWorld/ios/HelloWorldTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/local-cli/templates/README.md b/local-cli/templates/README.md deleted file mode 100644 index 1180ad1c2be175..00000000000000 --- a/local-cli/templates/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# App templates - -This folder contains basic app templates. These get expanded by 'react-native init' when creating a new app to make it easier for anyone to get started. - -# Chat Example - -This is an example React Native app demonstrates ListViews, text input and -navigation between a few screens. - -screenshot 2017-01-13 17 24 37 -screenshot 2017-01-13 17 24 40 - -## Purpose - -One problem with React Native is that it is not trivial to get started: `react-native init` creates a very simple app that renders some text. Everyone then has to figure out how to do very basic things such as adding a list of items fetched from a server, navigating to a screen when a list item is tapped, or handling text input. - -This app is a template used by `react-native init` so it is easier for anyone to get up and running quickly by having an app with a few screens, a `ListView` and a `TextInput` that works well with the software keyboard. - -## Best practices - -Another purpose of this app is to define best practices such as: -- The folder structure of a standalone React Native app -- A style guide for JavaScript and React - for this we use the [AirBnb style guide](https://github.com/airbnb/javascript) -- Naming conventions - -We need your feedback to settle on a good set of best practices. Have you built React Native apps? If so, please use the issues in the repo [mkonicek/ChatExample](https://github.com/mkonicek/ChatExample) to discuss what you think are the best practices that this example should be using. - -## Running the app locally - -``` -cd ChatExample -yarn -react-native run-ios -react-native run-android -``` - ---- -(In case you want to use react-navigation master): - -``` -# Install dependencies: -cd react-navigation -yarn -yarn pack --filename react-navigation-1.0.0-alpha.tgz -cd ChatExample -yarn -yarn add ~/code/react-navigation/react-navigation-1.0.0-alpha.tgz -``` diff --git a/local-cli/upgrade/upgrade.js b/local-cli/upgrade/upgrade.js deleted file mode 100644 index 202afe52cf42f5..00000000000000 --- a/local-cli/upgrade/upgrade.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const chalk = require('chalk'); -const copyProjectTemplateAndReplace = require('../generator/copyProjectTemplateAndReplace'); -const fs = require('fs'); -const path = require('path'); -const semver = require('semver'); - -/** - * Migrate application to a new version of React Native. - * See http://facebook.github.io/react-native/docs/upgrading.html - * - * IMPORTANT: Assumes the cwd() is the project directory. - * The code here must only be invoked via the CLI: - * $ cd MyAwesomeApp - * $ react-native upgrade - */ -function validateAndUpgrade() { - const projectDir = process.cwd(); - - const packageJSON = JSON.parse( - fs.readFileSync(path.resolve(projectDir, 'package.json'), 'utf8'), - ); - - warn( - 'You should consider using the new upgrade tool based on Git. It ' + - 'makes upgrades easier by resolving most conflicts automatically.\n' + - 'To use it:\n' + - '- Go back to the old version of React Native\n' + - '- Run "npm install -g react-native-git-upgrade"\n' + - '- Run "react-native-git-upgrade"\n' + - 'See https://facebook.github.io/react-native/docs/upgrading.html', - ); - - const projectName = packageJSON.name; - if (!projectName) { - warn( - 'Your project needs to have a name, declared in package.json, ' + - 'such as "name": "AwesomeApp". Please add a project name. Aborting.', - ); - return; - } - - const version = packageJSON.dependencies['react-native']; - if (!version) { - warn( - 'Your "package.json" file doesn\'t seem to declare "react-native" as ' + - 'a dependency. Nothing to upgrade. Aborting.', - ); - return; - } - - if (version === 'latest' || version === '*') { - warn( - 'Some major releases introduce breaking changes.\n' + - 'Please use a caret version number in your "package.json" file \n' + - 'to avoid breakage. Use e.g. react-native: ^0.38.0. Aborting.', - ); - return; - } - - const installed = JSON.parse( - fs.readFileSync( - path.resolve(projectDir, 'node_modules/react-native/package.json'), - 'utf8', - ), - ); - - if (!semver.satisfies(installed.version, version)) { - warn( - 'react-native version in "package.json" doesn\'t match ' + - 'the installed version in "node_modules".\n' + - 'Try running "npm install" to fix this. Aborting.', - ); - return; - } - - const v = version.replace(/^(~|\^|=)/, '').replace(/x/i, '0'); - - if (!semver.valid(v)) { - warn( - "A valid version number for 'react-native' is not specified in your " + - "'package.json' file. Aborting.", - ); - return; - } - - console.log( - 'Upgrading project to react-native v' + - installed.version + - '\n' + - 'Check out the release notes and breaking changes: ' + - 'https://github.com/facebook/react-native/releases/tag/v' + - semver.major(v) + - '.' + - semver.minor(v) + - '.0', - ); - - // >= v0.21.0, we require react to be a peer dependency - if (semver.gte(v, '0.21.0') && !packageJSON.dependencies.react) { - warn( - 'Your "package.json" file doesn\'t seem to have "react" as a dependency.\n' + - '"react" was changed from a dependency to a peer dependency in react-native v0.21.0.\n' + - 'Therefore, it\'s necessary to include "react" in your project\'s dependencies.\n' + - 'Please run "npm install --save react", then re-run "react-native upgrade".\n', - ); - return; - } - - if (semver.satisfies(v, '~0.26.0')) { - warn( - 'React Native 0.26 introduced some breaking changes to the native files on iOS. You can\n' + - 'perform them manually by checking the release notes or use "rnpm" ' + - 'to do it automatically.\n' + - 'Just run:\n' + - '"npm install -g rnpm && npm install rnpm-plugin-upgrade@0.26 --save-dev", ' + - 'then run "rnpm upgrade".', - ); - } - - return new Promise(resolve => { - upgradeProjectFiles(projectDir, projectName); - console.log( - 'Successfully upgraded this project to react-native v' + - installed.version, - ); - resolve(); - }); -} - -/** - * Once all checks passed, upgrade the project files. - */ -function upgradeProjectFiles(projectDir, projectName) { - // Just overwrite - copyProjectTemplateAndReplace( - path.resolve( - 'node_modules', - 'react-native', - 'local-cli', - 'templates', - 'HelloWorld', - ), - projectDir, - projectName, - {upgrade: true}, - ); -} - -function warn(message) { - console.warn(chalk.yellow(message)); -} - -const upgradeCommand = { - name: 'upgrade', - description: - "upgrade your app's template files to the latest version; run this after " + - 'updating the react-native version in your package.json and running npm install', - func: validateAndUpgrade, -}; - -module.exports = upgradeCommand; diff --git a/local-cli/util/Config.js b/local-cli/util/Config.js deleted file mode 100644 index f3ae068937bb2b..00000000000000 --- a/local-cli/util/Config.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow - */ -'use strict'; - -const findSymlinkedModules = require('./findSymlinkedModules'); -const getPolyfills = require('../../rn-get-polyfills'); -const path = require('path'); - -const {createBlacklist} = require('metro'); -const {loadConfig} = require('metro-config'); - -/** - * Configuration file of the CLI. - */ -import type {ConfigT} from 'metro-config/src/configTypes.flow'; - -function getProjectRoot() { - if ( - __dirname.match(/node_modules[\/\\]react-native[\/\\]local-cli[\/\\]util$/) - ) { - // Packager is running from node_modules. - // This is the default case for all projects created using 'react-native init'. - return path.resolve(__dirname, '../../../..'); - } else if (__dirname.match(/Pods[\/\\]React[\/\\]packager$/)) { - // React Native was installed using CocoaPods. - return path.resolve(__dirname, '../../../..'); - } - return path.resolve(__dirname, '../..'); -} - -const resolveSymlinksForRoots = roots => - roots.reduce( - /* $FlowFixMe(>=0.70.0 site=react_native_fb) This comment suppresses an - * error found when Flow v0.70 was deployed. To see the error delete this - * comment and run Flow. */ - (arr, rootPath) => arr.concat(findSymlinkedModules(rootPath, roots)), - [...roots], - ); - -const getWatchFolders = () => { - const root = process.env.REACT_NATIVE_APP_ROOT; - if (root) { - return resolveSymlinksForRoots([path.resolve(root)]); - } - return []; -}; - -const getBlacklistRE = () => { - return createBlacklist([/.*\/__fixtures__\/.*/]); -}; - -/** - * Module capable of getting the configuration out of a given file. - * - * The function will return all the default configuration, as specified by the - * `DEFAULT` param overriden by those found on `rn-cli.config.js` files, if any. If no - * default config is provided and no configuration can be found in the directory - * hierarchy, an error will be thrown. - */ -const Config = { - DEFAULT: { - resolver: { - resolverMainFields: ['react-native', 'browser', 'main'], - blacklistRE: getBlacklistRE(), - }, - serializer: { - getModulesRunBeforeMainModule: () => [ - require.resolve('../../Libraries/Core/InitializeCore'), - ], - getPolyfills, - }, - server: { - port: process.env.RCT_METRO_PORT || 8081, - }, - transformer: { - babelTransformerPath: require.resolve('metro/src/reactNativeTransformer'), - }, - watchFolders: getWatchFolders(), - }, - - async load(configFile: ?string): Promise { - const argv = {cwd: getProjectRoot()}; - - return await loadConfig( - configFile ? {...argv, config: configFile} : argv, - this.DEFAULT, - ); - }, -}; - -module.exports = Config; diff --git a/local-cli/util/PackageManager.js b/local-cli/util/PackageManager.js deleted file mode 100644 index fe0783ec758808..00000000000000 --- a/local-cli/util/PackageManager.js +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const spawnSync = require('child_process').spawnSync; -const yarn = require('../util/yarn'); -const spawnOpts = { - stdio: 'inherit', - stdin: 'inherit', -}; - -/** - * Execute npm or yarn command - * - * @param {String} yarnCommand Yarn command to be executed eg. yarn add package - * @param {String} npmCommand Npm command to be executed eg. npm install package - * @return {object} spawnSync's result object - */ -function callYarnOrNpm(yarnCommand, npmCommand) { - let command; - - const projectDir = process.cwd(); - const isYarnAvailable = - yarn.getYarnVersionIfAvailable() && yarn.isGlobalCliUsingYarn(projectDir); - - if (isYarnAvailable) { - command = yarnCommand; - } else { - command = npmCommand; - } - - const args = command.split(' '); - const cmd = args.shift(); - - const res = spawnSync(cmd, args, spawnOpts); - - return res; -} - -/** - * Install package into project using npm or yarn if available - * @param {[type]} packageName Package to be installed - * @return {[type]} spawnSync's result object - */ -function add(packageName) { - return callYarnOrNpm( - `yarn add ${packageName}`, - `npm install ${packageName} --save`, - ); -} - -/** - * Uninstall package from project using npm or yarn if available - * @param {[type]} packageName Package to be uninstalled - * @return {Object} spawnSync's result object - */ -function remove(packageName) { - return callYarnOrNpm( - `yarn remove ${packageName}`, - `npm uninstall --save ${packageName}`, - ); -} - -module.exports = { - add: add, - remove: remove, -}; diff --git a/local-cli/util/__mocks__/log.js b/local-cli/util/__mocks__/log.js deleted file mode 100644 index 330cae48f76237..00000000000000 --- a/local-cli/util/__mocks__/log.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -module.exports.out = () => jest.fn(); -module.exports.err = () => jest.fn(); diff --git a/local-cli/util/__tests__/findSymlinkedModules-test.js b/local-cli/util/__tests__/findSymlinkedModules-test.js deleted file mode 100644 index fbdfd7463fc028..00000000000000 --- a/local-cli/util/__tests__/findSymlinkedModules-test.js +++ /dev/null @@ -1,353 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @emails oncall+javascript_foundation - */ - -jest.mock('path'); -jest.mock('fs'); - -const fs = require('fs'); -const findSymlinkedModules = require('../findSymlinkedModules'); - -describe('findSymlinksForProjectRoot', () => { - it('correctly finds normal module symlinks', () => { - fs.__setMockFilesystem({ - root: { - projectA: { - 'package.json': JSON.stringify({ - name: 'projectA', - main: 'main.js', - }), - node_modules: { - depFoo: { - 'package.json': JSON.stringify({ - name: 'depFoo', - main: 'main.js', - }), - }, - projectB: { - SYMLINK: '/root/projectB', - }, - }, - }, - projectB: { - 'package.json': JSON.stringify({ - name: 'projectB', - main: 'main.js', - }), - node_modules: { - depBar: { - 'package.json': JSON.stringify({ - name: 'depBar', - main: 'main.js', - }), - }, - }, - }, - }, - }); - - const symlinkedModules = findSymlinkedModules('/root/projectA', []); - expect(symlinkedModules).toEqual(['/root/projectB']); - }); - - it('correctly finds scoped module symlinks', () => { - fs.__setMockFilesystem({ - root: { - projectA: { - 'package.json': JSON.stringify({ - name: 'projectA', - main: 'main.js', - }), - node_modules: { - depFoo: { - 'package.json': JSON.stringify({ - name: 'depFoo', - main: 'main.js', - }), - }, - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - projectB: { - SYMLINK: '/root/projectB', - }, - }, - }, - projectB: { - 'package.json': JSON.stringify({ - name: 'projectB', - main: 'main.js', - }), - node_modules: { - depBar: { - 'package.json': JSON.stringify({ - name: 'depBar', - main: 'main.js', - }), - }, - }, - }, - '@scoped': { - projectC: { - 'package.json': JSON.stringify({ - name: '@scoped/projectC', - main: 'main.js', - }), - }, - }, - }, - }); - - const symlinkedModules = findSymlinkedModules('/root/projectA', []); - expect(symlinkedModules).toEqual([ - '/root/@scoped/projectC', - '/root/projectB', - ]); - }); - - it('correctly finds module symlinks within other module symlinks', () => { - fs.__setMockFilesystem({ - root: { - projectA: { - 'package.json': JSON.stringify({ - name: 'projectA', - main: 'main.js', - }), - node_modules: { - depFoo: { - 'package.json': JSON.stringify({ - name: 'depFoo', - main: 'main.js', - }), - }, - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - projectB: { - SYMLINK: '/root/projectB', - }, - }, - }, - projectB: { - 'package.json': JSON.stringify({ - name: 'projectB', - main: 'main.js', - }), - node_modules: { - depBar: { - 'package.json': JSON.stringify({ - name: 'depBar', - main: 'main.js', - }), - }, - projectD: { - SYMLINK: '/root/projectD', - }, - }, - }, - '@scoped': { - projectC: { - 'package.json': JSON.stringify({ - name: '@scoped/projectC', - main: 'main.js', - }), - }, - }, - projectD: { - 'package.json': JSON.stringify({ - name: 'projectD', - main: 'main.js', - }), - }, - }, - }); - - const symlinkedModules = findSymlinkedModules('/root/projectA', []); - expect(symlinkedModules).toEqual([ - '/root/@scoped/projectC', - '/root/projectB', - '/root/projectD', - ]); - }); - - it('correctly handles duplicate symlink paths', () => { - // projectA -> - // -> projectC - // -> projectB -> projectC - // Final list should only contain projectC once - fs.__setMockFilesystem({ - root: { - projectA: { - 'package.json': JSON.stringify({ - name: 'projectA', - main: 'main.js', - }), - node_modules: { - depFoo: { - 'package.json': JSON.stringify({ - name: 'depFoo', - main: 'main.js', - }), - }, - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - projectB: { - SYMLINK: '/root/projectB', - }, - }, - }, - projectB: { - 'package.json': JSON.stringify({ - name: 'projectB', - main: 'main.js', - }), - node_modules: { - depBar: { - 'package.json': JSON.stringify({ - name: 'depBar', - main: 'main.js', - }), - }, - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - }, - }, - '@scoped': { - projectC: { - 'package.json': JSON.stringify({ - name: '@scoped/projectC', - main: 'main.js', - }), - }, - }, - }, - }); - - const symlinkedModules = findSymlinkedModules('/root/projectA', []); - expect(symlinkedModules).toEqual([ - '/root/@scoped/projectC', - '/root/projectB', - ]); - }); - - it('correctly handles symlink recursion', () => { - // projectA -> - // -> projectC -> projectD -> projectA - // -> projectB -> projectC -> projectA - // -> projectD -> projectC -> projectA - // Should not infinite loop, should not contain projectA - fs.__setMockFilesystem({ - root: { - projectA: { - 'package.json': JSON.stringify({ - name: 'projectA', - main: 'main.js', - }), - node_modules: { - depFoo: { - 'package.json': JSON.stringify({ - name: 'depFoo', - main: 'main.js', - }), - }, - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - projectB: { - SYMLINK: '/root/projectB', - }, - }, - }, - projectB: { - 'package.json': JSON.stringify({ - name: 'projectB', - main: 'main.js', - }), - node_modules: { - depBar: { - 'package.json': JSON.stringify({ - name: 'depBar', - main: 'main.js', - }), - }, - projectD: { - SYMLINK: '/root/projectD', - }, - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - }, - }, - '@scoped': { - projectC: { - 'package.json': JSON.stringify({ - name: '@scoped/projectC', - main: 'main.js', - }), - node_modules: { - projectA: { - SYMLINK: '/root/projectA', - }, - projectD: { - SYMLINK: '/root/projectD', - }, - projectE: { - SYMLINK: '/root/projectE', - }, - }, - }, - }, - projectD: { - 'package.json': JSON.stringify({ - name: 'projectD', - main: 'main.js', - }), - node_modules: { - '@scoped': { - projectC: { - SYMLINK: '/root/@scoped/projectC', - }, - }, - projectE: { - SYMLINK: '/root/projectE', - }, - }, - }, - projectE: { - 'package.json': JSON.stringify({ - name: 'projectD', - main: 'main.js', - }), - }, - }, - }); - - const symlinkedModules = findSymlinkedModules('/root/projectA'); - expect(symlinkedModules).toEqual([ - '/root/@scoped/projectC', - '/root/projectB', - '/root/projectD', - '/root/projectE', - ]); - }); -}); diff --git a/local-cli/util/assertRequiredOptions.js b/local-cli/util/assertRequiredOptions.js deleted file mode 100644 index 379ad1fc165b69..00000000000000 --- a/local-cli/util/assertRequiredOptions.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const {Option} = require('commander'); -const {camelCase} = require('lodash'); - -// Commander.js has a 2 years old open issue to support <...> syntax -// for options. Until that gets merged, we run the checks manually -// https://github.com/tj/commander.js/issues/230 -module.exports = function assertRequiredOptions(options, passedOptions) { - options.forEach(opt => { - const option = new Option(opt.command); - - if (!option.required) { - return; - } - - const name = camelCase(option.long); - - if (!passedOptions[name]) { - // Provide commander.js like error message - throw new Error(`error: option '${option.long}' missing`); - } - }); -}; diff --git a/local-cli/util/copyAndReplace.js b/local-cli/util/copyAndReplace.js deleted file mode 100644 index d0d4eb15a4a7fe..00000000000000 --- a/local-cli/util/copyAndReplace.js +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -// Binary files, don't process these (avoid decoding as utf8) -const binaryExtensions = ['.png', '.jar']; - -/** - * Copy a file to given destination, replacing parts of its contents. - * @param srcPath Path to a file to be copied. - * @param destPath Destination path. - * @param replacements: e.g. {'TextToBeReplaced': 'Replacement'} - * @param contentChangedCallback - * Used when upgrading projects. Based on if file contents would change - * when being replaced, allows the caller to specify whether the file - * should be replaced or not. - * If null, files will be overwritten. - * Function(path, 'identical' | 'changed' | 'new') => 'keep' | 'overwrite' - */ -function copyAndReplace( - srcPath, - destPath, - replacements, - contentChangedCallback, -) { - if (fs.lstatSync(srcPath).isDirectory()) { - if (!fs.existsSync(destPath)) { - fs.mkdirSync(destPath); - } - // Not recursive - return; - } - - const extension = path.extname(srcPath); - if (binaryExtensions.indexOf(extension) !== -1) { - // Binary file - let shouldOverwrite = 'overwrite'; - if (contentChangedCallback) { - const newContentBuffer = fs.readFileSync(srcPath); - let contentChanged = 'identical'; - try { - const origContentBuffer = fs.readFileSync(destPath); - if (Buffer.compare(origContentBuffer, newContentBuffer) !== 0) { - contentChanged = 'changed'; - } - } catch (err) { - if (err.code === 'ENOENT') { - contentChanged = 'new'; - } else { - throw err; - } - } - shouldOverwrite = contentChangedCallback(destPath, contentChanged); - } - if (shouldOverwrite === 'overwrite') { - copyBinaryFile(srcPath, destPath, err => { - if (err) { - throw err; - } - }); - } - } else { - // Text file - const srcPermissions = fs.statSync(srcPath).mode; - let content = fs.readFileSync(srcPath, 'utf8'); - Object.keys(replacements).forEach( - regex => - (content = content.replace( - new RegExp(regex, 'g'), - replacements[regex], - )), - ); - - let shouldOverwrite = 'overwrite'; - if (contentChangedCallback) { - // Check if contents changed and ask to overwrite - let contentChanged = 'identical'; - try { - const origContent = fs.readFileSync(destPath, 'utf8'); - if (content !== origContent) { - //console.log('Content changed: ' + destPath); - contentChanged = 'changed'; - } - } catch (err) { - if (err.code === 'ENOENT') { - contentChanged = 'new'; - } else { - throw err; - } - } - shouldOverwrite = contentChangedCallback(destPath, contentChanged); - } - if (shouldOverwrite === 'overwrite') { - fs.writeFileSync(destPath, content, { - encoding: 'utf8', - mode: srcPermissions, - }); - } - } -} - -/** - * Same as 'cp' on Unix. Don't do any replacements. - */ -function copyBinaryFile(srcPath, destPath, cb) { - let cbCalled = false; - const srcPermissions = fs.statSync(srcPath).mode; - const readStream = fs.createReadStream(srcPath); - readStream.on('error', function(err) { - done(err); - }); - const writeStream = fs.createWriteStream(destPath, { - mode: srcPermissions, - }); - writeStream.on('error', function(err) { - done(err); - }); - writeStream.on('close', function(ex) { - done(); - }); - readStream.pipe(writeStream); - function done(err) { - if (!cbCalled) { - cb(err); - cbCalled = true; - } - } -} - -module.exports = copyAndReplace; diff --git a/local-cli/util/findReactNativeScripts.js b/local-cli/util/findReactNativeScripts.js deleted file mode 100644 index 5d43e29482d213..00000000000000 --- a/local-cli/util/findReactNativeScripts.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -'use strict'; - -const path = require('path'); -const fs = require('fs'); - -function findReactNativeScripts(): ?string { - const executablePath = path.resolve( - 'node_modules', - '.bin', - 'react-native-scripts', - ); - if (fs.existsSync(executablePath)) { - return executablePath; - } - return null; -} - -module.exports = findReactNativeScripts; diff --git a/local-cli/util/findSymlinkedModules.js b/local-cli/util/findSymlinkedModules.js deleted file mode 100644 index d7e5d30f447353..00000000000000 --- a/local-cli/util/findSymlinkedModules.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - * @flow strict - */ - -const path = require('path'); -const fs = require('fs'); - -/** - * Find symlinked modules inside "node_modules." - * - * Naively, we could just perform a depth-first search of all folders in - * node_modules, recursing when we find a symlink. - * - * We can be smarter than this due to our knowledge of how npm/Yarn lays out - * "node_modules" / how tools that build on top of npm/Yarn (such as Lerna) - * install dependencies. - * - * Starting from a given root node_modules folder, this algorithm will look at - * both the top level descendants of the node_modules folder or second level - * descendants of folders that start with "@" (which indicates a scoped - * package). If any of those folders is a symlink, it will recurse into the - * link, and perform the same search in the linked folder. - * - * The end result should be a list of all resolved module symlinks for a given - * root. - */ -module.exports = function findSymlinkedModules( - projectRoot: string, - ignoredRoots?: Array = [], -) { - const timeStart = Date.now(); - const nodeModuleRoot = path.join(projectRoot, 'node_modules'); - const resolvedSymlinks = findModuleSymlinks(nodeModuleRoot, [ - ...ignoredRoots, - projectRoot, - ]); - const timeEnd = Date.now(); - - console.log( - `Scanning folders for symlinks in ${nodeModuleRoot} (${timeEnd - - timeStart}ms)`, - ); - - return resolvedSymlinks; -}; - -function findModuleSymlinks( - modulesPath: string, - ignoredPaths: Array = [], -): Array { - if (!fs.existsSync(modulesPath)) { - return []; - } - - // Find module symlinks - const moduleFolders = fs.readdirSync(modulesPath); - const symlinks = moduleFolders.reduce((links, folderName) => { - const folderPath = path.join(modulesPath, folderName); - const maybeSymlinkPaths = []; - if (folderName.startsWith('@')) { - const scopedModuleFolders = fs.readdirSync(folderPath); - maybeSymlinkPaths.push( - ...scopedModuleFolders.map(name => path.join(folderPath, name)), - ); - } else { - maybeSymlinkPaths.push(folderPath); - } - return links.concat(resolveSymlinkPaths(maybeSymlinkPaths, ignoredPaths)); - }, []); - - // For any symlinks found, look in _that_ modules node_modules directory - // and find any symlinked modules - const nestedSymlinks = symlinks.reduce( - (links, symlinkPath) => - links.concat( - // We ignore any found symlinks or anything from the ignored list, - // to prevent infinite recursion - findModuleSymlinks(path.join(symlinkPath, 'node_modules'), [ - ...ignoredPaths, - ...symlinks, - ]), - ), - [], - ); - - return [...new Set([...symlinks, ...nestedSymlinks])]; -} - -function resolveSymlinkPaths(maybeSymlinkPaths, ignoredPaths) { - return maybeSymlinkPaths.reduce((links, maybeSymlinkPath) => { - if (fs.lstatSync(maybeSymlinkPath).isSymbolicLink()) { - const resolved = path.resolve( - path.dirname(maybeSymlinkPath), - fs.readlinkSync(maybeSymlinkPath), - ); - if (ignoredPaths.indexOf(resolved) === -1 && fs.existsSync(resolved)) { - links.push(resolved); - } - } - return links; - }, []); -} diff --git a/local-cli/util/findSymlinksPaths.js b/local-cli/util/findSymlinksPaths.js deleted file mode 100644 index 5efa20e886b410..00000000000000 --- a/local-cli/util/findSymlinksPaths.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const path = require('path'); -const fs = require('fs'); - -/** - * Find and resolve symlinks in `lookupFolder`. - * Ignore any descendants of the paths in `ignoredRoots`. - */ -module.exports = function findSymlinksPaths(lookupFolder, ignoredRoots) { - const timeStart = Date.now(); - const folders = fs.readdirSync(lookupFolder); - - const resolvedSymlinks = []; - folders.forEach(folder => { - const visited = []; - - let symlink = path.resolve(lookupFolder, folder); - while (fs.lstatSync(symlink).isSymbolicLink()) { - const index = visited.indexOf(symlink); - if (index !== -1) { - throw Error( - 'Infinite symlink recursion detected:\n ' + - visited.slice(index).join('\n '), - ); - } - - visited.push(symlink); - symlink = path.resolve(path.dirname(symlink), fs.readlinkSync(symlink)); - } - - if (visited.length && !rootExists(ignoredRoots, symlink)) { - resolvedSymlinks.push(symlink); - } - }); - - const timeEnd = Date.now(); - console.log( - `Scanning ${ - folders.length - } folders for symlinks in ${lookupFolder} (${timeEnd - timeStart}ms)`, - ); - - return resolvedSymlinks; -}; - -function rootExists(roots, child) { - return roots.some(root => isDescendant(root, child)); -} - -function isDescendant(root, child) { - return root === child || child.startsWith(root + path.sep); -} diff --git a/local-cli/util/isPackagerRunning.js b/local-cli/util/isPackagerRunning.js deleted file mode 100644 index f8c33e584c5fae..00000000000000 --- a/local-cli/util/isPackagerRunning.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fetch = require('node-fetch'); - -/** - * Indicates whether or not the packager is running. It returns a promise that - * when fulfilled can returns one out of these possible values: - * - `running`: the packager is running - * - `not_running`: the packager nor any process is running on the expected - * port. - * - `unrecognized`: one other process is running on the port we expect the - * packager to be running. - */ -function isPackagerRunning(packagerPort = process.env.RCT_METRO_PORT || 8081) { - return fetch(`http://localhost:${packagerPort}/status`).then( - res => - res - .text() - .then( - body => - body === 'packager-status:running' ? 'running' : 'unrecognized', - ), - () => 'not_running', - ); -} - -module.exports = isPackagerRunning; diff --git a/local-cli/util/isValidPackageName.js b/local-cli/util/isValidPackageName.js deleted file mode 100644 index 45a02319cea5c2..00000000000000 --- a/local-cli/util/isValidPackageName.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -function isValidPackageName(name) { - return name.match(/^[$A-Z_][0-9A-Z_$]*$/i); -} - -module.exports = isValidPackageName; diff --git a/local-cli/util/log.js b/local-cli/util/log.js deleted file mode 100644 index e74d74f18a0973..00000000000000 --- a/local-cli/util/log.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -var _enabled = true; - -function disable() { - _enabled = false; -} - -function log(stream, module) { - return function() { - if (!_enabled) { - return; - } - const message = Array.prototype.slice.call(arguments).join(' '); - stream.write(module + ': ' + message + '\n'); - }; -} - -module.exports.out = log.bind(null, process.stdout); -module.exports.err = log.bind(null, process.stderr); -module.exports.disable = disable; diff --git a/local-cli/util/parseCommandLine.js b/local-cli/util/parseCommandLine.js deleted file mode 100644 index e0d58308a12a4a..00000000000000 --- a/local-cli/util/parseCommandLine.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * Wrapper on-top of `optimist` in order to properly support boolean flags - * and have a slightly less awkward API. - * - * Usage example: - * var argv = parseCommandLine([{ - * command: 'web', - * description: 'Run in a web browser instead of iOS', - * default: true - * }]) - * - * NOTE: This file is used internally at Facebook and not in `local-cli` itself. - * No changes should be made to this file without prior discussion with FB team. - * - * @format - */ - -'use strict'; - -var optimistModule = require('optimist'); - -function parseCommandLine(config, args) { - var optimist = new optimistModule(); - args = args || process.argv; - // optimist default API requires you to write the command name three time - // This is a small wrapper to accept an object instead - for (var i = 0; i < config.length; ++i) { - if (config[i].type === 'string') { - optimist.string(config[i].command); - } else { - optimist.boolean(config[i].command); - } - - optimist - .default(config[i].command, config[i].default) - .describe(config[i].command, config[i].description); - - if (config[i].required) { - optimist.demand(config[i].command); - } - } - var argv = optimist.parse(args); - - // optimist doesn't have support for --dev=false, instead it returns 'false' - for (var i = 0; i < config.length; ++i) { - var command = config[i].command; - if (argv[command] === undefined) { - argv[command] = config[i].default; - } - if (argv[command] === 'true') { - argv[command] = true; - } - if (argv[command] === 'false') { - argv[command] = false; - } - if (config[i].type === 'string') { - // According to https://github.com/substack/node-optimist#numbers, - // every argument that looks like a number should be converted to one. - var strValue = argv[command]; - var numValue = strValue ? Number(strValue) : undefined; - if (typeof numValue === 'number' && !isNaN(numValue)) { - argv[command] = numValue; - } - } - } - - // Show --help - if (argv.help || argv.h) { - optimist.showHelp(); - process.exit(); - } - - return argv; -} - -module.exports = parseCommandLine; diff --git a/local-cli/util/walk.js b/local-cli/util/walk.js deleted file mode 100644 index b7658dbb874211..00000000000000 --- a/local-cli/util/walk.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const fs = require('fs'); -const path = require('path'); - -function walk(current) { - if (!fs.lstatSync(current).isDirectory()) { - return [current]; - } - - const files = fs.readdirSync(current).map(child => { - child = path.join(current, child); - return walk(child); - }); - return [].concat.apply([current], files); -} - -module.exports = walk; diff --git a/local-cli/util/yarn.js b/local-cli/util/yarn.js deleted file mode 100644 index b5f73bee629017..00000000000000 --- a/local-cli/util/yarn.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const execSync = require('child_process').execSync; -const fs = require('fs'); -const path = require('path'); -const semver = require('semver'); - -/** - * Use Yarn if available, it's much faster than the npm client. - * Return the version of yarn installed on the system, null if yarn is not available. - */ -function getYarnVersionIfAvailable() { - let yarnVersion; - try { - // execSync returns a Buffer -> convert to string - yarnVersion = ( - execSync('yarn --version', { - stdio: [0, 'pipe', 'ignore'], - }).toString() || '' - ).trim(); - } catch (error) { - return null; - } - // yarn < 0.16 has a 'missing manifest' bug - try { - if (semver.gte(yarnVersion, '0.16.0')) { - return yarnVersion; - } else { - return null; - } - } catch (error) { - console.error('Cannot parse yarn version: ' + yarnVersion); - return null; - } -} - -/** - * Check that 'react-native init' itself used yarn to install React Native. - * When using an old global react-native-cli@1.0.0 (or older), we don't want - * to install React Native with npm, and React + Jest with yarn. - * Let's be safe and not mix yarn and npm in a single project. - * @param projectDir e.g. /Users/martin/AwesomeApp - */ -function isGlobalCliUsingYarn(projectDir) { - return fs.existsSync(path.join(projectDir, 'yarn.lock')); -} - -module.exports = { - getYarnVersionIfAvailable: getYarnVersionIfAvailable, - isGlobalCliUsingYarn: isGlobalCliUsingYarn, -}; diff --git a/package.json b/package.json index 6d46a647719635..c355cc5200980e 100644 --- a/package.json +++ b/package.json @@ -191,6 +191,7 @@ "prop-types": "^15.5.8", "react-clone-referenced-element": "^1.0.1", "react-devtools-core": "^3.4.0", + "react-native-local-cli": "^0.57.0", "regenerator-runtime": "^0.11.0", "rimraf": "^2.5.4", "semver": "^5.0.3", From bf361777493b19d324f34732d70825b8177be540 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Tue, 6 Nov 2018 15:04:32 +0100 Subject: [PATCH 02/10] Return CLI for global CLI --- local-cli/cli.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/local-cli/cli.js b/local-cli/cli.js index c2f05e0d1d82fb..ae7a1fe191cc36 100644 --- a/local-cli/cli.js +++ b/local-cli/cli.js @@ -9,4 +9,8 @@ var cli = require('react-native-local-cli'); -cli.run(); +if (require.main === module) { + cli.run(); +} + +module.exports = cli; From ecb6d9863c4c48347c2da981073717c9a27cf743 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Wed, 7 Nov 2018 14:56:16 +0100 Subject: [PATCH 03/10] Fix tests - transform new location of CLI --- jest/preprocessor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jest/preprocessor.js b/jest/preprocessor.js index 320c8bb764c362..9964760e8e38e8 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -25,7 +25,7 @@ const generate = require('@babel/generator').default; const nodeFiles = new RegExp( [ - '/local-cli/', + '/react-native-local-cli/', // cli '/metro(?:-[^/]*)?/', // metro, metro-core, metro-source-map, metro-etc ].join('|'), ); From 47e065810b28fef0a4cf8867ba9ed2417bb2d105 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Wed, 7 Nov 2018 14:57:07 +0100 Subject: [PATCH 04/10] Move bin property to react-native-local-cli --- local-cli/wrong-react-native.js | 44 --------------------------------- package.json | 3 --- 2 files changed, 47 deletions(-) delete mode 100755 local-cli/wrong-react-native.js diff --git a/local-cli/wrong-react-native.js b/local-cli/wrong-react-native.js deleted file mode 100755 index 9f7790784fa61b..00000000000000 --- a/local-cli/wrong-react-native.js +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env node - -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -const isWindows = process.platform === 'win32'; - -var installedGlobally; -if (isWindows) { - const fs = require('fs'); - const path = require('path'); - // On Windows, assume we are installed globally if we can't find a package.json above node_modules. - installedGlobally = !fs.existsSync( - path.join(__dirname, '../../../package.json'), - ); -} else { - // On non-windows, assume we are installed globally if we are called from outside of the node_mobules/.bin/react-native executable. - var script = process.argv[1]; - installedGlobally = script.indexOf('node_modules/.bin/react-native') === -1; -} - -if (installedGlobally) { - const chalk = require('chalk'); - - console.error( - [ - chalk.red( - 'Looks like you installed react-native globally, maybe you meant react-native-cli?', - ), - chalk.red('To fix the issue, run:'), - 'npm uninstall -g react-native', - 'npm install -g react-native-cli', - ].join('\n'), - ); - process.exit(1); -} else { - require('./cli').run(); -} diff --git a/package.json b/package.json index c355cc5200980e..c9ab6b44e711b0 100644 --- a/package.json +++ b/package.json @@ -142,9 +142,6 @@ "build-ios-e2e": "detox build -c ios.sim.release", "test-ios-e2e": "detox test -c ios.sim.release --cleanup" }, - "bin": { - "react-native": "local-cli/wrong-react-native.js" - }, "peerDependencies": { "react": "16.6.0-alpha.8af6728" }, From 586f54f6849fe7174dd19c9d3b590d89ca1fef35 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Wed, 7 Nov 2018 15:28:49 +0100 Subject: [PATCH 05/10] Fix Jest tests - move assetPathUtils from CLI to here, RN should not require its files --- Libraries/Image/AssetSourceResolver.js | 2 +- Libraries/Image/assetPathUtils.js | 85 ++ jest/preprocessor.js | 1 - package.json | 1 - setupBabel.js | 27 - yarn.lock | 1115 +++++------------------- 6 files changed, 292 insertions(+), 939 deletions(-) create mode 100644 Libraries/Image/assetPathUtils.js delete mode 100644 setupBabel.js diff --git a/Libraries/Image/AssetSourceResolver.js b/Libraries/Image/AssetSourceResolver.js index e441803d0a7cb1..b6051790db429b 100644 --- a/Libraries/Image/AssetSourceResolver.js +++ b/Libraries/Image/AssetSourceResolver.js @@ -22,7 +22,7 @@ import type {PackagerAsset} from 'AssetRegistry'; const PixelRatio = require('PixelRatio'); const Platform = require('Platform'); -const assetPathUtils = require('react-native-local-cli/bundle/assetPathUtils'); +const assetPathUtils = require('./assetPathUtils'); const invariant = require('fbjs/lib/invariant'); /** diff --git a/Libraries/Image/assetPathUtils.js b/Libraries/Image/assetPathUtils.js new file mode 100644 index 00000000000000..0b49343518d620 --- /dev/null +++ b/Libraries/Image/assetPathUtils.js @@ -0,0 +1,85 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow strict + */ + +'use strict'; + +import type {PackagerAsset} from './AssetRegistry'; + +/** + * FIXME: using number to represent discrete scale numbers is fragile in essence because of + * floating point numbers imprecision. + */ +function getAndroidAssetSuffix(scale: number): string { + switch (scale) { + case 0.75: + return 'ldpi'; + case 1: + return 'mdpi'; + case 1.5: + return 'hdpi'; + case 2: + return 'xhdpi'; + case 3: + return 'xxhdpi'; + case 4: + return 'xxxhdpi'; + } + throw new Error('no such scale'); +} + +// See https://developer.android.com/guide/topics/resources/drawable-resource.html +const drawableFileTypes = new Set([ + 'gif', + 'jpeg', + 'jpg', + 'png', + 'svg', + 'webp', + 'xml', +]); + +function getAndroidResourceFolderName(asset: PackagerAsset, scale: number) { + if (!drawableFileTypes.has(asset.type)) { + return 'raw'; + } + var suffix = getAndroidAssetSuffix(scale); + if (!suffix) { + throw new Error( + "Don't know which android drawable suffix to use for asset: " + + JSON.stringify(asset), + ); + } + const androidFolder = 'drawable-' + suffix; + return androidFolder; +} + +function getAndroidResourceIdentifier(asset: PackagerAsset) { + var folderPath = getBasePath(asset); + return (folderPath + '/' + asset.name) + .toLowerCase() + .replace(/\//g, '_') // Encode folder structure in file name + .replace(/([^a-z0-9_])/g, '') // Remove illegal chars + .replace(/^assets_/, ''); // Remove "assets_" prefix +} + +function getBasePath(asset: PackagerAsset) { + var basePath = asset.httpServerLocation; + if (basePath[0] === '/') { + basePath = basePath.substr(1); + } + return basePath; +} + +module.exports = { + getAndroidAssetSuffix: getAndroidAssetSuffix, + getAndroidResourceFolderName: getAndroidResourceFolderName, + getAndroidResourceIdentifier: getAndroidResourceIdentifier, + getBasePath: getBasePath, +}; diff --git a/jest/preprocessor.js b/jest/preprocessor.js index 9964760e8e38e8..fc42bce6599d3a 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -25,7 +25,6 @@ const generate = require('@babel/generator').default; const nodeFiles = new RegExp( [ - '/react-native-local-cli/', // cli '/metro(?:-[^/]*)?/', // metro, metro-core, metro-source-map, metro-etc ].join('|'), ); diff --git a/package.json b/package.json index c9ab6b44e711b0..cb144075ee181b 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "testPathIgnorePatterns": [ "Libraries/Renderer", "/node_modules/", - "local-cli/templates/", "RNTester/e2e" ], "haste": { diff --git a/setupBabel.js b/setupBabel.js deleted file mode 100644 index f047a7e442fb80..00000000000000 --- a/setupBabel.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -'use strict'; - -const babelRegisterOnly = require('metro-babel-register'); - -const BABEL_ENABLED_PATHS = ['local-cli']; - -/** - * Centralized place to register all the directories that need a Babel - * transformation before being fed to Node.js. Notably, this is necessary to - * support Flow type annotations. - */ -function setupBabel() { - babelRegisterOnly( - babelRegisterOnly.buildRegExps(__dirname, BABEL_ENABLED_PATHS), - ); -} - -module.exports = setupBabel; diff --git a/yarn.lock b/yarn.lock index 232d8f9de1e0f1..11d70226237fa8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,14 +5,12 @@ "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" "@babel/core@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.0.tgz#08958f1371179f62df6966d8a614003d11faeb04" - integrity sha512-9EWmD0cQAbcXSc+31RIoYgEHx3KQ2CCSMDBhnXrShWvo45TMw+3/55KVxlhkG53kw9tl87DqINgHDgFVhZJV/Q== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.0.0" @@ -32,7 +30,6 @@ "@babel/generator@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" - integrity sha512-/BM2vupkpbZXq22l1ALO7MqXJZH2k8bKVv8Y+pABFnzWdztDB/ZLveP5At21vLz5c2YtSE6p7j2FZEsqafMz5Q== dependencies: "@babel/types" "^7.0.0" jsesc "^2.5.1" @@ -43,14 +40,12 @@ "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== dependencies: "@babel/types" "^7.0.0" "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== dependencies: "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" @@ -58,7 +53,6 @@ "@babel/helper-builder-react-jsx@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" - integrity sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw== dependencies: "@babel/types" "^7.0.0" esutils "^2.0.0" @@ -66,7 +60,6 @@ "@babel/helper-call-delegate@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" - integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== dependencies: "@babel/helper-hoist-variables" "^7.0.0" "@babel/traverse" "^7.1.0" @@ -75,7 +68,6 @@ "@babel/helper-define-map@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" - integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/types" "^7.0.0" @@ -84,7 +76,6 @@ "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== dependencies: "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" @@ -92,7 +83,6 @@ "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== dependencies: "@babel/helper-get-function-arity" "^7.0.0" "@babel/template" "^7.1.0" @@ -101,35 +91,30 @@ "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== dependencies: "@babel/types" "^7.0.0" "@babel/helper-hoist-variables@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== dependencies: "@babel/types" "^7.0.0" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== dependencies: "@babel/types" "^7.0.0" "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== dependencies: "@babel/types" "^7.0.0" "@babel/helper-module-transforms@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" - integrity sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" @@ -141,26 +126,22 @@ "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== dependencies: "@babel/types" "^7.0.0" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== "@babel/helper-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" - integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== dependencies: lodash "^4.17.10" "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-wrap-function" "^7.1.0" @@ -171,7 +152,6 @@ "@babel/helper-replace-supers@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" - integrity sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" @@ -181,7 +161,6 @@ "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== dependencies: "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" @@ -189,14 +168,12 @@ "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: "@babel/types" "^7.0.0" "@babel/helper-wrap-function@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" - integrity sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/template" "^7.1.0" @@ -206,7 +183,6 @@ "@babel/helpers@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.0.tgz#429bf0f0020be56a4242883432084e3d70a8a141" - integrity sha512-V1jXUTNdTpBn37wqqN73U+eBpzlLHmxA4aDaghJBggmzly/FpIJMHXse9lgdzQQT4gs5jZ5NmYxOL8G3ROc29g== dependencies: "@babel/template" "^7.1.0" "@babel/traverse" "^7.1.0" @@ -215,7 +191,6 @@ "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -224,24 +199,20 @@ "@babel/parser@^7.0.0", "@babel/parser@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" - integrity sha512-SmjnXCuPAlai75AFtzv+KCBcJ3sDDWbIn+WytKw1k+wAtEy6phqI2RqKh/zAnw53i1NR8su3Ep/UoqaKcimuLg== "@babel/plugin-check-constants@^7.0.0-beta.38": version "7.0.0-beta.38" resolved "https://registry.yarnpkg.com/@babel/plugin-check-constants/-/plugin-check-constants-7.0.0-beta.38.tgz#bbda6306d45a4f097ccb416c0b52d6503f6502cf" - integrity sha512-MjdGn/2sMLu0fnNFbkILut0OsegzRTeCOJ/uGHH88TwTXPzxONx2cTVJ36i3cTQXHMiIOUT3hX6HqzWM99Q6vA== "@babel/plugin-external-helpers@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.0.0.tgz#61ee7ba5dba27d7cad72a13d46bec23c060b762e" - integrity sha512-tZKTMdhZvTy0KCEX5EGQQm1RHr7jUa36q/yax1baEA0yZapVYmu10yW7LTqijITgSq416gPVjrcexiA6y4pJlA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-class-properties@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz#9af01856b1241db60ec8838d84691aa0bd1e8df4" - integrity sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.0.0" @@ -253,7 +224,6 @@ "@babel/plugin-proposal-export-default-from@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.0.0.tgz#a057bbfd4649facfe39f33a537e18554bdd2b5da" - integrity sha512-cWhkx6SyjZ4caFOanoPmDNgQCuYYTmou4QXy886JsyLTw/vhWQbop2gLKsWyyswrJkKTB7fSNxVYbP/oEsoySA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-export-default-from" "^7.0.0" @@ -261,7 +231,6 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.0.0.tgz#b72ec31adf612d062dc0348316246127a451e45f" - integrity sha512-QIN3UFo1ul4ruAsjIqK43PeXedo1qY74zeGrODJl1KfCGeMc6qJC4rb5Ylml/smzxibqsDeVZGH+TmWHCldRQQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" @@ -269,7 +238,6 @@ "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" - integrity sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0" @@ -277,7 +245,6 @@ "@babel/plugin-proposal-optional-catch-binding@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" - integrity sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" @@ -285,7 +252,6 @@ "@babel/plugin-proposal-optional-chaining@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.0.0.tgz#3d344d4152253379b8758e7d041148e8787c4a9d" - integrity sha512-7x8HLa71OzNiofbQUVakS0Kmg++6a+cXNfS7QKHbbv03SuSaumJyaWsfNgw+T7aqrJlqurYpZqrkPgXu0iZK0w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" @@ -293,84 +259,72 @@ "@babel/plugin-syntax-class-properties@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" - integrity sha512-cR12g0Qzn4sgkjrbrzWy2GE7m9vMl/sFkqZ3gIpAQdrvPDnLM8180i+ANDFIXfjHo9aqp0ccJlQ0QNZcFUbf9w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-dynamic-import@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz#6dfb7d8b6c3be14ce952962f658f3b7eb54c33ee" - integrity sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-export-default-from@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.0.0.tgz#084b639bce3d42f3c5bf3f68ccb42220bb2d729d" - integrity sha512-HNnjg/fFFbnuLAqr/Ocp1Y3GB4AjmXcu1xxn3ql3bS2kGrB/qi+Povshb8i3hOkE5jNozzh8r/0/lq1w8oOWbQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" - integrity sha512-zGcuZWiWWDa5qTZ6iAnpG0fnX/GOu49pGR5PFvkQ9GmKNaSphXQnlNXh/LG20sqWtNrx/eB6krzfEzcwvUyeFA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" - integrity sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.0.0.tgz#b60931d5a15da82625fff6657c39419969598743" - integrity sha512-oAJmMsAvTSIk9y0sZdU2S/nY44PEUuHN7EzNDMgbuR4e/OwyfR9lSmoBJBZ2lslFZIqhksrTt4i+av7uKfNYDw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" - integrity sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" - integrity sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.0.0.tgz#1e6ecba124310b5d3a8fc1e00d50b1c4c2e05e68" - integrity sha512-QXedQsZf8yua1nNrXSePT0TsGSQH9A1iK08m9dhCMdZeJaaxYcQfXdgHWVV6Cp7WE/afPVvSKIsAHK5wP+yxDA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.0.0.tgz#90f4fe0a741ae9c0dcdc3017717c05a0cbbd5158" - integrity sha512-5fxmdqiAQVQTIS+KSvYeZuTt91wKtBTYi6JlIkvbQ6hmO+9fZE81ezxmMiFMIsxE7CdRSgzn7nQ1BChcvK9OpA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-arrow-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" - integrity sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-async-to-generator@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" - integrity sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -379,14 +333,12 @@ "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" - integrity sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-block-scoping@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" - integrity sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.10" @@ -394,7 +346,6 @@ "@babel/plugin-transform-classes@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" - integrity sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-define-map" "^7.1.0" @@ -408,21 +359,18 @@ "@babel/plugin-transform-computed-properties@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" - integrity sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-destructuring@^7.0.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.2.tgz#5fa77d473f5a0a3f5266ad7ce2e8c995a164d60a" - integrity sha512-cvToXvp/OsYxtEn57XJu9BvsGSEYjAh9UeUuXpoi7x6QHB7YdWyQ4lRU/q0Fu1IJNT0o0u4FQ1DMQBzJ8/8vZg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-exponentiation-operator@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" - integrity sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -430,7 +378,6 @@ "@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0.tgz#c40ced34c2783985d90d9f9ac77a13e6fb396a01" - integrity sha512-WhXUNb4It5a19RsgKKbQPrjmy4yWOY1KynpEbNw7bnd1QTcrT/EIl3MJvnGgpgvrKyKbqX7nUNOJfkpLOnoDKA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-flow" "^7.0.0" @@ -438,14 +385,12 @@ "@babel/plugin-transform-for-of@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" - integrity sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-function-name@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" - integrity sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -453,21 +398,18 @@ "@babel/plugin-transform-literals@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" - integrity sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-member-expression-literals@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.0.0.tgz#96a265bf61a9ed6f75c39db0c30d41ef7aabf072" - integrity sha512-kgAGWcjVdflNPSaRb9rDPdGJ9/gF80VPmxx80gdKz6NSofHvxA2LofECQ+7GrDVzzH8zBJzTn1xlV4xnmWj/nw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-commonjs@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" - integrity sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -476,14 +418,12 @@ "@babel/plugin-transform-object-assign@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.0.0.tgz#fca6d7500d9675c42868b8f3882979201b9a5ad8" - integrity sha512-Dag8mxx7/03oj8F8PkNso8GEMhwGfeT0TL6KfMsa9Brjx4IpwZVl3WBvEmYks8BMhPmrvM5NQ/tjaMbwEj5ijA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-object-super@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" - integrity sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" @@ -491,7 +431,6 @@ "@babel/plugin-transform-parameters@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" - integrity sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw== dependencies: "@babel/helper-call-delegate" "^7.1.0" "@babel/helper-get-function-arity" "^7.0.0" @@ -500,21 +439,18 @@ "@babel/plugin-transform-property-literals@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.0.0.tgz#0b95a91dbd1f0be5b5a99ed86571ef5b5ae77009" - integrity sha512-7HK6/jB4MLpwQUJQ3diaX0pbCRcoL9asJscQfU3D1HpDwYdrH6yAUKleUNFHFyGNYBI9UeJrS2Jpx2JhtPKu5g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-display-name@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz#93759e6c023782e52c2da3b75eca60d4f10533ee" - integrity sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-jsx-source@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz#28e00584f9598c0dd279f6280eee213fa0121c3c" - integrity sha512-OSeEpFJEH5dw/TtxTg4nijl4nHBbhqbKL94Xo/Y17WKIf2qJWeIk/QeXACF19lG1vMezkxqruwnTjVizaW7u7w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.0.0" @@ -522,7 +458,6 @@ "@babel/plugin-transform-react-jsx@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" - integrity sha512-0TMP21hXsSUjIQJmu/r7RiVxeFrXRcMUigbKu0BLegJK9PkYodHstaszcig7zxXfaBji2LYUdtqIkHs+hgYkJQ== dependencies: "@babel/helper-builder-react-jsx" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -531,14 +466,12 @@ "@babel/plugin-transform-regenerator@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" - integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== dependencies: regenerator-transform "^0.13.3" "@babel/plugin-transform-runtime@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz#9f76920d42551bb577e2dc594df229b5f7624b63" - integrity sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -548,21 +481,18 @@ "@babel/plugin-transform-shorthand-properties@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" - integrity sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-spread@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" - integrity sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-sticky-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" - integrity sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -570,7 +500,6 @@ "@babel/plugin-transform-template-literals@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" - integrity sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -578,7 +507,6 @@ "@babel/plugin-transform-typescript@^7.0.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.1.0.tgz#81e7b4be90e7317cbd04bf1163ebf06b2adee60b" - integrity sha512-TOTtVeT+fekAesiCHnPz+PSkYSdOSLyLn42DI45nxg6iCdlQY6LIj/tYqpMB0y+YicoTUiYiXqF8rG6SKfhw6Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.0.0" @@ -586,7 +514,6 @@ "@babel/plugin-transform-unicode-regex@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" - integrity sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" @@ -595,7 +522,6 @@ "@babel/register@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" - integrity sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g== dependencies: core-js "^2.5.7" find-cache-dir "^1.0.0" @@ -608,14 +534,12 @@ "@babel/runtime@^7.0.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" - integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== dependencies: regenerator-runtime "^0.12.0" "@babel/template@^7.0.0", "@babel/template@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" - integrity sha512-yZ948B/pJrwWGY6VxG6XRFsVTee3IQ7bihq9zFpM00Vydu6z5Xwg0C3J644kxI9WOTzd+62xcIsQ+AT1MGhqhA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.1.0" @@ -624,7 +548,6 @@ "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" - integrity sha512-bwgln0FsMoxm3pLOgrrnGaXk18sSM9JNf1/nHC/FksmNGFbYnPWY4GYCfLxyP1KRmfsxqkRpfoa6xr6VuuSxdw== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.0.0" @@ -639,7 +562,6 @@ "@babel/types@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" - integrity sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q== dependencies: esutils "^2.0.2" lodash "^4.17.10" @@ -648,22 +570,18 @@ abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== absolute-path@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= accepts@~1.3.3, accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: mime-types "~2.1.18" negotiator "0.6.1" @@ -671,7 +589,6 @@ accepts@~1.3.3, accepts@~1.3.5: acorn-globals@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" - integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== dependencies: acorn "^6.0.1" acorn-walk "^6.0.1" @@ -679,34 +596,28 @@ acorn-globals@^4.1.0: acorn-jsx@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" - integrity sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw== dependencies: acorn "^5.0.3" acorn-walk@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.0.1.tgz#c7827bdbb8e21aa97b609adfa225400d9ae348ba" - integrity sha512-PqVQ8c6a3kyqdsUZlC7nljp3FFuxipBRHKu+7C1h8QygBFlzTaDX5HD383jej3Peed+1aDG8HwkfB1Z1HMNPkw== acorn@^5.0.3, acorn@^5.5.3, acorn@^5.6.0: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.1.tgz#66e6147e1027704479dc6d9b20d884c572db3cc1" - integrity sha512-SiwgrRuRD2D1R6qjwwoopKcCTkmmIWjy1M15Wv+Nk/7VUsBad4P8GOPft2t6coDZG0TuR5dq9o1v0g8wo7F6+A== ajv-keywords@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -716,7 +627,6 @@ ajv@^5.3.0: ajv@^6.0.1, ajv@^6.5.0: version "6.5.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -726,77 +636,64 @@ ajv@^6.0.1, ajv@^6.5.0: 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@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== 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.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== 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-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= ansi@^0.3.0, ansi@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" - integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE= 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" @@ -804,19 +701,16 @@ anymatch@^2.0.0: append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - integrity sha1-126/jKlNJ24keja61EpLdKthGZE= dependencies: default-require-extensions "^1.0.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -824,14 +718,12 @@ are-we-there-yet@~1.1.2: 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" 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" @@ -839,44 +731,36 @@ arr-diff@^1.0.1: arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" 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-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-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-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= array-includes@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= dependencies: define-properties "^1.1.2" es-abstract "^1.7.0" @@ -884,113 +768,92 @@ array-includes@^3.0.3: array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= array-reduce@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= 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-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: 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.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= 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= arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= art@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/art/-/art-0.10.3.tgz#b01d84a968ccce6208df55a733838c96caeeaea2" - integrity sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ== asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= 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= 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== async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@^2.1.4, async@^2.4.0, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: lodash "^4.17.10" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.1.1: 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.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 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" @@ -999,7 +862,6 @@ babel-code-frame@^6.26.0: babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -1024,7 +886,6 @@ babel-core@^6.0.0, babel-core@^6.26.0: babel-eslint@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" - integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.0.0" @@ -1036,7 +897,6 @@ babel-eslint@9.0.0: babel-generator@^6.18.0, babel-generator@^6.26.0: 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" @@ -1050,7 +910,6 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -1058,7 +917,6 @@ babel-helpers@^6.24.1: babel-jest@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.0.0-alpha.4.tgz#e03318023fb23c7646d4ffec97cec8b9034d5e5c" - integrity sha512-Z+KXWy+12w8h87l7G0muSDNh3XNclze3ohRpD0hqBypwZRUgX/755RYW6MpZhxSgHC1de3d9lUnYR016al0bfg== dependencies: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^24.0.0-alpha.4" @@ -1066,14 +924,12 @@ babel-jest@^24.0.0-alpha.4: babel-messages@^6.23.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-istanbul@^4.1.6: version "4.1.6" resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== dependencies: babel-plugin-syntax-object-rest-spread "^6.13.0" find-up "^2.1.0" @@ -1083,22 +939,18 @@ babel-plugin-istanbul@^4.1.6: babel-plugin-jest-hoist@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.0.0-alpha.4.tgz#4fcb1369b3814f98496153c86946916c22d0a0aa" - integrity sha512-7xF5AEQCJXqT4rRvIK/tUnAAa4OCk62yiemep61qNgyTlGJNeS/SC1CecPOkV0KEhRrVZOhwLScHXAUWxaYagg== babel-plugin-syntax-object-rest-spread@^6.13.0: version "6.13.0" resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== babel-preset-fbjs@^3.0.0, babel-preset-fbjs@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.0.1.tgz#0be99c39367d6fb5bbcf1f6c33be0321b5234c1c" - integrity sha512-Fc0t7v8T1tBwv5AVyDDZEnS3T7OQ97qV0XawVZg1ouarlM9xCHL994C5tU8TBIKPk3yZXG+SaEM1YQcx/yLlcg== dependencies: "@babel/plugin-check-constants" "^7.0.0-beta.38" "@babel/plugin-proposal-class-properties" "^7.0.0" @@ -1132,7 +984,6 @@ babel-preset-fbjs@^3.0.0, babel-preset-fbjs@^3.0.1: babel-preset-jest@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.0.0-alpha.4.tgz#2f704b57695d801d1622fb809355a426c5ff0556" - integrity sha512-4/TENlz9eSYPTFBWGsJ8Ezpoj77BkFtIJz2tT7EykfFbbh1OwPoc97+JcFWd0HUtOrKf7SYoT3DW2Adc7XveuA== dependencies: babel-plugin-jest-hoist "^24.0.0-alpha.4" babel-plugin-syntax-object-rest-spread "^6.13.0" @@ -1140,7 +991,6 @@ babel-preset-jest@^24.0.0-alpha.4: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -1153,7 +1003,6 @@ babel-register@^6.26.0: babel-runtime@^6.22.0, babel-runtime@^6.26.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" @@ -1161,7 +1010,6 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1172,7 +1020,6 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.0.0, babel-traverse@^6.18.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" @@ -1187,7 +1034,6 @@ babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: babel-types@^6.0.0, babel-types@^6.18.0, 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" @@ -1197,27 +1043,22 @@ babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.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== 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: version "1.1.2" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.1.2.tgz#d6400cac1c4c660976d90d07a04351d89395f5e8" - integrity sha1-1kAMrBxMZgl22Q0HoENR2JOV9eg= base64-js@^1.1.2, base64-js@^1.2.3: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== 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" @@ -1230,45 +1071,38 @@ base@^0.11.1: basic-auth@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" 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" big-integer@^1.6.7: version "1.6.36" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== bluebird@3.5.x: version "3.5.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" - integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== bplist-creator@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" - integrity sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU= dependencies: stream-buffers "~2.2.0" bplist-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" - integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= dependencies: big-integer "^1.6.7" 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" @@ -1276,7 +1110,6 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1285,7 +1118,6 @@ braces@^1.8.2: braces@^2.3.1: 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" @@ -1301,41 +1133,34 @@ braces@^2.3.1: browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 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== builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= bunyan-debug-stream@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/bunyan-debug-stream/-/bunyan-debug-stream-1.1.1.tgz#4740a00b7d5c2d9d1b714925ab0802516040813e" - integrity sha512-jJbQ1gXUL6vMmZVdbaTFK1v1sGa7axLrSQQwkB6HU9HCPTzsw2HsKcPHm1vgXZlEck/4IvEuRwg/9+083YelCg== dependencies: colors "^1.0.3" exception-formatter "^1.0.4" @@ -1343,7 +1168,6 @@ bunyan-debug-stream@^1.1.0: bunyan@^1.8.12: version "1.8.12" resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" - integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= optionalDependencies: dtrace-provider "~0.8" moment "^2.10.6" @@ -1353,12 +1177,10 @@ bunyan@^1.8.12: bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 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" @@ -1373,41 +1195,34 @@ cache-base@^1.0.1: caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= dependencies: rsvp "^3.3.3" caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1418,7 +1233,6 @@ chalk@^1.1.1, chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1427,12 +1241,10 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= child-process-promise@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" - integrity sha1-RzChHvYQ+tRQuPIjx50x172tgHQ= dependencies: cross-spawn "^4.0.2" node-version "^1.0.0" @@ -1441,22 +1253,18 @@ child-process-promise@^2.2.0: chownr@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== 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" @@ -1466,19 +1274,16 @@ class-utils@^0.3.5: cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 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" @@ -1487,7 +1292,6 @@ cliui@^3.2.0: cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -1496,17 +1300,14 @@ cliui@^4.0.0: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= 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-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" @@ -1514,75 +1315,62 @@ collection-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-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-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== colors@^1.0.3: version "1.3.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== combined-stream@1.0.6: version "1.0.6" resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= dependencies: delayed-stream "~1.0.0" combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" commander@^2.15.1, commander@^2.9.0: version "2.18.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" - integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== 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.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= compressible@~2.0.14: version "2.0.15" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" - integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw== dependencies: mime-db ">= 1.36.0 < 2" compression@^1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== dependencies: accepts "~1.3.5" bytes "3.0.0" @@ -1595,12 +1383,10 @@ compression@^1.7.1: 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" @@ -1610,7 +1396,6 @@ concat-stream@^1.6.0: connect@^3.6.5: version "3.6.6" resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" finalhandler "1.1.0" @@ -1620,39 +1405,32 @@ connect@^3.6.5: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== 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= core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.2.2, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" - integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== 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= cosmiconfig@^5.0.5: version "5.0.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" - integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" @@ -1661,7 +1439,6 @@ cosmiconfig@^5.0.5: create-react-class@^15.6.3: version "15.6.3" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" - integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== dependencies: fbjs "^0.8.9" loose-envify "^1.3.1" @@ -1670,7 +1447,6 @@ create-react-class@^15.6.3: cross-spawn@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -1678,7 +1454,6 @@ cross-spawn@^4.0.2: cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -1687,7 +1462,6 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: cross-spawn@^6.0.0, 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" @@ -1698,26 +1472,22 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" - integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== cssstyle@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" - integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== dependencies: cssom "0.3.x" 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" data-urls@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.1.tgz#d416ac3896918f29ca84d81085bc3705834da579" - integrity sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg== dependencies: abab "^2.0.0" whatwg-mimetype "^2.1.0" @@ -1726,76 +1496,64 @@ data-urls@^1.0.0: debug@2.6.9, debug@^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@^3.1.0: version "3.2.5" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" - integrity sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg== dependencies: ms "^2.1.1" decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== dependencies: xregexp "4.0.0" 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-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 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-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= dependencies: strip-bom "^2.0.0" define-properties@^1.1.2: 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" @@ -1803,7 +1561,6 @@ define-property@^2.0.2: del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -1816,49 +1573,40 @@ del@^2.0.2: 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= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 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-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= detox@9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/detox/-/detox-9.0.4.tgz#ff8deeb56464ca0a351b7f9123c86a52dc80d8ef" - integrity sha512-2dbMXA2BlJmtx2XWOwMHETsbwKdn9mjto9jrQ2djgmpt3+ulJhWmODmbKCKgtvNuDE5wlfjogvxfoPIv0rzinA== dependencies: bunyan "^1.8.12" bunyan-debug-stream "^1.1.0" @@ -1880,38 +1628,32 @@ detox@9.0.4: diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== doctrine@^2.0.2, doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" dtrace-provider@~0.8: version "0.8.7" resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.7.tgz#dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04" - integrity sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ= dependencies: nan "^2.10.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" @@ -1919,43 +1661,36 @@ ecc-jsbn@~0.1.1: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" envinfo@^5.7.0: version "5.10.0" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.10.0.tgz#503a9774ae15b93ea68bdfae2ccd6306624ea6df" - integrity sha512-rXbzXWvnQxy+TcqZlARbWVQwgGVVouVJgFZhLVN5htjLxl1thstrP2ZGi0pXC309AbK7gVOPU+ulz/tmpCI7iw== error-ex@^1.2.0, error-ex@^1.3.1: 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" errorhandler@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.0.tgz#eaba64ca5d542a311ac945f582defc336165d9f4" - integrity sha1-6rpkyl1UKjEayUX1gt78M2Fl2fQ= dependencies: accepts "~1.3.3" escape-html "~1.0.3" @@ -1963,7 +1698,6 @@ errorhandler@^1.5.0: es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -1974,7 +1708,6 @@ es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.7.0: es-to-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - integrity sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= dependencies: is-callable "^1.1.1" is-date-object "^1.0.1" @@ -1983,17 +1716,14 @@ es-to-primitive@^1.1.1: 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@^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.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2005,24 +1735,20 @@ escodegen@^1.9.1: eslint-config-fb-strict@22.1.0: version "22.1.0" resolved "https://registry.yarnpkg.com/eslint-config-fb-strict/-/eslint-config-fb-strict-22.1.0.tgz#6a81785d45748d6c753442772b84da0aca13c45f" - integrity sha512-UFJeCwl7Zg7s3d90PjedcNbjpMBzyojTiF9H6lEJMp/XU8oSlSDzk1UFOz41YqdG2BFyg5xsRbQngquJkTxrxg== dependencies: eslint-config-fbjs "^2.0.1" eslint-config-fbjs@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/eslint-config-fbjs/-/eslint-config-fbjs-2.0.1.tgz#395896fd740e0e28dc1c2072e3bc982e88247df5" - integrity sha512-nZ/JByixNK/8epeQqmrtNCYYMXCjHoPkJwHaHg4aZyZlS62YLttDSWYE6ISGl070V+o6dkFbDALceWaO3Po+Sw== eslint-config-fbjs@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-config-fbjs/-/eslint-config-fbjs-2.1.0.tgz#bfe4f8c2d2282bfe515359553905d830e3a5d12f" - integrity sha512-wh7Lveo51V3/SUydWtR2VEU8wNfSHt5V7YzIUKTRkHF3kvkCwFtM6Jgsn+xBNkjxZGpfWgNJN/drk1LLx64Dww== eslint-plugin-eslint-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.0.1.tgz#baafb713584c0de7ee588710720e580bcc28cfbb" - integrity sha512-7zU6gCulKVmfG3AZdnvDxzfHaGdvkA8tsLiKbneeI/TlVaulJsRzOyMCctH9QTobKVJ6LIsiJbrkSKkgcFLHxw== dependencies: escape-string-regexp "^1.0.5" ignore "^3.3.8" @@ -2030,19 +1756,16 @@ eslint-plugin-eslint-comments@^3.0.1: eslint-plugin-flowtype@2.43.0: version "2.43.0" resolved "http://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.43.0.tgz#47cdac5f01cda53f1c3e8477f0c83fee66a1606e" - integrity sha512-gFlHd3b6L28Mm8nbNoK6YtWgJ6STngf8GY3RA5DfeUYU3mRYJcHZ4c70bsBoERnCZy+nGHyus+aJ4jkimSnu5g== dependencies: lodash "^4.15.0" eslint-plugin-jest@21.8.0: version "21.8.0" resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.8.0.tgz#4f3155e2898c1efb0ce548f3e084e07db5e21c07" - integrity sha512-u8+tOrVHHAv9SetdzCghLaBrHyaBLx+6surC+A+VfLy7CfXixTvQnJmD/Ym8mDE6e7wPDZWWgsqb3FGAWh7NTw== eslint-plugin-prettier@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz#33e4e228bdb06142d03c560ce04ec23f6c767dd7" - integrity sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ== dependencies: fast-diff "^1.1.1" jest-docblock "^21.0.0" @@ -2050,19 +1773,16 @@ eslint-plugin-prettier@2.6.0: eslint-plugin-react-native-globals@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" - integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== eslint-plugin-react-native@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.5.0.tgz#78a5d6aadb11f85d1b114488d1fddfa2bf4fc1fb" - integrity sha512-L0qwiBQbG3MVMQk4XVCyyX+9nqJjr9YUmqpJ98Gb+uAmD+xlxT33rDL9ZBQgzMzBxDcUW6WiPcll8j9uXpyLyQ== dependencies: eslint-plugin-react-native-globals "^0.1.1" eslint-plugin-react@7.8.2: version "7.8.2" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.8.2.tgz#e95c9c47fece55d2303d1a67c9d01b930b88a51d" - integrity sha512-H3ne8ob4Bn6NXSN9N9twsn7t8dyHT5bF/ibQepxIHi6JiPIdC2gXlfYvZYucbdrWio4FxBq7Z4mSauQP+qmMkQ== dependencies: doctrine "^2.0.2" has "^1.0.1" @@ -2072,7 +1792,6 @@ eslint-plugin-react@7.8.2: eslint-scope@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2080,7 +1799,6 @@ eslint-scope@3.7.1: eslint-scope@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2088,17 +1806,14 @@ eslint-scope@^4.0.0: eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" - integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.1.0.tgz#2ed611f1ce163c0fb99e1e0cda5af8f662dff645" - integrity sha512-DyH6JsoA1KzA5+OSWFjg56DFJT+sDLO0yokaPZ9qY0UEmYrPA1gEX/G1MnVkmRDsksG4H1foIVz2ZXXM3hHYvw== dependencies: ajv "^6.5.0" babel-code-frame "^6.26.0" @@ -2143,7 +1858,6 @@ eslint@5.1.0: espree@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" - integrity sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg== dependencies: acorn "^5.6.0" acorn-jsx "^4.1.1" @@ -2151,70 +1865,58 @@ espree@^4.0.0: esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: 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: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= event-target-shim@^1.0.5: version "1.1.1" resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" - integrity sha1-qG5e5r2qFgVEddp5fM3fDFVphJE= eventemitter3@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" - integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== exception-formatter@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/exception-formatter/-/exception-formatter-1.0.7.tgz#3291616b86fceabefa97aee6a4708032c6e3b96d" - integrity sha512-zV45vEsjytJrwfGq6X9qd1Ll56cW4NC2mhCO6lqwMk4ZpA1fZ6C3UiaQM/X7if+7wZFmCgss3ahp9B/uVFuLRw== dependencies: colors "^1.0.3" exec-sh@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== dependencies: merge "^1.2.0" execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== dependencies: cross-spawn "^6.0.0" get-stream "^3.0.0" @@ -2227,7 +1929,6 @@ execa@^0.10.0: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2240,7 +1941,6 @@ execa@^0.7.0: execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: cross-spawn "^6.0.0" get-stream "^4.0.0" @@ -2253,19 +1953,16 @@ execa@^1.0.0: exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" 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" @@ -2278,14 +1975,12 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" expect@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/expect/-/expect-24.0.0-alpha.4.tgz#f7d05692668b40983d2affdcf600743a726c9c8d" - integrity sha512-7geaVKj1pxwgNuKXV1osvcCRWPZMrJeWMa5jv6kCJHLjtLwz3yUuGdfVUIL/3JSFVchG3h9nZpE7RNYiAFxpTw== dependencies: ansi-styles "^3.2.0" jest-diff "^24.0.0-alpha.4" @@ -2297,21 +1992,18 @@ expect@^24.0.0-alpha.4: 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" @@ -2319,12 +2011,10 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: 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@^2.0.4, external-editor@^2.1.0: version "2.2.0" resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -2333,14 +2023,12 @@ external-editor@^2.0.4, external-editor@^2.1.0: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" 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" @@ -2354,17 +2042,14 @@ extglob@^2.0.4: 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.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" - integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E= dependencies: ansi-gray "^0.1.1" color-support "^1.1.3" @@ -2373,44 +2058,36 @@ fancy-log@^1.3.2: fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-diff@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" - integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" fbjs-css-vars@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.1.tgz#836d876e887d702f45610f5ebd2fbeef649527fc" - integrity sha512-IM+v/C40MNZWqsLErc32e0TyIk/NhkkQZL0QmjBh6zi1eXv0/GeVKmKmueQX7nn9SXQBQbTUcB8zuexIF3/88w== fbjs-scripts@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.0.1.tgz#7d8d09d76e83308bf3b1fc7b4c9c6fd081c5ef64" - integrity sha512-x8bfX7k0z5B24Ue0YqjZq/2QxxaKZUNbkGdX//zbQDElMJFqBRrvRi8O3qds7UNNzs78jYqIYCS32Sk/wu5UJg== dependencies: "@babel/core" "^7.0.0" ansi-colors "^1.0.1" @@ -2426,7 +2103,6 @@ fbjs-scripts@^1.0.0: fbjs@^0.8.9: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -2439,7 +2115,6 @@ fbjs@^0.8.9: fbjs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== dependencies: core-js "^2.4.1" fbjs-css-vars "^1.0.0" @@ -2453,14 +2128,12 @@ fbjs@^1.0.0: figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -2468,12 +2141,10 @@ file-entry-cache@^2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fileset@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= dependencies: glob "^7.0.3" minimatch "^3.0.3" @@ -2481,7 +2152,6 @@ fileset@^2.0.2: fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -2492,7 +2162,6 @@ fill-range@^2.1.0: 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" @@ -2502,7 +2171,6 @@ fill-range@^4.0.0: finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -2515,7 +2183,6 @@ finalhandler@1.1.0: find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" @@ -2524,7 +2191,6 @@ find-cache-dir@^1.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" @@ -2532,21 +2198,18 @@ find-up@^1.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" flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -2556,29 +2219,24 @@ flat-cache@^1.2.1: flow-bin@^0.85.0: version "0.85.0" resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.85.0.tgz#a3ca80748a35a071d5bbb2fcd61d64d977fc53a6" - integrity sha512-ougBA2q6Rn9sZrjZQ9r5pTFxCotlGouySpD2yRIuq5AYwwfIT8HHhVMeSwrN5qJayjHINLJyrnsSkkPCZyfMrQ== 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@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" 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.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= dependencies: asynckit "^0.4.0" combined-stream "1.0.6" @@ -2587,19 +2245,16 @@ form-data@~2.3.2: 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" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 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" @@ -2608,7 +2263,6 @@ fs-extra@^1.0.0: fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -2617,19 +2271,16 @@ fs-extra@^4.0.2: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" 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.3: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" @@ -2637,17 +2288,14 @@ fsevents@^1.2.3: 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= gauge@~1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" - integrity sha1-6c7FSD09TuDvRLYKfZnkk14TbZM= dependencies: ansi "^0.3.0" has-unicode "^2.0.0" @@ -2658,7 +2306,6 @@ gauge@~1.2.5: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -2672,43 +2319,36 @@ gauge@~2.7.3: 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-port@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-2.1.0.tgz#8783f9dcebd1eea495a334e1a6a251e78887ab1a" - integrity sha1-h4P53OvR7qSVozThpqJR54iHqxo= dependencies: pinkie-promise "^2.0.0" get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" 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-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -2716,14 +2356,12 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob@^6.0.1: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= dependencies: inflight "^1.0.4" inherits "2" @@ -2734,7 +2372,6 @@ glob@^6.0.1: glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2746,7 +2383,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: global@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= dependencies: min-document "^2.19.0" process "~0.5.1" @@ -2754,17 +2390,14 @@ global@^4.3.0: globals@^11.1.0, globals@^11.7.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" - integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== 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== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -2776,17 +2409,14 @@ globby@^5.0.0: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.0.3: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== dependencies: async "^2.5.0" optimist "^0.6.1" @@ -2797,12 +2427,10 @@ handlebars@^4.0.3: 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.0: version "5.1.0" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" - integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== dependencies: ajv "^5.3.0" har-schema "^2.0.0" @@ -2810,34 +2438,28 @@ har-validator@~5.1.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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= 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-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 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" @@ -2846,7 +2468,6 @@ has-value@^0.3.1: 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" @@ -2855,12 +2476,10 @@ has-value@^1.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" @@ -2868,14 +2487,12 @@ has-values@^1.0.0: has@^1.0.1: 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" home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -2883,24 +2500,20 @@ home-or-tmp@^2.0.0: home-or-tmp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" - integrity sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs= hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" http-errors@~1.6.2: version "1.6.3" resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" inherits "2.0.3" @@ -2910,7 +2523,6 @@ http-errors@~1.6.2: 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" @@ -2919,38 +2531,32 @@ http-signature@~1.2.0: iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: 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-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.3, ignore@^3.3.8: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== image-size@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" @@ -2958,12 +2564,10 @@ import-local@^2.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= 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" @@ -2971,17 +2575,14 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -3001,7 +2602,6 @@ inquirer@^3.0.6: inquirer@^5.2.0: version "5.2.0" resolved "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" - integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -3020,91 +2620,76 @@ inquirer@^5.2.0: interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= invariant@^2.2.2, invariant@^2.2.4: 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= invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== 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-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-builtin-module@^1.0.0: version "1.0.0" resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10: version "1.2.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: ci-info "^1.5.0" 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.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 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" @@ -3113,7 +2698,6 @@ is-descriptor@^0.1.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" @@ -3122,191 +2706,158 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" 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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" 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-generator-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" 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-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" 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-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" is-resolvable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= 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-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= 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@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= isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" @@ -3314,12 +2865,10 @@ isomorphic-fetch@^2.1.1: 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-api@^1.3.1: version "1.3.7" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" - integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== dependencies: async "^2.1.4" fileset "^2.0.2" @@ -3336,19 +2885,16 @@ istanbul-api@^1.3.1: istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== istanbul-lib-hook@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" - integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== dependencies: append-transform "^0.4.0" istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" @@ -3361,7 +2907,6 @@ istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: istanbul-lib-report@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" - integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== dependencies: istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" @@ -3371,7 +2916,6 @@ istanbul-lib-report@^1.1.5: istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" - integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.2.1" @@ -3382,14 +2926,12 @@ istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: istanbul-reports@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" - integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== dependencies: handlebars "^4.0.3" jest-changed-files@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0-alpha.4.tgz#ffcc670aa1734c2d064d7d6c79851da8ca6a563d" - integrity sha512-UySN8v8OmcN4QL4zJAjL0EE8wqvltwKH69tKzrbAb7Mj1IuOBdlvccJUoDnKg9MkVAbVqk/3/sgn28tWFf7prg== dependencies: execa "^1.0.0" throat "^4.0.0" @@ -3397,7 +2939,6 @@ jest-changed-files@^24.0.0-alpha.4: jest-cli@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.0.0-alpha.4.tgz#a91c843b6e53f6a8f953813b704dd12411c98e9c" - integrity sha512-eRjpuLgY2pPPJLFAZ7sLQE9k250Or/HiLZmsmgku4zVV9pHj/LAJzm7S74HOwv+JWexsFqKiYRgW8PrIFWoNNw== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -3439,7 +2980,6 @@ jest-cli@^24.0.0-alpha.4: jest-config@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.0.0-alpha.4.tgz#e07ba3625db86ca28ee34d9422566260a54c865f" - integrity sha512-JlGeIY4cVi+xkNSbL1+44QS6Y0fSSsv/hpLSy+Ml1ruX0cmyGVMUfsq3X5mGa+q843mW9pnkLJRuLVd7Oisuig== dependencies: babel-core "^6.0.0" babel-jest "^24.0.0-alpha.4" @@ -3459,7 +2999,6 @@ jest-config@^24.0.0-alpha.4: jest-diff@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0-alpha.4.tgz#fc17a96b6143f686ad2a9977a60b62593a38e0e4" - integrity sha512-T3ZbPHcYOBCye60zjygOwbVyl83qC/MxRgi7CphRh8o+vUZ61Mr34LToLWwgRGxym1X7zI07ATuI33cdksreNw== dependencies: chalk "^2.0.1" diff "^3.2.0" @@ -3469,26 +3008,22 @@ jest-diff@^24.0.0-alpha.4: jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" - integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== jest-docblock@^24.0.0-alpha.2: version "24.0.0-alpha.2" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0-alpha.2.tgz#d2a6b14f5e325af4c1e79cb401e538dc32bd195f" - integrity sha512-i21Lr9FhzQjCmfsp8T2zH8OnMyePmcLBa31euv0RaEqWyzIHbMTz3LyFpbhbiEhLqHfaiTzoygvba77rdtO4cA== dependencies: detect-newline "^2.1.0" jest-docblock@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0-alpha.4.tgz#883264370210bbd4dfadf9ea0bc5f89baca926c1" - integrity sha512-NQ6DsiCR6OLLZ8XI1X5E0L/WzobR1vBRbPj5GDNIseblMKtCBOsVy9tzvl3+sgLDoQcWB4GctfrBD7UM9/pItg== dependencies: detect-newline "^2.1.0" jest-each@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0-alpha.4.tgz#24e0402e631df539e93cdfbfd0641ef39b598124" - integrity sha512-tnD25TU9HmZG/+5zUnWK8nITVqqBOl037oDroHKYrgPdyJez4WbZuwkZDVotsz3rb58Y/aSaCIeRXMUX6+JIDg== dependencies: chalk "^2.0.1" jest-util "^24.0.0-alpha.4" @@ -3497,7 +3032,6 @@ jest-each@^24.0.0-alpha.4: jest-environment-jsdom@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0-alpha.4.tgz#07999caaebe6e6b76de9f10cb583b8c113b8d326" - integrity sha512-W+fRQiUChrsuzqn6SiC4FGsfq81sCjsQgBN5k/uLEaP/xYf+ZgtBcYGwT86X1xTYxhP2p16IfezYbkbZwIF6Ug== dependencies: jest-mock "^24.0.0-alpha.4" jest-util "^24.0.0-alpha.4" @@ -3506,7 +3040,6 @@ jest-environment-jsdom@^24.0.0-alpha.4: jest-environment-node@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0-alpha.4.tgz#7eb4922a1dd9def27cc323b3404873e0d73e79b7" - integrity sha512-+mXkdhFzr8LBlfGRGczlcgwBPQI7RIzQWR+bYRB2lkCB6DP8cZoYApUBHjcE9JlPU56LFGcm+GrZFfdTILqFcQ== dependencies: jest-mock "^24.0.0-alpha.4" jest-util "^24.0.0-alpha.4" @@ -3514,17 +3047,14 @@ jest-environment-node@^24.0.0-alpha.4: jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" - integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== jest-get-type@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0-alpha.4.tgz#2cef0446d2777229c0c2fa327d0da50507adc037" - integrity sha512-MCjKloodDPKLKCJ9yQ72n+PtJtwSAUG5JRBeSWEXF7DEO2GqwYW/nY94UdmEbug0oc+oxNzsAxNMy7nluWS/Jw== jest-haste-map@24.0.0-alpha.2: version "24.0.0-alpha.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0-alpha.2.tgz#bc1d498536c395699a44b1e61a3e901c95a2e5a6" - integrity sha512-FTSIbJdmaddjgpcaXOq+sPGegcE28w7uOHonpsCuEwBQcB0REhkNYY9Wj/e1w+q3SBmEK1++ChgTMEXEzAf0yQ== dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" @@ -3538,7 +3068,6 @@ jest-haste-map@24.0.0-alpha.2: jest-haste-map@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0-alpha.4.tgz#209c13e79a09b4d380d6c46ab12ecc82f02b84ff" - integrity sha512-I2KD+LkcXjQHrPadfE5jx4AQmnxrpziV9NQIrFbytClRJtBKsloL+DlfPdn2sAIIF7y34irlUSB7aybTgxev7A== dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" @@ -3551,7 +3080,6 @@ jest-haste-map@^24.0.0-alpha.4: jest-jasmine2@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.0.0-alpha.4.tgz#ce4e24cb1257c6e64e54e6632e74feeb1bb1c3f2" - integrity sha512-LMdRgseO5qU6fEe3LFhPVk6+F5Jn7z1nfKoVvzjPsHJZ0EPwpob7y1VV9pG4riMZkDGpFsAdHOGziaD5/pgnqg== dependencies: babel-traverse "^6.0.0" chalk "^2.0.1" @@ -3569,7 +3097,6 @@ jest-jasmine2@^24.0.0-alpha.4: jest-junit@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-5.1.0.tgz#e8e497d810a829bf02783125aab74b5df6caa8fe" - integrity sha512-3EVf1puv2ox5wybQDfLX3AEn3IKOgDV4E76y4pO2hBu46DEtAFZZAm//X1pzPQpqKji0zqgMIzqzF/K+uGAX9A== dependencies: jest-validate "^23.0.1" mkdirp "^0.5.1" @@ -3579,14 +3106,12 @@ jest-junit@5.1.0: jest-leak-detector@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0-alpha.4.tgz#a14886af34e0f54c5ae84a58a07e96c353d1c190" - integrity sha512-IsHvueFwNqIc/VWk7V+yox21vGnWZz/6idEqcQAm1aZaVaydmMz3hB/YmvyhiE+qZaQF7HlyvbdS+FJkbaD1iA== dependencies: pretty-format "^24.0.0-alpha.4" jest-matcher-utils@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0-alpha.4.tgz#a3d4246ef5c8a05097c7df5dfc3bdf36134a9fbb" - integrity sha512-gBDcpSg+4EyYodQV12gVSOPYBcgBE5W+gBmsaMOqHtVQNYvORu9JSK4zeBbR/amC5z1rIsMXOCXRMbN2QepXMA== dependencies: chalk "^2.0.1" jest-get-type "^24.0.0-alpha.4" @@ -3595,7 +3120,6 @@ jest-matcher-utils@^24.0.0-alpha.4: jest-message-util@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0-alpha.4.tgz#e0d4511ef7f94e4bae89aef5f818ffbc6271a51a" - integrity sha512-K3kh0/SL/0/eZQcKwO96d9toQU2IWRKaYxulb8qWMbEnpW2wjBVB8trMU/3r408knVPesKoxPU4V5VdM5xr53g== dependencies: "@babel/code-frame" "^7.0.0" chalk "^2.0.1" @@ -3606,17 +3130,14 @@ jest-message-util@^24.0.0-alpha.4: jest-mock@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0-alpha.4.tgz#ec74931dedf61885830fb0ae39350438b29beab9" - integrity sha512-sImD6rT87SNuIhnUvS8e+lSCuaGAJcpGOqZFE2epXelGqhqriYLViMC5eP5b1az5D1CaOkQWx2AZAQg8mGfKtw== jest-regex-util@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0-alpha.4.tgz#acbac6df4d895a9d3008595efbac5f759b9f69c3" - integrity sha512-zjkN2+Ue4ryS9n7OCXshqtG/oa3f4xXqOeSyxoTmGl5vQ/zAurlHnKA/x54BZtgwFxWLumEuNeyDX85sakwItQ== jest-resolve-dependencies@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.0.0-alpha.4.tgz#4b9bebc99a87d1f03c6fa54904f48a785bd00d80" - integrity sha512-0Le1dW8eOsMbMpiMCg9blxoRNzwhqZKEjuvE6hT+msZQNdiHbPS9qqCnUGPs6SHLuIWTB3qKGEgjsJHDrckSBg== dependencies: jest-regex-util "^24.0.0-alpha.4" jest-snapshot "^24.0.0-alpha.4" @@ -3624,7 +3145,6 @@ jest-resolve-dependencies@^24.0.0-alpha.4: jest-resolve@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.0.0-alpha.4.tgz#9073d5635d1088fa01b1239be8e45ffca567b50d" - integrity sha512-oXqZgPErAVz6QRRQBshPcOpd8d4z9lyEuxoS4+6ifcw0x3bWu0u50fhqqivJrBcX195Ul1kUgsE8zHisQEG6UA== dependencies: browser-resolve "^1.11.3" chalk "^2.0.1" @@ -3633,7 +3153,6 @@ jest-resolve@^24.0.0-alpha.4: jest-runner@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.0.0-alpha.4.tgz#6134e33d75aa26acff07d3ec71a892f8cc1c581a" - integrity sha512-HYlraLrQs2mwAQSJM02ozNWDjTXxpIj8QxcMgXhZkfD32VNrR6PR+/c1d76hQ2S0Y6NEkPonesG5fM3l0uV/YA== dependencies: exit "^0.1.2" graceful-fs "^4.1.11" @@ -3652,7 +3171,6 @@ jest-runner@^24.0.0-alpha.4: jest-runtime@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.0.0-alpha.4.tgz#f8cb479c5a21a4ec23eadf3d3993afd4778e9a0a" - integrity sha512-3SjUWFB3U6WrhK5Av0kCTZLTI+wjvjDsYVwsE8EeTRt9kGnELm+WezUQuHtKSun0Ygvi0xZLdAl/E0X1hHaeow== dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.1.6" @@ -3680,17 +3198,14 @@ jest-runtime@^24.0.0-alpha.4: jest-serializer@24.0.0-alpha.2, jest-serializer@^24.0.0-alpha.2: version "24.0.0-alpha.2" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0-alpha.2.tgz#adcaa73ef49e56377f7fada19921c300b576e7f9" - integrity sha512-jLHHT71gyYdgMH5sFWP/e8bZjq/TC5iz9DQZlLsRE/7Er//m8WqyiNJs022FEc18PLq3jyk/z06N0xS6YlbsUA== jest-serializer@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0-alpha.4.tgz#939c31155b95bebc1ef6f76ae34dbf2c06046e52" - integrity sha512-g/hO2JM6c96wGzbiQNdbOrLlx8p+cA8W8+EwFkKtUlWcmBCxbsZb8TaIK2FLfvxCTKPwMhBujhw46GM5WppAsQ== jest-snapshot@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.0.0-alpha.4.tgz#be3d515a38cd75021d2814bc59fdc1dce03f58b8" - integrity sha512-RnNyMfG7Esgykkru9n9BBlR6CiXEdvrdiZSw2+i3LKw7rO5/jjG4w2SDcTM/Rh2j6EEhWQn5Fhr7T/PAUNybiw== dependencies: babel-types "^6.0.0" chalk "^2.0.1" @@ -3706,7 +3221,6 @@ jest-snapshot@^24.0.0-alpha.4: jest-util@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0-alpha.4.tgz#0021abb2b09c1fea68dc748f6bf3eb93789b5cb4" - integrity sha512-2NYByhPpApO3BwtdWFxhOzjUl70EU5yRtJiqRv3dbsjIKV9pRPdvHUr7miz0GsZkeUyCehrzwJgaWL5iNa3T5Q== dependencies: callsites "^2.0.0" chalk "^2.0.1" @@ -3720,7 +3234,6 @@ jest-util@^24.0.0-alpha.4: jest-validate@^23.0.1: version "23.6.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" - integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" @@ -3730,7 +3243,6 @@ jest-validate@^23.0.1: jest-validate@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0-alpha.4.tgz#c66cc7d771a17c6441e31d0d4f26f71090e88e47" - integrity sha512-zgkrTlFv0mQjbxAGus2GXEfgZex3iIlZ2xEq/rZqZ3np/cegDPotlC6MckmSRLqHFAzrwe3SRrreXZUSApHJGQ== dependencies: chalk "^2.0.1" jest-get-type "^24.0.0-alpha.4" @@ -3740,7 +3252,6 @@ jest-validate@^24.0.0-alpha.4: jest-watcher@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0-alpha.4.tgz#71ac48ccb510cedaaa1156a637a1bacdc837fdf8" - integrity sha512-RDL1n5BAbnseRTZQDAlBoLmjla3sDx1LQuadFa7a73ujxPG9nQyDusVAnVf8JU684zlNMNpQ4BdK50GAQZW0TQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -3749,21 +3260,18 @@ jest-watcher@^24.0.0-alpha.4: jest-worker@24.0.0-alpha.2, jest-worker@^24.0.0-alpha.2: version "24.0.0-alpha.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0-alpha.2.tgz#d376b328094dd5f1e0c6156b4f41b308a99a35bd" - integrity sha512-77YRl8eI4rrtdJ4mzzo4LVABecQmmy7lXsXc00rIJ9oiXJYbz4R4eL6RXcxZcRbwwqYjFL0g9h6H9iQaWqC/Kg== dependencies: merge-stream "^1.0.1" jest-worker@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0-alpha.4.tgz#6766d11b66e7b2d61f79711d159125657084d021" - integrity sha512-kZYIxqwkvaQggTBiOnoGoI7pyHAsCgFg+1C9NCSpkaQOLQ/MpEdY6cTPTbLwWdtzSloWnECAAj8p9es2VLQd/Q== dependencies: merge-stream "^1.0.1" jest@24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/jest/-/jest-24.0.0-alpha.4.tgz#fc57357ec1a4e12700616569f2ec1b3d2ab3c87f" - integrity sha512-peUdEeRk23o1ntvnoQc6CqOrhIlqXMK88tXXf/MepL6uK17+w2paC+ut0KpdAJ4rNAIoIlN8TLyXspiFDM3w0w== dependencies: import-local "^2.0.0" jest-cli "^24.0.0-alpha.4" @@ -3771,17 +3279,14 @@ jest@24.0.0-alpha.4: "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.11.0, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3789,12 +3294,10 @@ js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.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@^11.5.1: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: abab "^2.0.0" acorn "^5.5.3" @@ -3826,83 +3329,68 @@ jsdom@^11.5.1: 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.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-parse-better-errors@^1.0.1: 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.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= 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@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-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" 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@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "http://registry.npmjs.org/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" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= 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" @@ -3912,79 +3400,66 @@ jsprim@^1.2.2: jsx-ast-utils@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= dependencies: array-includes "^3.0.3" 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: 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.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 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" kleur@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" - integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== 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" lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: invert-kv "^2.0.0" left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= 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" @@ -3992,7 +3467,6 @@ levn@^0.3.0, levn@~0.3.0: load-json-file@^1.0.0: version "1.1.0" resolved "http://registry.npmjs.org/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" @@ -4003,7 +3477,6 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" resolved "http://registry.npmjs.org/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" @@ -4013,7 +3486,6 @@ load-json-file@^2.0.0: 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" @@ -4021,7 +3493,6 @@ locate-path@^2.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" @@ -4029,44 +3500,36 @@ locate-path@^3.0.0: lodash.pad@^4.1.0: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" - integrity sha1-QzCUmoM6fI2iLMIPaibE1Z3runA= lodash.padend@^4.1.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" - integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= lodash.padstart@^4.1.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= lodash@4.x.x, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 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@^4.0.1: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -4074,52 +3537,44 @@ lru-cache@^4.0.1: make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" map-age-cleaner@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" - integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== dependencies: p-defer "^1.0.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" math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" mem@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" - integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== dependencies: map-age-cleaner "^0.1.1" mimic-fn "^1.0.0" @@ -4128,19 +3583,33 @@ mem@^4.0.0: merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= dependencies: readable-stream "^2.0.1" merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= + +metro-babel-register@^0.48.1: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.48.3.tgz#459b9e5bd635775e342109b6acd70fd63c731f57" + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + core-js "^2.2.2" + escape-string-regexp "^1.0.5" metro-babel-register@^0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.49.0.tgz#b9c21e2f28fe52a1094772d9aa1c7f5f90edb1bf" - integrity sha512-n/HSHp5pWHaJ3JKA8WJsSpz8jOdJBRY95eaCxBXi8CjIKdJK1izVEZbSEb4Cic0PitBiud14J1FlJftNPracBQ== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" @@ -4155,27 +3624,49 @@ metro-babel-register@^0.49.0: core-js "^2.2.2" escape-string-regexp "^1.0.5" +metro-babel7-plugin-react-transform@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.48.3.tgz#c3e43c99173c143537fb234b44cdd6e6b511d511" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + metro-babel7-plugin-react-transform@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.49.0.tgz#1df801a17215c8271e89bb55c15e7305592c33bf" - integrity sha512-2QCWBQybANIsib/ofj/JinA4yksQcERzouZEtW81TnDElETIcQo1YAoJoe7pg7BTLCx8NBHPt2tOp8AucV0z+w== dependencies: "@babel/helper-module-imports" "^7.0.0" +metro-cache@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.48.3.tgz#8c2818d3cd6b79570cd7750da4685e9c7c061577" + dependencies: + jest-serializer "24.0.0-alpha.2" + metro-core "0.48.3" + mkdirp "^0.5.1" + rimraf "^2.5.4" + metro-cache@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.49.0.tgz#30b310c554b6ba72d56feed06805cee38de49bb0" - integrity sha512-g5QcD423bhrpYrODEh+3Vp92wnH/4rH3DsLV/Lja1c23KU2CQ9iL5+yrhkmGlO/wktdZf+FxNdZxn03G1J74rQ== dependencies: jest-serializer "24.0.0-alpha.2" metro-core "0.49.0" mkdirp "^0.5.1" rimraf "^2.5.4" +metro-config@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.48.3.tgz#71f9f27911582e960a660ed2b08cb4ee5d58724d" + dependencies: + cosmiconfig "^5.0.5" + metro "0.48.3" + metro-cache "0.48.3" + metro-core "0.48.3" + pretty-format "^23.4.1" + metro-config@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.49.0.tgz#fd7e8a91459b5ec1f0b9ff4ad13c0df37c7ef921" - integrity sha512-iuXSoQ+0nA6gP/4kwor0/wrun5n3DDFCZ9TUzn9LVDeGwvfNNXkX2gTfh6+TrBPEpwZKmR1zBIIsdFVZo0EzsQ== dependencies: cosmiconfig "^5.0.5" metro "0.49.0" @@ -4183,32 +3674,87 @@ metro-config@0.49.0: metro-core "0.49.0" pretty-format "^23.4.1" +metro-core@0.48.3, metro-core@^0.48.1: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.48.3.tgz#be2d615eaec759c8d01559e8685554cbdf8e7c4f" + dependencies: + jest-haste-map "24.0.0-alpha.2" + lodash.throttle "^4.1.1" + metro-resolver "0.48.3" + wordwrap "^1.0.0" + metro-core@0.49.0, metro-core@^0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.49.0.tgz#6fa04961f9a764a28614d6f95d1fc88f82a4024f" - integrity sha512-5L1AiGwdpHSrOx+0h6fXM5D38I+Xm67uOv/arOSbW580PEHzxtgQkdUbWaSbvdEaWGV97RGuicpKqyqQqpdiXg== dependencies: jest-haste-map "24.0.0-alpha.2" lodash.throttle "^4.1.1" metro-resolver "0.49.0" wordwrap "^1.0.0" +metro-memory-fs@^0.48.1: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.48.3.tgz#2d180a73992daf08e242ea49682f72e6f0f7f094" + metro-memory-fs@^0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.49.0.tgz#55bce3a2038a74e96bf6d64ce3920f353fc1c4c6" - integrity sha512-TjamHF1WER33duZPuRIPTr9r5SJNEjXvExG18UJRvZgSdqkQkVjGoBKpOTXM5SSUN9Q0Rvow9e1FONUptI2Cdw== + +metro-minify-uglify@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.48.3.tgz#493baadb65f6a1d8cab9fd157ac80c5801b23149" + dependencies: + uglify-es "^3.1.9" metro-minify-uglify@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.49.0.tgz#e3e049f852f9e1987a1f993b0070b99369c40ebb" - integrity sha512-ZJPyviXZ4krbyBIzsguieRpy9AeNPmzR3GKsOJGhHHkk7GscgWPp2SqZALD7Y9IpbqUkNmyQJ6ApqUlxq1BzHw== dependencies: uglify-es "^3.1.9" +metro-react-native-babel-preset@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.48.3.tgz#839dbd0d9e4012f550861d2295b998144a61bcc8" + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.48.3" + react-transform-hmr "^1.0.4" + metro-react-native-babel-preset@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.49.0.tgz#c74480d88817f32aec7474e45e7eda1716112ecf" - integrity sha512-pwjfnNlXdmPsRMof0SSO5juroYXGw3oRF6+Irzn0aBzAjW7aaIYyT5f7hSMuVU5iL1J9izQt9V4pI2ObkVjnwg== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-export-default-from" "^7.0.0" @@ -4246,24 +3792,87 @@ metro-react-native-babel-preset@0.49.0: metro-babel7-plugin-react-transform "0.49.0" react-transform-hmr "^1.0.4" +metro-resolver@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.48.3.tgz#3459c117f25a6d91d501eb1c81fdc98fcfea1cc0" + dependencies: + absolute-path "^0.0.0" + metro-resolver@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.49.0.tgz#abfb82dbaae645599ecd4ed119e9b2b343a0c54d" - integrity sha512-mwlA4nn3/smjpPIthzvA5xHT9IXLCoLXjKL+AqeoYtIvCdGHf5x17xM/I0b9BatdXCmirYnC3PD9G2hcmkje0Q== dependencies: absolute-path "^0.0.0" +metro-source-map@0.48.3: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.48.3.tgz#ab102bf71c83754e6d5a04c3faf612a88e7f5dcf" + dependencies: + source-map "^0.5.6" + metro-source-map@0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.49.0.tgz#7e0c74a095d15a5d443f015549659465e2cfcaad" - integrity sha512-pd0UPPEXO7JeOlpPbGJhYvUxvoZC9uR1OpDjMEPohoacdgqw17NgyaxNkJY3aAYfhGQNuiLCxYOFgEjK3BacdA== dependencies: source-map "^0.5.6" +metro@0.48.3, metro@^0.48.1: + version "0.48.3" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.48.3.tgz#43639828dc22fd75e0d31ce75a6dc4615feaf5f7" + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.0.1" + buffer-crc32 "^0.2.13" + chalk "^1.1.1" + concat-stream "^1.6.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" + jest-haste-map "24.0.0-alpha.2" + jest-worker "24.0.0-alpha.2" + json-stable-stringify "^1.0.1" + lodash.throttle "^4.1.1" + merge-stream "^1.0.1" + metro-cache "0.48.3" + metro-config "0.48.3" + metro-core "0.48.3" + metro-minify-uglify "0.48.3" + metro-react-native-babel-preset "0.48.3" + metro-resolver "0.48.3" + metro-source-map "0.48.3" + mime-types "2.1.11" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.0" + react-transform-hmr "^1.0.4" + resolve "^1.5.0" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + write-file-atomic "^1.2.0" + ws "^1.1.0" + xpipe "^1.0.5" + yargs "^9.0.0" + metro@0.49.0, metro@^0.49.0: version "0.49.0" resolved "https://registry.yarnpkg.com/metro/-/metro-0.49.0.tgz#5630b95537a25544624052c22027841c5a3d13e1" - integrity sha512-/GDvO9JYmTrQmzuCfBfDKEC+Gg3/xxn3/3pnIypB+QwTXuiYpO5mpub9XVcPRiN2gr+mMgQWGiwyL+z/TJbaPA== dependencies: "@babel/core" "^7.0.0" "@babel/generator" "^7.0.0" @@ -4318,7 +3927,6 @@ metro@0.49.0, metro@^0.49.0: micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -4337,7 +3945,6 @@ micromatch@^2.3.11: 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" @@ -4356,75 +3963,62 @@ micromatch@^3.1.4: "mime-db@>= 1.36.0 < 2", mime-db@~1.36.0: version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" - integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== mime-db@~1.23.0: version "1.23.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= mime-types@2.1.11: version "2.1.11" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - integrity sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw= dependencies: mime-db "~1.23.0" mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: version "2.1.20" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" - integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== dependencies: mime-db "~1.36.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.3.4: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" "minimatch@2 || 3", minimatch@^3.0.3, 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@0.0.8: version "0.0.8" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minipass@^2.2.1, minipass@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" - integrity sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -4432,14 +4026,12 @@ minipass@^2.2.1, minipass@^2.3.3: minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== dependencies: minipass "^2.2.1" mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -4447,19 +4039,16 @@ mixin-deep@^1.2.0: mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" moment@^2.10.6: version "2.22.2" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" - integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= morgan@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" - integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== dependencies: basic-auth "~2.0.0" debug "2.6.9" @@ -4470,22 +4059,18 @@ morgan@^1.9.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.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mv@~2: version "2.1.1" resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= dependencies: mkdirp "~0.5.1" ncp "~2.0.0" @@ -4494,12 +4079,10 @@ mv@~2: nan@^2.10.0, nan@^2.9.2: version "2.11.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" - integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== 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" @@ -4516,17 +4099,14 @@ nanomatch@^1.2.9: 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= ncp@~2.0.0: version "2.0.0" resolved "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= needle@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" - integrity sha512-GPL22d/U9cai87FcCPO6e+MT3vyHS2j+zwotakDc7kE2DtUAqFKMXLJCTtRp+5S75vXIwQPvIxkvlctxf9q4gQ== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -4535,17 +4115,14 @@ needle@^2.2.1: negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 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== node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -4553,22 +4130,18 @@ node-fetch@^1.0.1: node-fetch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.2.0.tgz#4ee79bde909262f9775f731e3656d0db55ced5b5" - integrity sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA== node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= 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-notifier@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" semver "^5.4.1" @@ -4578,7 +4151,6 @@ node-notifier@^5.2.1: node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -4594,12 +4166,10 @@ node-pre-gyp@^0.10.0: node-version@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" - integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -4607,7 +4177,6 @@ nopt@^4.0.1: normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -4617,19 +4186,16 @@ normalize-package-data@^2.3.2: 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" npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== npm-packlist@^1.1.6: version "1.1.11" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" - integrity sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -4637,14 +4203,12 @@ npm-packlist@^1.1.6: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" - integrity sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI= dependencies: ansi "~0.3.1" are-we-there-yet "~1.1.2" @@ -4653,7 +4217,6 @@ npmlog@^2.0.4: npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -4663,32 +4226,26 @@ npmlog@^4.0.2: nullthrows@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.0.tgz#832bb19ef7fedab989f81675c846e2858a3917a2" - integrity sha512-YoigDq49JRqVCUlb4XlwZirXQiNCoXdwoyfklXJAEYHN+XKHWgDkrcWxNgxEtP7N+XF9Akp7Lr6wLq8HZxLttw== 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= nwsapi@^2.0.7: version "2.0.9" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" - integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== 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.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 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" @@ -4697,19 +4254,16 @@ object-copy@^0.1.0: object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== 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.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= dependencies: define-properties "^1.1.2" es-abstract "^1.5.1" @@ -4717,7 +4271,6 @@ object.getownpropertydescriptors@^2.0.3: object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -4725,47 +4278,40 @@ object.omit@^2.0.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" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@^1.3.0, once@^1.3.1, 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@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" opn@^3.0.2: version "3.0.3" resolved "http://registry.npmjs.org/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" - integrity sha1-ttmec5n3jWXDuq/+8fsojpuFJDo= dependencies: object-assign "^4.0.1" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -4773,7 +4319,6 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -4785,17 +4330,14 @@ optionator@^0.8.1, optionator@^0.8.2: options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= 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@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" @@ -4804,7 +4346,6 @@ os-locale@^2.0.0: os-locale@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" - integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== dependencies: execa "^0.10.0" lcid "^2.0.0" @@ -4813,12 +4354,10 @@ os-locale@^3.0.0: os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, 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= osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -4826,60 +4365,50 @@ osenv@^0.1.4: p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-is-promise@^1.1.0: version "1.1.0" resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= 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: version "2.0.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== dependencies: p-try "^2.0.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-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.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -4889,14 +4418,12 @@ parse-glob@^3.0.4: 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-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -4904,54 +4431,44 @@ parse-json@^4.0.0: parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= 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-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-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 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-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0, 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-parse@^1.0.5: 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-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" @@ -4960,67 +4477,56 @@ path-type@^1.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" pegjs@^0.10.0: version "0.10.0" resolved "http://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" - integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0= 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= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 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.0" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" - integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA== 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" plist@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b" - integrity sha1-CjLKlIGxw2TpLhjcVch23p0B2os= dependencies: base64-js "1.1.2" xmlbuilder "8.2.2" @@ -5029,7 +4535,6 @@ plist@2.0.1: plist@^3.0.0: 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" @@ -5038,7 +4543,6 @@ plist@^3.0.0: 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" @@ -5049,37 +4553,30 @@ plugin-error@^0.1.2: pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== 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= 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= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= prettier@1.13.6: version "1.13.6" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.6.tgz#00ae0b777ad92f81a9e7a1df2f0470b6dab0cb44" - integrity sha512-p5eqCNiohWZN++7aJXUVj0JgLqHCPLf9GLIcLBHGNWs4Y9FJOPs6+KNO2WT0udJIQJTbeZFrJkjzjcb8fkAYYQ== pretty-format@24.0.0-alpha.4, pretty-format@^24.0.0-alpha.4: version "24.0.0-alpha.4" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0-alpha.4.tgz#cc1f7497e2496b71f8ad99f1526096e515fada03" - integrity sha512-icvbBt3XlLEVqPHdHwR2Ou9+hezS9Eccd+mA+fXfOU7T9t7ClOpq2HgCwlyw+3WogccCubKWnmzyrA/3ZZ/aOA== dependencies: ansi-regex "^4.0.0" ansi-styles "^3.2.0" @@ -5087,7 +4584,6 @@ pretty-format@24.0.0-alpha.4, pretty-format@^24.0.0-alpha.4: pretty-format@^23.4.1, pretty-format@^23.6.0: version "23.6.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" @@ -5095,39 +4591,32 @@ pretty-format@^23.4.1, pretty-format@^23.6.0: private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise-polyfill@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057" - integrity sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc= promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" prompts@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/prompts/-/prompts-1.1.1.tgz#c687590e472c08cd84cfa4b8694b1cab5de45144" - integrity sha512-lC0+ifgWNKhTNF28Wj41TOXE+gEzrHcDqkCRHMbv39afuGT1ClekTgcVF+r2VuSgNr3Fy2hq6Pu3Mlt43u+QlQ== dependencies: kleur "^2.0.1" sisteransi "^1.0.0" @@ -5135,7 +4624,6 @@ prompts@^1.1.0: prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" - integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== dependencies: loose-envify "^1.3.1" object-assign "^4.1.1" @@ -5143,7 +4631,6 @@ prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: proper-lockfile@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-3.0.2.tgz#d30b3b83ecb157e08fe0d411f2393bc384b77ad1" - integrity sha512-SDrSRyuKE1jM9b2kdpL6SA78wgG+M+fZKe2zbWkURsshOzUmoOornXQcasKQRP9hGhMoEILNpSbWcYoymoB5cA== dependencies: graceful-fs "^4.1.11" retry "^0.10.1" @@ -5151,17 +4638,14 @@ proper-lockfile@^3.0.2: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: version "1.1.29" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" - integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -5169,22 +4653,18 @@ pump@^3.0.0: punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: 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== randomatic@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" - integrity sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ== dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -5193,12 +4673,10 @@ randomatic@^3.0.0: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" @@ -5208,17 +4686,14 @@ rc@^1.2.7: react-clone-referenced-element@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz#9cdda7f2aeb54fea791f3ab8c6ab96c7a77d0158" - integrity sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg== react-deep-force-update@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" - integrity sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA== react-devtools-core@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.4.0.tgz#6b61594dce01b129a9e0b44b5bc4952f8f59ceec" - integrity sha512-yV3LLhoRwbfcQyVPNwb1EZ9W7CGu+kX2EqyZ3Cl5C+cbXcb6FJ3YSeeBt9BQB+hjyjRMBjQSKqnpPS6OMSEUow== dependencies: shell-quote "^1.6.1" ws "^3.3.1" @@ -5226,17 +4701,53 @@ react-devtools-core@^3.4.0: react-is@^16.6.0-alpha.8af6728: version "16.6.0-alpha.8af6728" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.0-alpha.8af6728.tgz#3ce01f13f164b90a76ad902735834fc12d06e30e" - integrity sha512-F65AeMavskvRglteO7dC0Nvq3Br1ESnpCOG5M6fenQX52Uhpt6eCI0vL3ICM/hnVhIOQY2fwnSWtST33OlgxVA== react-native-dummy@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/react-native-dummy/-/react-native-dummy-0.1.0.tgz#8ec015b814df45acfac458150b67f8a947b36b93" - integrity sha512-IVgM7ZtoQPfbduQIj8DrSaDyCkBDZBoiJMLMIqdDl5FJP3hJsakVybl3TvUOycU6bg+kPQY8znu0akugosh/gw== + +"react-native-local-cli@file:../react-native-cli/packages/local-cli/react-native-local-cli-0.57.1.tgz": + version "0.57.1" + resolved "file:../react-native-cli/packages/local-cli/react-native-local-cli-0.57.1.tgz#2e0a56f815c5469a3dbf1ed60b7b922506190c98" + dependencies: + absolute-path "^0.0.0" + chalk "^1.1.1" + commander "^2.9.0" + compression "^1.7.1" + connect "^3.6.5" + denodeify "^1.2.1" + envinfo "^5.7.0" + errorhandler "^1.5.0" + fs-extra "^1.0.0" + glob "^7.1.1" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + lodash "^4.17.5" + metro "^0.48.1" + metro-babel-register "^0.48.1" + metro-core "^0.48.1" + metro-memory-fs "^0.48.1" + mime "^1.3.4" + minimist "^1.2.0" + mkdirp "^0.5.1" + morgan "^1.9.0" + node-fetch "^2.2.0" + node-notifier "^5.2.1" + npmlog "^2.0.4" + opn "^3.0.2" + optimist "^0.6.1" + plist "^3.0.0" + promise "^7.1.1" + semver "^5.0.3" + serve-static "^1.13.1" + shell-quote "1.6.1" + ws "^1.1.0" + xcode "^1.0.0" + xmldoc "^0.4.0" react-proxy@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" - integrity sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo= dependencies: lodash "^4.6.1" react-deep-force-update "^1.0.0" @@ -5244,7 +4755,6 @@ react-proxy@^1.1.7: react-test-renderer@16.6.0-alpha.8af6728: version "16.6.0-alpha.8af6728" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.6.0-alpha.8af6728.tgz#5b9eaa972f0016c95d1ef5d93f727c5dc4a5a0ee" - integrity sha512-42RB1hvEjVuJGrGddGqVj1obs9NhWiuijkz+qsuY0qRzF0ygD5xg4eRdm0H4YNtkp+332g6OWO9O2ussu67cFQ== dependencies: object-assign "^4.1.1" prop-types "^15.6.2" @@ -5254,7 +4764,6 @@ react-test-renderer@16.6.0-alpha.8af6728: react-transform-hmr@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" - integrity sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s= dependencies: global "^4.3.0" react-proxy "^1.1.7" @@ -5262,7 +4771,6 @@ react-transform-hmr@^1.0.4: react@16.6.0-alpha.8af6728: version "16.6.0-alpha.8af6728" resolved "https://registry.yarnpkg.com/react/-/react-16.6.0-alpha.8af6728.tgz#b97b6453c252a1f6ad185acc81aca1485cd3e120" - integrity sha512-W5NwSMey/JjF4wdeB7ek/+qG4bJJhgM1O/NaHvhUswgJxBMcFLUroODPELbq6IVolgua+anEirtOCx3fMXHZjw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -5272,7 +4780,6 @@ react@16.6.0-alpha.8af6728: 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" @@ -5280,7 +4787,6 @@ read-pkg-up@^1.0.1: 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" @@ -5288,7 +4794,6 @@ read-pkg-up@^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" @@ -5297,7 +4802,6 @@ read-pkg@^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" @@ -5306,7 +4810,6 @@ read-pkg@^2.0.0: readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.3.6" resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5319,57 +4822,48 @@ readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.1.5, readable realpath-native@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" - integrity sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g== dependencies: util.promisify "^1.0.0" 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" regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" - integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== dependencies: regenerate "^1.4.0" regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== 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== regenerator-runtime@^0.12.0: version "0.12.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== regenerator-transform@^0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== dependencies: private "^0.1.6" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" 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" @@ -5377,19 +4871,16 @@ regex-not@^1.0.0, regex-not@^1.0.2: regexp.prototype.flags@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" - integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== dependencies: define-properties "^1.1.2" regexpp@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== regexpu-core@^4.1.3: version "4.2.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" - integrity sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw== dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^7.0.0" @@ -5401,48 +4892,40 @@ regexpu-core@^4.1.3: regjsgen@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" - integrity sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA== regjsparser@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" - integrity sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA== dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: 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.5.2, 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@^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" request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: lodash "^4.13.1" request-promise-native@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= dependencies: request-promise-core "1.1.1" stealthy-require "^1.1.0" @@ -5451,7 +4934,6 @@ request-promise-native@^1.0.5: request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -5477,17 +4959,14 @@ request@^2.87.0: 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-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-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -5495,41 +4974,34 @@ require-uncached@^1.0.3: resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= 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.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.1.6, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -5537,89 +5009,74 @@ restore-cursor@^2.0.0: 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== retry@^0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" rimraf@~2.2.6: version "2.2.8" resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= rimraf@~2.4.0: version "2.4.5" resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= dependencies: glob "^6.0.1" rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rxjs@^5.5.2: version "5.5.12" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== dependencies: symbol-observable "1.0.1" safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, 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-json-stringify@~1: version "1.2.0" resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" - integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== 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== sane@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" - integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== dependencies: anymatch "^2.0.0" capture-exit "^1.2.0" @@ -5636,24 +5093,20 @@ sane@^3.0.0: sanitize-filename@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" - integrity sha1-YS2hyWRz+gLczaktzVtKsWSmdyo= dependencies: truncate-utf8-bytes "^1.0.0" sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== sax@~1.1.1: version "1.1.6" resolved "http://registry.npmjs.org/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" - integrity sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA= scheduler@^0.10.0-alpha.8af6728: version "0.10.0-alpha.f47a958" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.10.0-alpha.f47a958.tgz#0063a5c21aad2038111c316e417e9702d1ca7007" - integrity sha512-GVz1gvEU4JhqqiLB+DhRwd17sqKCmVsmdrsDoKMOIRCu0z+qYhimF6PvA3q61BgCqHDWJZiAidom6saiE8ZrOQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -5661,12 +5114,10 @@ scheduler@^0.10.0-alpha.8af6728: "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -5685,12 +5136,10 @@ send@0.16.2: serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= serve-static@^1.13.1: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -5700,12 +5149,10 @@ serve-static@^1.13.1: set-blocking@^2.0.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@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -5715,7 +5162,6 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -5725,29 +5171,24 @@ set-value@^2.0.0: setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 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-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= shell-quote@1.6.1, shell-quote@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= dependencies: array-filter "~0.0.0" array-map "~0.0.0" @@ -5757,14 +5198,12 @@ shell-quote@1.6.1, shell-quote@^1.6.1: shell-utils@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/shell-utils/-/shell-utils-1.0.10.tgz#7fe7b8084f5d6d21323d941267013bc38aed063e" - integrity sha512-p1xuqhj3jgcXiV8wGoF1eL/NOvapN9tyGDoObqKwvZTUZn7fIzK75swLTEHfGa7sObeN9vxFplHw/zgYUYRTsg== dependencies: lodash "4.x.x" shelljs@^0.7.8: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM= dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -5773,17 +5212,14 @@ shelljs@^0.7.8: shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= simple-plist@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.2.1.tgz#71766db352326928cf3a807242ba762322636723" - integrity sha1-cXZts1IyaSjPOoByQrp2IyJjZyM= dependencies: bplist-creator "0.0.7" bplist-parser "0.1.1" @@ -5792,34 +5228,28 @@ simple-plist@^0.2.1: sisteransi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" - integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= 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" @@ -5828,14 +5258,12 @@ snapdragon-node@^2.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" @@ -5849,7 +5277,6 @@ snapdragon@^0.8.1: source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: atob "^2.1.1" decode-uri-component "^0.2.0" @@ -5860,14 +5287,12 @@ source-map-resolve@^0.5.0: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-support@^0.5.6, source-map-support@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -5875,22 +5300,18 @@ source-map-support@^0.5.6, source-map-support@^0.5.9: 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.3, 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== spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - integrity sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -5898,12 +5319,10 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - integrity sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -5911,24 +5330,20 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" - integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w== 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.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.14.2" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" - integrity sha1-xvxhZIo9nE52T9P8306hBeSSupg= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -5944,17 +5359,14 @@ sshpk@^1.7.0: stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= stacktrace-parser@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.4.tgz#01397922e5f62ecf30845522c95c4fe1d25e7d4e" - integrity sha1-ATl5IuX2Ls8whFUiyVxP4dJefU4= 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" @@ -5962,32 +5374,26 @@ static-extend@^0.1.1: "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 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= string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= dependencies: astral-regex "^1.0.0" strip-ansi "^4.0.0" @@ -5995,7 +5401,6 @@ string-length@^2.0.0: string-width@^1.0.1: 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" @@ -6004,7 +5409,6 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: 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" @@ -6012,7 +5416,6 @@ string-width@^1.0.1: string.prototype.matchall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz#2af8fe3d2d6dc53ca2a59bd376b089c3c152b3c8" - integrity sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q== dependencies: define-properties "^1.1.2" es-abstract "^1.10.0" @@ -6023,86 +5426,72 @@ string.prototype.matchall@^2.0.0: 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" 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: version "5.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== dependencies: ansi-regex "^4.0.0" strip-bom@3.0.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@^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-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 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@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" 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" symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= table@^4.0.3: version "4.0.3" resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" - integrity sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg== dependencies: ajv "^6.0.1" ajv-keywords "^3.0.0" @@ -6114,12 +5503,10 @@ table@^4.0.3: tail@^1.2.3: version "1.4.0" resolved "https://registry.yarnpkg.com/tail/-/tail-1.4.0.tgz#884b216220b90804bfe87a4c8174c2efed0e2661" - integrity sha512-wjwfZw6wcMFTB1Po7NFUf4TdCDwX8duZjdTMhnHBEC677Q6mFRcVZE7f/nZDhG2Fpf/wEEKOJP9L7/b11/vlHQ== tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" - integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -6132,19 +5519,16 @@ tar@^4: telnet-client@0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/telnet-client/-/telnet-client-0.15.3.tgz#99ec754e4acf6fa51dc69898f574df3c2550712e" - integrity sha512-GSfdzQV0BKIYsmeXq7bJFJ2wHeJud6icaIxCUf6QCGQUD6R0BBGbT1+yLDhq67JRdgRpwyPwUbV7JxFeRrZomQ== dependencies: bluebird "3.5.x" temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= dependencies: os-tmpdir "^1.0.0" rimraf "~2.2.6" @@ -6152,7 +5536,6 @@ temp@0.8.3: tempfile@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" - integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= dependencies: temp-dir "^1.0.0" uuid "^3.0.1" @@ -6160,7 +5543,6 @@ tempfile@^2.0.0: test-exclude@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" - integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -6171,17 +5553,14 @@ test-exclude@^4.2.1: 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= throat@^4.0.0, throat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= through2@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= dependencies: readable-stream "^2.1.5" xtend "~4.0.1" @@ -6189,46 +5568,38 @@ through2@^2.0.0: through@^2.3.6: version "2.3.8" resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 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= 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" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= 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" @@ -6236,7 +5607,6 @@ to-regex-range@^2.1.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" @@ -6246,7 +5616,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -6254,55 +5623,46 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" 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= truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" - integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= dependencies: utf8-byte-length "^1.0.1" 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.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" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= ua-parser-js@^0.7.18: version "0.7.18" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - integrity sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA== uglify-es@^3.1.9: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: commander "~2.13.0" source-map "~0.6.1" @@ -6310,7 +5670,6 @@ uglify-es@^3.1.9: uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -6318,22 +5677,18 @@ uglify-js@^3.1.4: ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== unicode-match-property-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== dependencies: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" @@ -6341,17 +5696,14 @@ unicode-match-property-ecmascript@^1.0.4: unicode-match-property-value-ecmascript@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" - integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" - integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -6361,17 +5713,14 @@ union-value@^1.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== unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 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" @@ -6379,34 +5728,28 @@ unset-value@^1.0.0: uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 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== utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" - integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= 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= util.promisify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== dependencies: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" @@ -6414,22 +5757,18 @@ util.promisify@^1.0.0: utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" - integrity sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE= uuid@^3.0.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 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" @@ -6437,12 +5776,10 @@ validate-npm-package-license@^3.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 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" @@ -6451,21 +5788,18 @@ verror@1.10.0: w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= dependencies: browser-process-hrtime "^0.1.2" walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= dependencies: exec-sh "^0.2.0" minimist "^1.2.0" @@ -6473,29 +5807,24 @@ watch@~0.18.0: webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" - integrity sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg== dependencies: iconv-lite "0.4.23" whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== whatwg-mimetype@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" - integrity sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw== whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -6504,7 +5833,6 @@ whatwg-url@^6.4.1: whatwg-url@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" @@ -6513,36 +5841,30 @@ whatwg-url@^7.0.0: 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@^1.2.12, which@^1.2.9, which@^1.3.0: 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.0: 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" wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wrap-ansi@^2.0.0: version "2.1.0" resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -6550,12 +5872,10 @@ wrap-ansi@^2.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@^1.2.0: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -6564,7 +5884,6 @@ write-file-atomic@^1.2.0: write-file-atomic@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -6573,14 +5892,12 @@ write-file-atomic@^2.1.0: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" ws@^1.1.0, ws@^1.1.1: version "1.1.5" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== dependencies: options ">=0.0.5" ultron "1.0.x" @@ -6588,7 +5905,6 @@ ws@^1.1.0, ws@^1.1.1: ws@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" safe-buffer "~5.1.0" @@ -6597,14 +5913,12 @@ ws@^3.3.1: ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: async-limiter "~1.0.0" xcode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xcode/-/xcode-1.0.0.tgz#e1f5b1443245ded38c180796df1a10fdeda084ec" - integrity sha1-4fWxRDJF3tOMGAeW3xoQ/e2ghOw= dependencies: pegjs "^0.10.0" simple-plist "^0.2.1" @@ -6613,88 +5927,72 @@ xcode@^1.0.0: xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xml@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= xmlbuilder@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - integrity sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M= xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= xmldoc@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888" - integrity sha1-0lciS+g5PqrL+DfvIn/Y7CWzaIg= dependencies: sax "~1.1.1" xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= xpipe@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" - integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= "y18n@^3.2.1 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: camelcase "^4.1.0" yargs@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: cliui "^4.0.0" decamelize "^2.0.0" @@ -6712,7 +6010,6 @@ yargs@^12.0.2: yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= dependencies: camelcase "^4.1.0" cliui "^3.2.0" From 53735449d47a456f140743eca7479f3c9e47e25e Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 8 Nov 2018 11:16:43 +0100 Subject: [PATCH 06/10] Bump dependency on React Native for review --- .flowconfig | 3 --- package.json | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.flowconfig b/.flowconfig index bee33ca3d82a96..201974848b968b 100644 --- a/.flowconfig +++ b/.flowconfig @@ -2,9 +2,6 @@ ; We fork some components by platform .*/*[.]android.js -; Ignore templates for 'react-native init' -.*/local-cli/templates/.* - ; Ignore the Dangerfile /bots/dangerfile.js diff --git a/package.json b/package.json index cb144075ee181b..9bb1bbf959c2b7 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "prop-types": "^15.5.8", "react-clone-referenced-element": "^1.0.1", "react-devtools-core": "^3.4.0", - "react-native-local-cli": "^0.57.0", + "react-native-local-cli": "1.0.0-alpha.0", "regenerator-runtime": "^0.11.0", "rimraf": "^2.5.4", "semver": "^5.0.3", From af5e7cf1578d7e2bc637336d58526b3cf9834d6a Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Fri, 9 Nov 2018 11:47:45 +0100 Subject: [PATCH 07/10] Bump CLI version for review --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 9bb1bbf959c2b7..135a3972862774 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,6 @@ "setupBabel.js", "Libraries", "LICENSE", - "local-cli", "packager", "react.gradle", "React.podspec", @@ -120,7 +119,7 @@ "third-party-podspecs" ], "scripts": { - "start": "node ./local-cli/cli.js start", + "start": "react-native start", "test": "jest", "test-ci": "JEST_JUNIT_OUTPUT=\"reports/junit/js-test-results.xml\" jest --maxWorkers=2 --ci --testResultsProcessor=\"jest-junit\"", "flow": "flow", @@ -187,7 +186,7 @@ "prop-types": "^15.5.8", "react-clone-referenced-element": "^1.0.1", "react-devtools-core": "^3.4.0", - "react-native-local-cli": "1.0.0-alpha.0", + "react-native-local-cli": "1.0.0-alpha.2", "regenerator-runtime": "^0.11.0", "rimraf": "^2.5.4", "semver": "^5.0.3", From c200278365c704139eeff4a8a8f9520f96e843b5 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Fri, 9 Nov 2018 14:19:13 +0100 Subject: [PATCH 08/10] Bump CLI dependency to fix tests --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 135a3972862774..4ff44b18dfab8b 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "flow", "flow-github", "init.sh", + "local-cli", "scripts/ios-configure-glog.sh", "scripts/ios-install-third-party.sh", "scripts/launchPackager.bat", @@ -186,7 +187,7 @@ "prop-types": "^15.5.8", "react-clone-referenced-element": "^1.0.1", "react-devtools-core": "^3.4.0", - "react-native-local-cli": "1.0.0-alpha.2", + "react-native-local-cli": "1.0.0-3", "regenerator-runtime": "^0.11.0", "rimraf": "^2.5.4", "semver": "^5.0.3", From 83ae4ba323c1b0b1484c9f078caef90ff544be3e Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Fri, 9 Nov 2018 14:23:57 +0100 Subject: [PATCH 09/10] Fix CLI version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4ff44b18dfab8b..0c8b2baf5bcadb 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "prop-types": "^15.5.8", "react-clone-referenced-element": "^1.0.1", "react-devtools-core": "^3.4.0", - "react-native-local-cli": "1.0.0-3", + "react-native-local-cli": "1.0.0-alpha.3", "regenerator-runtime": "^0.11.0", "rimraf": "^2.5.4", "semver": "^5.0.3", From 2287be4bb2ec5d234a0b9ea5ef373e79055ace3a Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Fri, 9 Nov 2018 15:36:57 +0100 Subject: [PATCH 10/10] Bump CLI dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0c8b2baf5bcadb..cfb9af18b524ea 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,7 @@ "prop-types": "^15.5.8", "react-clone-referenced-element": "^1.0.1", "react-devtools-core": "^3.4.0", - "react-native-local-cli": "1.0.0-alpha.3", + "react-native-local-cli": "1.0.0-alpha.4", "regenerator-runtime": "^0.11.0", "rimraf": "^2.5.4", "semver": "^5.0.3",