diff --git a/RNTester/android/app/build.gradle b/RNTester/android/app/build.gradle index f0f5926139f923..530876fcf76016 100644 --- a/RNTester/android/app/build.gradle +++ b/RNTester/android/app/build.gradle @@ -92,7 +92,6 @@ def enableProguardInReleaseBuilds = true android { compileSdkVersion 27 - buildToolsVersion "27.0.3" defaultConfig { applicationId "com.facebook.react.uiapp" diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 36ed9fec52cb0f..c901fa3d4d39b3 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -12,6 +12,7 @@ plugins { import de.undercouch.gradle.tasks.download.Download import org.apache.tools.ant.taskdefs.condition.Os import org.apache.tools.ant.filters.ReplaceTokens +import groovy.json.JsonSlurper // We download various C++ open-source dependencies into downloads. // We then copy both the downloaded code and our custom makefiles and headers into third-party-ndk. @@ -68,7 +69,7 @@ task prepareDoubleConversion(dependsOn: dependenciesPath ? [] : [downloadDoubleC from dependenciesPath ?: tarTree(downloadDoubleConversion.dest) from 'src/main/jni/third-party/double-conversion/Android.mk' include "double-conversion-${DOUBLE_CONVERSION_VERSION}/src/**/*", 'Android.mk' - filesMatching('*/src/**/*', {fname -> fname.path = "double-conversion/${fname.name}"}) + filesMatching('*/src/**/*', { fname -> fname.path = "double-conversion/${fname.name}" }) includeEmptyDirs = false into "$thirdPartyNdkDir/double-conversion" } @@ -84,17 +85,17 @@ task prepareFolly(dependsOn: dependenciesPath ? [] : [downloadFolly], type: Copy from dependenciesPath ?: tarTree(downloadFolly.dest) from 'src/main/jni/third-party/folly/Android.mk' include "folly-${FOLLY_VERSION}/folly/**/*", 'Android.mk' - eachFile {fname -> fname.path = (fname.path - "folly-${FOLLY_VERSION}/")} + eachFile { fname -> fname.path = (fname.path - "folly-${FOLLY_VERSION}/") } includeEmptyDirs = false // Patch for folly build break on gcc 4.9 and could be removed after build by clang filesMatching('**/container/detail/F14Policy.h') { filter(ReplaceTokens, tokens: [ - 'ObjectHolder(Args&&... args) : value_{std::forward(args)...} {}': 'ObjectHolder(Args&&... args) : value_({std::forward(args)...}) {}', - 'ObjectHolder(Args&&... args) : T{std::forward(args)...} {}': 'ObjectHolder(Args&&... args) : T({std::forward(args)...}) {}', + 'ObjectHolder(Args&&... args) : value_{std::forward(args)...} {}': 'ObjectHolder(Args&&... args) : value_({std::forward(args)...}) {}', + 'ObjectHolder(Args&&... args) : T{std::forward(args)...} {}' : 'ObjectHolder(Args&&... args) : T({std::forward(args)...}) {}', ], - beginToken: '', - endToken: '') + beginToken: '', + endToken: '') } into "$thirdPartyNdkDir/folly" @@ -116,20 +117,20 @@ task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy) includeEmptyDirs = false filesMatching('**/*.h.in') { filter(ReplaceTokens, tokens: [ - ac_cv_have_unistd_h: '1', - ac_cv_have_stdint_h: '1', - ac_cv_have_systypes_h: '1', - ac_cv_have_inttypes_h: '1', - ac_cv_have_libgflags: '0', - ac_google_start_namespace: 'namespace google {', - ac_cv_have_uint16_t: '1', - ac_cv_have_u_int16_t: '1', - ac_cv_have___uint16: '0', - ac_google_end_namespace: '}', - ac_cv_have___builtin_expect: '1', - ac_google_namespace: 'google', - ac_cv___attribute___noinline: '__attribute__ ((noinline))', - ac_cv___attribute___noreturn: '__attribute__ ((noreturn))', + ac_cv_have_unistd_h : '1', + ac_cv_have_stdint_h : '1', + ac_cv_have_systypes_h : '1', + ac_cv_have_inttypes_h : '1', + ac_cv_have_libgflags : '0', + ac_google_start_namespace : 'namespace google {', + ac_cv_have_uint16_t : '1', + ac_cv_have_u_int16_t : '1', + ac_cv_have___uint16 : '0', + ac_google_end_namespace : '}', + ac_cv_have___builtin_expect : '1', + ac_google_namespace : 'google', + ac_cv___attribute___noinline : '__attribute__ ((noinline))', + ac_cv___attribute___noreturn : '__attribute__ ((noreturn))', ac_cv___attribute___printf_4_5: '__attribute__((__format__ (__printf__, 4, 5)))' ]) it.path = (it.name - '.in') @@ -145,40 +146,61 @@ task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy) } } -task downloadJSCHeaders(type: Download) { - // in sync with webkit SVN revision 174650 - def jscAPIBaseURL = 'https://raw.githubusercontent.com/WebKit/webkit/38b15a3ba3c1b0798f2036f7cea36ffdc096202e/Source/JavaScriptCore/API/' - def jscHeaderFiles = ['JavaScript.h', 'JSBase.h', 'JSContextRef.h', 'JSObjectRef.h', 'JSStringRef.h', 'JSValueRef.h', 'WebKitAvailability.h'] - def output = new File(downloadsDir, 'jsc') - output.mkdirs() - src(jscHeaderFiles.collect { headerName -> "$jscAPIBaseURL$headerName" }) +def readFromCommandLine(String cmd) { + new ByteArrayOutputStream().withStream { os -> + exec { + standardOutput os + commandLine cmd.split(" ") + }.assertNormalExitValue() + return os.toString().trim() + } +} + +def isIdeBuild() { + return project.properties['android.injected.invoked.from.ide'] == 'true' +} + +task downloadJSC(dependsOn: createNativeDepsDirectories, type: Download) { + if (isIdeBuild()) return + + def packageJson = new JsonSlurper().parse(file("${rootDir}/package.json")) + def jscVersionName = packageJson.devDependencies["jsc-android"] + def jscVersion = readFromCommandLine("npm info jsc-android@$jscVersionName version") + def url = readFromCommandLine("npm info jsc-android@$jscVersionName dist.tarball") + src "$url" onlyIfNewer true overwrite false - dest output + dest new File(downloadsDir, "jsc-${jscVersion}.tar.gz") } -// Create Android.mk library module based on so files from mvn + include headers fetched from webkit.org -task prepareJSC(dependsOn: dependenciesPath ? [] : [downloadJSCHeaders]) { - doLast { - copy { - from zipTree(configurations.compile.fileCollection { dep -> dep.name == 'android-jsc' }.singleFile) - from dependenciesPath ? "$dependenciesPath/jsc-headers" : {downloadJSCHeaders.dest} - from 'src/main/jni/third-party/jsc' - include 'jni/**/*.so', '*.h', 'Android.mk' - filesMatching('*.h', { fname -> fname.path = "JavaScriptCore/${fname.path}"}) - into "$thirdPartyNdkDir/jsc"; - } +// Create Android.mk library module based on jsc from npm +task prepareJSC(dependsOn: downloadJSC) << { + copy { + def jscTar = tarTree(downloadJSC.dest) + def jscAAR = jscTar.matching({ it.include "**/android-jsc/**/*.aar" }).singleFile + def soFiles = zipTree(jscAAR).matching({ it.include "**/*.so" }) + + def headerFiles = jscTar.matching({ it.include "**/include/*.h" }) + + from soFiles + from headerFiles + from "src/main/jni/third-party/jsc/Android.mk" + + filesMatching("**/*.h", { it.path = "JavaScriptCore/${it.name}"}) + + includeEmptyDirs false + into "$thirdPartyNdkDir/jsc" } } task downloadNdkBuildDependencies { - if (!boostPath) { - dependsOn downloadBoost - } - dependsOn downloadDoubleConversion - dependsOn downloadFolly - dependsOn downloadGlog - dependsOn downloadJSCHeaders + if (!boostPath) { + dependsOn downloadBoost + } + dependsOn downloadDoubleConversion + dependsOn downloadFolly + dependsOn downloadGlog + dependsOn downloadJSC } def getNdkBuildName() { @@ -217,23 +239,23 @@ def getNdkBuildFullPath() { def ndkBuildFullPath = findNdkBuildFullPath() if (ndkBuildFullPath == null) { throw new GradleScriptException( - "ndk-build binary cannot be found, check if you've set " + - "\$ANDROID_NDK environment variable correctly or if ndk.dir is " + - "setup in local.properties", - null) + "ndk-build binary cannot be found, check if you've set " + + "\$ANDROID_NDK environment variable correctly or if ndk.dir is " + + "setup in local.properties", + null) } if (!new File(ndkBuildFullPath).canExecute()) { throw new GradleScriptException( - "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" + - "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n" + - "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)", - null) + "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" + + "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n" + + "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)", + null) } return ndkBuildFullPath } task buildReactNdkLib(dependsOn: [prepareJSC, prepareBoost, prepareDoubleConversion, prepareFolly, prepareGlog], type: Exec) { - inputs.dir('src/main/jni/react') + inputs.file('src/main/jni/react') outputs.dir("$buildDir/react-ndk/all") commandLine getNdkBuildFullPath(), 'NDK_PROJECT_PATH=null', @@ -244,21 +266,27 @@ task buildReactNdkLib(dependsOn: [prepareJSC, prepareBoost, prepareDoubleConvers "REACT_COMMON_DIR=$projectDir/../ReactCommon", "REACT_SRC_DIR=$projectDir/src/main/java/com/facebook/react", '-C', file('src/main/jni/react/jni').absolutePath, - '--jobs', project.hasProperty("jobs") ? project.property("jobs") : Runtime.runtime.availableProcessors() + '--jobs', project.findProperty("jobs") ?: Runtime.runtime.availableProcessors() } task cleanReactNdkLib(type: Exec) { + ignoreExitValue true + errorOutput new ByteArrayOutputStream() commandLine getNdkBuildFullPath(), "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", "THIRD_PARTY_NDK_DIR=$buildDir/third-party-ndk", "REACT_COMMON_DIR=$projectDir/../ReactCommon", '-C', file('src/main/jni/react/jni').absolutePath, 'clean' + doLast { + file(AAR_OUTPUT_URL).delete() + println "Deleted aar output dir at ${file(AAR_OUTPUT_URL)}" + } } task packageReactNdkLibs(dependsOn: buildReactNdkLib, type: Copy) { from "$buildDir/react-ndk/all" - exclude '**/libjsc.so' + from "$thirdPartyNdkDir/jsc/jni" into "$buildDir/react-ndk/exported" } @@ -269,7 +297,6 @@ task packageReactNdkLibsForBuck(dependsOn: packageReactNdkLibs, type: Copy) { android { compileSdkVersion 27 - buildToolsVersion "27.0.3" defaultConfig { minSdkVersion 16 @@ -291,7 +318,7 @@ android { sourceSets.main { jni.srcDirs = [] - jniLibs.srcDirs = ["$buildDir/react-ndk/exported", 'src/main/jni/third-party/jsc/jni'] + jniLibs.srcDir "$buildDir/react-ndk/exported" res.srcDirs = ['src/main/res/devsupport', 'src/main/res/shell', 'src/main/res/views/modal', 'src/main/res/views/uimanager'] java { srcDirs = ['src/main/java', 'src/main/libraries/soloader/java', 'src/main/jni/first-party/fb/jni/java'] @@ -326,7 +353,6 @@ dependencies { api "com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}" api "com.squareup.okhttp3:okhttp-urlconnection:${OKHTTP_VERSION}" api 'com.squareup.okio:okio:1.14.0' - compile 'org.webkit:android-jsc:r174650' testImplementation "junit:junit:${JUNIT_VERSION}" testImplementation "org.powermock:powermock-api-mockito:${POWERMOCK_VERSION}" diff --git a/ReactAndroid/release.gradle b/ReactAndroid/release.gradle index cc66a47e39eb65..6fba6f20c98c43 100644 --- a/ReactAndroid/release.gradle +++ b/ReactAndroid/release.gradle @@ -6,6 +6,10 @@ apply plugin: 'maven' apply plugin: 'signing' +ext { + AAR_OUTPUT_URL = "file://${projectDir}/../android" +} + // Gradle tasks for publishing to maven // 1) To install in local maven repo use :installArchives task // 2) To upload artifact to maven central use: :uploadArchives (you'd need to have the permission to do that) @@ -15,15 +19,15 @@ def isReleaseBuild() { } def getRepositoryUrl() { - return project.hasProperty('repositoryUrl') ? property('repositoryUrl') : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + return project.findProperty('repositoryUrl') ?: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' } def getRepositoryUsername() { - return project.hasProperty('repositoryUsername') ? property('repositoryUsername') : '' + return project.findProperty('repositoryUsername') ?: '' } def getRepositoryPassword() { - return project.hasProperty('repositoryPassword') ? property('repositoryPassword') : '' + return project.findProperty('repositoryPassword') ?: '' } def configureReactNativePom(def pom) { @@ -128,7 +132,7 @@ afterEvaluate { project -> configuration = configurations.archives repositories.mavenDeployer { // Deploy to react-native/android, ready to publish to npm - repository url: "file://${projectDir}/../android" + repository url: AAR_OUTPUT_URL configureReactNativePom pom } diff --git a/ReactAndroid/src/main/jni/Application.mk b/ReactAndroid/src/main/jni/Application.mk index 942a122de79183..c73c0397f5d24d 100644 --- a/ReactAndroid/src/main/jni/Application.mk +++ b/ReactAndroid/src/main/jni/Application.mk @@ -24,11 +24,11 @@ APP_MK_DIR := $(dir $(lastword $(MAKEFILE_LIST))) # etc.) are defined inside build.gradle. NDK_MODULE_PATH := $(APP_MK_DIR)$(HOST_DIRSEP)$(THIRD_PARTY_NDK_DIR)$(HOST_DIRSEP)$(REACT_COMMON_DIR)$(HOST_DIRSEP)$(APP_MK_DIR)first-party$(HOST_DIRSEP)$(REACT_SRC_DIR) -APP_STL := gnustl_shared +APP_STL := c++_shared # Make sure every shared lib includes a .note.gnu.build-id header APP_CFLAGS := -Wall -Werror APP_CPPFLAGS := -std=c++1y APP_LDFLAGS := -Wl,--build-id -NDK_TOOLCHAIN_VERSION := 4.9 +NDK_TOOLCHAIN_VERSION := clang diff --git a/ReactAndroid/src/main/jni/react/jni/Android.mk b/ReactAndroid/src/main/jni/react/jni/Android.mk index 85e5fddc769de8..9259233cca8691 100644 --- a/ReactAndroid/src/main/jni/react/jni/Android.mk +++ b/ReactAndroid/src/main/jni/react/jni/Android.mk @@ -17,7 +17,7 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH) # ./../ == react LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../.. -LOCAL_CFLAGS += -fexceptions -frtti +LOCAL_CFLAGS += -fexceptions -frtti -Wno-unused-lambda-capture LOCAL_LDLIBS += -landroid diff --git a/ReactAndroid/src/main/jni/third-party/folly/Android.mk b/ReactAndroid/src/main/jni/third-party/folly/Android.mk index 4700879022a26d..e285d10666f5e9 100644 --- a/ReactAndroid/src/main/jni/third-party/folly/Android.mk +++ b/ReactAndroid/src/main/jni/third-party/folly/Android.mk @@ -26,6 +26,7 @@ FOLLY_FLAGS := \ -DFOLLY_NO_CONFIG=1 \ -DFOLLY_HAVE_CLOCK_GETTIME=1 \ -DFOLLY_HAVE_MEMRCHR=1 \ + -DFOLLY_USE_LIBCPP=1 # If APP_PLATFORM in Application.mk targets android-23 above, please comment this line. # NDK uses GNU style stderror_r() after API 23. diff --git a/ReactAndroid/src/main/jni/third-party/glog/Android.mk b/ReactAndroid/src/main/jni/third-party/glog/Android.mk index 1abd09655046d0..33ea07c9a26ab2 100644 --- a/ReactAndroid/src/main/jni/third-party/glog/Android.mk +++ b/ReactAndroid/src/main/jni/third-party/glog/Android.mk @@ -23,7 +23,8 @@ LOCAL_CFLAGS += \ -g \ -O2 \ -D_START_GOOGLE_NAMESPACE_="namespace google {" \ - -D_END_GOOGLE_NAMESPACE_="}" + -D_END_GOOGLE_NAMESPACE_="}" \ + -DHAVE_PREAD=1 LOCAL_MODULE := glog diff --git a/ReactCommon/cxxreact/Android.mk b/ReactCommon/cxxreact/Android.mk index faf9935abee4c2..cd234d418c51fd 100644 --- a/ReactCommon/cxxreact/Android.mk +++ b/ReactCommon/cxxreact/Android.mk @@ -17,7 +17,7 @@ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) LOCAL_CFLAGS := \ -DLOG_TAG=\"ReactNative\" -LOCAL_CFLAGS += -fexceptions -frtti +LOCAL_CFLAGS += -fexceptions -frtti -Wno-unused-lambda-capture LOCAL_STATIC_LIBRARIES := boost LOCAL_SHARED_LIBRARIES := jsinspector libfolly_json glog diff --git a/build.gradle b/build.gradle index f85d59f03c1adb..7db77a75ee0e1d 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.1' classpath 'de.undercouch:gradle-download-task:3.4.3' // NOTE: Do not place your application dependencies here; they belong @@ -30,8 +30,3 @@ allprojects { } } } - -task wrapper(type: Wrapper) { - gradleVersion = '4.4' - distributionUrl = distributionUrl.replace("bin", "all") -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 01b8bf6b1f99ca..29953ea141f55e 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b6517bb1d16502..d76b502e226a5c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/gradlew.bat b/gradlew.bat index 1934213b6ddee5..e95643d6a2ca62 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,8 +1,3 @@ -:: Copyright (c) 2015-present, Facebook, Inc. -:: -:: This source code is licensed under the MIT license found in the -:: LICENSE file in the root directory of this source tree. - @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem diff --git a/local-cli/templates/HelloWorld/android/app/build.gradle b/local-cli/templates/HelloWorld/android/app/build.gradle index a123b6cfb34a73..b86e047a8a54c7 100644 --- a/local-cli/templates/HelloWorld/android/app/build.gradle +++ b/local-cli/templates/HelloWorld/android/app/build.gradle @@ -95,7 +95,6 @@ def enableProguardInReleaseBuilds = false android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.helloworld" @@ -109,7 +108,7 @@ android { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a" + include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } buildTypes { @@ -123,7 +122,7 @@ android { 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 versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = diff --git a/local-cli/templates/HelloWorld/android/build.gradle b/local-cli/templates/HelloWorld/android/build.gradle index 7fde4f576be839..e205718ce2cf10 100644 --- a/local-cli/templates/HelloWorld/android/build.gradle +++ b/local-cli/templates/HelloWorld/android/build.gradle @@ -2,7 +2,6 @@ buildscript { ext { - buildToolsVersion = "27.0.3" minSdkVersion = 16 compileSdkVersion = 27 targetSdkVersion = 27 @@ -13,7 +12,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -31,9 +30,3 @@ allprojects { } } } - - -task wrapper(type: Wrapper) { - gradleVersion = '4.4' - distributionUrl = distributionUrl.replace("bin", "all") -} diff --git a/local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.properties b/local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.properties index b6517bb1d16502..019065d1d650ce 100644 --- a/local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.properties +++ b/local-cli/templates/HelloWorld/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/package.json b/package.json index 0c3c087e2817e8..fa94b8a3061403 100644 --- a/package.json +++ b/package.json @@ -223,6 +223,7 @@ "flow-bin": "^0.86.0", "jest": "24.0.0-alpha.6", "jest-junit": "5.2.0", + "jsc-android": "latest", "prettier": "1.13.6", "react": "16.6.1", "react-native-dummy": "0.1.0", diff --git a/yarn.lock b/yarn.lock index 5d7366294a7e63..7dd45917b629ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3938,6 +3938,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsc-android@latest: + version "236355.1.1" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-236355.1.1.tgz#43e153b722e3c60dd0595be4e7430baf65e67c9c" + integrity sha512-2py4f0McZIl/oH6AzPj1Ebutc58fyeLvwq6gyVYp1RsWr4qeLNHAPfW3kmfeVMz44oUBJMQ0lECZg9n4KBhHbQ== + jsdom@^11.5.1: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"