diff --git a/.github/workflows/ios-build-test.yml b/.github/workflows/ios-build-test.yml index 71668739b..0566bbe3b 100644 --- a/.github/workflows/ios-build-test.yml +++ b/.github/workflows/ios-build-test.yml @@ -6,6 +6,9 @@ on: - 'RNSVG.podspec' - 'apple/**' - 'Example/ios/**' + - 'src/fabric/**' + - 'FabricExample/**' + - 'package.json' push: branches: - main @@ -15,7 +18,7 @@ jobs: runs-on: macos-12 strategy: matrix: - working-directory: [Example] + working-directory: [Example, FabricExample] concurrency: group: ios-${{ matrix.working-directory }}-${{ github.ref }} steps: diff --git a/Example/ios/Podfile.lock b/Example/ios/Podfile.lock index 53e30d2fa..36b9a25ef 100644 --- a/Example/ios/Podfile.lock +++ b/Example/ios/Podfile.lock @@ -347,7 +347,7 @@ PODS: - React-jsi (= 0.68.0-rc.1) - React-logger (= 0.68.0-rc.1) - React-perflogger (= 0.68.0-rc.1) - - RNSVG (12.4.0): + - RNSVG (12.4.4): - React-Core - SocketRocket (0.6.0) - Yoga (1.14.0) @@ -540,7 +540,7 @@ SPEC CHECKSUMS: React-RCTVibration: 5cab6419b68d5750482b0fc34dbb27af550469cc React-runtimeexecutor: 10cda3a396b14a764a5f86088e7e3810b9c66cec ReactCommon: 73a01eb83f22c84a6b09dfb60f3463888ebd4975 - RNSVG: 3dd44d99d1c18e1342aee4bfa53ab3f6a8c4865f + RNSVG: ce63dc0dfa033974c70812171a76a5973db7c64a SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: d29dba374c1a582b40cfb736647b5e1b5ed35dba YogaKit: f782866e155069a2cca2517aafea43200b01fd5a diff --git a/Example/macos/Podfile.lock b/Example/macos/Podfile.lock index a777cfb26..69d711a4e 100644 --- a/Example/macos/Podfile.lock +++ b/Example/macos/Podfile.lock @@ -338,7 +338,7 @@ PODS: - React-jsi (= 0.66.17) - React-logger (= 0.66.17) - React-perflogger (= 0.66.17) - - RNSVG (12.2.0): + - RNSVG (12.4.4): - React-Core - Yoga (1.14.0) - YogaKit (1.18.1): @@ -528,10 +528,10 @@ SPEC CHECKSUMS: React-RCTVibration: 2a3a67f22b60d7a8faa805c69a18dee356669320 React-runtimeexecutor: 3404d9c610a682e710e91e69b45b1e07fb6efad0 ReactCommon: 89d1b7528338d4ae4c44d3459582785d212832ea - RNSVG: 4ecc2e8f38b6ebe7889909570c26f3abe8059767 + RNSVG: ce63dc0dfa033974c70812171a76a5973db7c64a Yoga: 0664982d23529e0767fc7f364ad9b8e06aa713c7 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a PODFILE CHECKSUM: 3977aa53ea9660368db33335fc1e16c0a720ca09 -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/FabricExample/.buckconfig b/FabricExample/.buckconfig new file mode 100644 index 000000000..934256cb2 --- /dev/null +++ b/FabricExample/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/FabricExample/.eslintrc.js b/FabricExample/.eslintrc.js new file mode 100644 index 000000000..40c6dcd05 --- /dev/null +++ b/FabricExample/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native-community', +}; diff --git a/FabricExample/.flowconfig b/FabricExample/.flowconfig new file mode 100644 index 000000000..975227dab --- /dev/null +++ b/FabricExample/.flowconfig @@ -0,0 +1,67 @@ +[ignore] +; We fork some components by platform +.*/*[.]android.js + +; Ignore "BUCK" generated dirs +/\.buckd/ + +; Ignore polyfills +node_modules/react-native/Libraries/polyfills/.* + +; Flow doesn't support platforms +.*/Libraries/Utilities/LoadingView.js + +.*/node_modules/resolve/test/resolver/malformed_package_json/package\.json$ + +[untyped] +.*/node_modules/@react-native-community/cli/.*/.* + +[include] + +[libs] +node_modules/react-native/interface.js +node_modules/react-native/flow/ + +[options] +emoji=true + +exact_by_default=true + +format.bracket_spacing=false + +module.file_ext=.js +module.file_ext=.json +module.file_ext=.ios.js + +munge_underscores=true + +module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' +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\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FlowFixMeProps +suppress_type=$FlowFixMeState + +[lints] +sketchy-null-number=warn +sketchy-null-mixed=warn +sketchy-number=warn +untyped-type-import=warn +nonstrict-import=warn +deprecated-type=warn +unsafe-getters-setters=warn +unnecessary-invariant=warn +signature-verification-failure=warn + +[strict] +deprecated-type +nonstrict-import +sketchy-null +unclear-type +unsafe-getters-setters +untyped-import +untyped-type-import + +[version] +^0.170.0 diff --git a/FabricExample/.gitignore b/FabricExample/.gitignore new file mode 100644 index 000000000..81570d991 --- /dev/null +++ b/FabricExample/.gitignore @@ -0,0 +1,61 @@ +# 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 + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore +!debug.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 + +# Ruby / CocoaPods +/ios/Pods/ +/vendor/bundle/ diff --git a/FabricExample/.prettierrc.js b/FabricExample/.prettierrc.js new file mode 100644 index 000000000..2b540746a --- /dev/null +++ b/FabricExample/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + arrowParens: 'avoid', + bracketSameLine: true, + bracketSpacing: false, + singleQuote: true, + trailingComma: 'all', +}; diff --git a/FabricExample/.watchmanconfig b/FabricExample/.watchmanconfig new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/FabricExample/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/FabricExample/Gemfile b/FabricExample/Gemfile new file mode 100644 index 000000000..2c3edcf4b --- /dev/null +++ b/FabricExample/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby '2.7.4' + +gem 'cocoapods', '~> 1.11', '>= 1.11.2' diff --git a/FabricExample/Gemfile.lock b/FabricExample/Gemfile.lock new file mode 100644 index 000000000..99e810cbd --- /dev/null +++ b/FabricExample/Gemfile.lock @@ -0,0 +1,100 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.5) + rexml + activesupport (6.1.5) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + claide (1.1.0) + cocoapods (1.11.3) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.11.3) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 1.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.11.3) + activesupport (>= 5.0, < 7) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (1.5.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.1.9) + escape (0.0.4) + ethon (0.15.0) + ffi (>= 1.15.0) + ffi (1.15.5) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.8.3) + i18n (1.10.0) + concurrent-ruby (~> 1.0) + json (2.6.1) + minitest (5.15.0) + molinillo (0.8.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + public_suffix (4.0.6) + rexml (3.2.5) + ruby-macho (2.5.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) + xcodeproj (1.21.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + zeitwerk (2.5.4) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods (~> 1.11, >= 1.11.2) + +RUBY VERSION + ruby 2.7.4p191 + +BUNDLED WITH + 2.2.27 diff --git a/FabricExample/_bundle/config b/FabricExample/_bundle/config new file mode 100644 index 000000000..848943bb5 --- /dev/null +++ b/FabricExample/_bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/FabricExample/_ruby-version b/FabricExample/_ruby-version new file mode 100644 index 000000000..a4dd9dba4 --- /dev/null +++ b/FabricExample/_ruby-version @@ -0,0 +1 @@ +2.7.4 diff --git a/FabricExample/android/app/_BUCK b/FabricExample/android/app/_BUCK new file mode 100644 index 000000000..4f34d4512 --- /dev/null +++ b/FabricExample/android/app/_BUCK @@ -0,0 +1,55 @@ +# 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.fabricexample", +) + +android_resource( + name = "res", + package = "com.fabricexample", + 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/FabricExample/android/app/build.gradle b/FabricExample/android/app/build.gradle new file mode 100644 index 000000000..aaad0a814 --- /dev/null +++ b/FabricExample/android/app/build.gradle @@ -0,0 +1,321 @@ +apply plugin: "com.android.application" + +import com.android.build.OutputFile +import org.apache.tools.ant.taskdefs.condition.Os + +/** + * 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. If none specified and + * // "index.android.js" exists, it will be used. Otherwise "index.js" is + * // default. Can be overridden with ENTRY_FILE environment variable. + * entryFile: "index.android.js", + * + * // https://reactnative.dev/docs/performance#enable-the-ram-format + * bundleCommand: "ram-bundle", + * + * // 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 = [ + enableHermes: false, // clean and rebuild if changing +] + +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 + +/** + * The preferred build flavor of JavaScriptCore. + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +/** + * Whether to enable the Hermes VM. + * + * This should be set on project.ext.react and that value will be read here. If it is not set + * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode + * and the benefits of using Hermes will therefore be sharply reduced. + */ +def enableHermes = project.ext.react.get("enableHermes", false); + +/** + * Architectures to build native code for. + */ +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + +android { + ndkVersion rootProject.ext.ndkVersion + + compileSdkVersion rootProject.ext.compileSdkVersion + + defaultConfig { + applicationId "com.fabricexample" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() + + if (isNewArchitectureEnabled()) { + // We configure the NDK build only if you decide to opt-in for the New Architecture. + externalNativeBuild { + ndkBuild { + arguments "APP_PLATFORM=android-21", + "APP_STL=c++_shared", + "NDK_TOOLCHAIN_VERSION=clang", + "GENERATED_SRC_DIR=$buildDir/generated/source", + "PROJECT_BUILD_DIR=$buildDir", + "REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid", + "REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build" + cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1" + cppFlags "-std=c++17" + // Make sure this target name is the same you specify inside the + // src/main/jni/Android.mk file for the `LOCAL_MODULE` variable. + targets "fabricexample_appmodules" + + // Fix for windows limit on number of character in file paths and in command lines + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + arguments "NDK_OUT=${rootProject.projectDir.getParent()}\\.cxx", + "NDK_APP_SHORT_COMMANDS=true" + } + } + } + if (!enableSeparateBuildPerCPUArchitecture) { + ndk { + abiFilters (*reactNativeArchitectures()) + } + } + } + } + + if (isNewArchitectureEnabled()) { + // We configure the NDK build only if you decide to opt-in for the New Architecture. + externalNativeBuild { + ndkBuild { + path "$projectDir/src/main/jni/Android.mk" + } + } + def reactAndroidProjectDir = project(':ReactAndroid').projectDir + def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) { + dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") + into("$buildDir/react-ndk/exported") + } + def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) { + dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck") + from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib") + into("$buildDir/react-ndk/exported") + } + afterEvaluate { + // If you wish to add a custom TurboModule or component locally, + // you should uncomment this line. + // preBuild.dependsOn("generateCodegenArtifactsFromSchema") + preDebugBuild.dependsOn(packageReactNdkDebugLibs) + preReleaseBuild.dependsOn(packageReactNdkReleaseLibs) + + // Due to a bug inside AGP, we have to explicitly set a dependency + // between configureNdkBuild* tasks and the preBuild tasks. + // This can be removed once this is solved: https://issuetracker.google.com/issues/207403732 + configureNdkBuildRelease.dependsOn(preReleaseBuild) + configureNdkBuildDebug.dependsOn(preDebugBuild) + reactNativeArchitectures().each { architecture -> + tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure { + dependsOn("preDebugBuild") + } + tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure { + dependsOn("preReleaseBuild") + } + } + } + } + + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include (*reactNativeArchitectures()) + } + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + 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: + // https://developer.android.com/studio/build/configure-apk-splits.html + // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. + 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 = + defaultConfig.versionCode * 1000 + versionCodes.get(abi) + } + + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + + //noinspection GradleDynamicVersion + implementation "com.facebook.react:react-native:+" // From node_modules + + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" + + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { + exclude group:'com.facebook.fbjni' + } + + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group:'com.facebook.flipper' + exclude group:'com.squareup.okhttp3', module:'okhttp' + } + + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { + exclude group:'com.facebook.flipper' + } + + if (enableHermes) { + def hermesPath = "../../node_modules/hermes-engine/android/"; + debugImplementation files(hermesPath + "hermes-debug.aar") + releaseImplementation files(hermesPath + "hermes-release.aar") + } else { + implementation jscFlavor + } +} + +if (isNewArchitectureEnabled()) { + // If new architecture is enabled, we let you build RN from source + // Otherwise we fallback to a prebuilt .aar bundled in the NPM package. + // This will be applied to all the imported transtitive dependency. + configurations.all { + resolutionStrategy.dependencySubstitution { + substitute(module("com.facebook.react:react-native")) + .using(project(":ReactAndroid")).because("On New Architecture we're building React Native from source") + } + } +} + +// 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.implementation + into 'libs' +} + +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) + +def isNewArchitectureEnabled() { + // To opt-in for the New Architecture, you can either: + // - Set `newArchEnabled` to true inside the `gradle.properties` file + // - Invoke gradle with `-newArchEnabled=true` + // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true` + return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" +} \ No newline at end of file diff --git a/FabricExample/android/app/build_defs.bzl b/FabricExample/android/app/build_defs.bzl new file mode 100644 index 000000000..fff270f8d --- /dev/null +++ b/FabricExample/android/app/build_defs.bzl @@ -0,0 +1,19 @@ +"""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/FabricExample/android/app/debug.keystore b/FabricExample/android/app/debug.keystore new file mode 100644 index 000000000..364e105ed Binary files /dev/null and b/FabricExample/android/app/debug.keystore differ diff --git a/FabricExample/android/app/proguard-rules.pro b/FabricExample/android/app/proguard-rules.pro new file mode 100644 index 000000000..11b025724 --- /dev/null +++ b/FabricExample/android/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# 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: diff --git a/FabricExample/android/app/src/debug/AndroidManifest.xml b/FabricExample/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..4b185bc15 --- /dev/null +++ b/FabricExample/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/FabricExample/android/app/src/debug/java/com/fabricexample/ReactNativeFlipper.java b/FabricExample/android/app/src/debug/java/com/fabricexample/ReactNativeFlipper.java new file mode 100644 index 000000000..e3fe49a75 --- /dev/null +++ b/FabricExample/android/app/src/debug/java/com/fabricexample/ReactNativeFlipper.java @@ -0,0 +1,73 @@ +/** + * Copyright (c) Meta Platforms, Inc. and 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.fabricexample; + +import android.content.Context; +import com.facebook.flipper.android.AndroidFlipperClient; +import com.facebook.flipper.android.utils.FlipperUtils; +import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; +import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; +import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; +import com.facebook.flipper.plugins.inspector.DescriptorMapping; +import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; +import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; +import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; +import com.facebook.flipper.plugins.react.ReactFlipperPlugin; +import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; +import com.facebook.react.ReactInstanceEventListener; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.modules.network.NetworkingModule; +import okhttp3.OkHttpClient; + +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + if (FlipperUtils.shouldEnableFlipper(context)) { + final FlipperClient client = AndroidFlipperClient.getInstance(context); + + client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); + client.addPlugin(new ReactFlipperPlugin()); + client.addPlugin(new DatabasesFlipperPlugin(context)); + client.addPlugin(new SharedPreferencesFlipperPlugin(context)); + client.addPlugin(CrashReporterPlugin.getInstance()); + + NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); + NetworkingModule.setCustomClientBuilder( + new NetworkingModule.CustomClientBuilder() { + @Override + public void apply(OkHttpClient.Builder builder) { + builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); + } + }); + client.addPlugin(networkFlipperPlugin); + client.start(); + + // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized + // Hence we run if after all native modules have been initialized + ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); + if (reactContext == null) { + reactInstanceManager.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(ReactContext reactContext) { + reactInstanceManager.removeReactInstanceEventListener(this); + reactContext.runOnNativeModulesQueueThread( + new Runnable() { + @Override + public void run() { + client.addPlugin(new FrescoFlipperPlugin()); + } + }); + } + }); + } else { + client.addPlugin(new FrescoFlipperPlugin()); + } + } + } +} diff --git a/FabricExample/android/app/src/main/AndroidManifest.xml b/FabricExample/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..e90bc0337 --- /dev/null +++ b/FabricExample/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/FabricExample/android/app/src/main/java/com/fabricexample/MainActivity.java b/FabricExample/android/app/src/main/java/com/fabricexample/MainActivity.java new file mode 100644 index 000000000..0b501ffa4 --- /dev/null +++ b/FabricExample/android/app/src/main/java/com/fabricexample/MainActivity.java @@ -0,0 +1,40 @@ +package com.fabricexample; + +import com.facebook.react.ReactActivity; +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.ReactRootView; + +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 "FabricExample"; + } + + /** + * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and + * you can specify the rendered you wish to use (Fabric or the older renderer). + */ + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new MainActivityDelegate(this, getMainComponentName()); + } + + public static class MainActivityDelegate extends ReactActivityDelegate { + public MainActivityDelegate(ReactActivity activity, String mainComponentName) { + super(activity, mainComponentName); + } + + @Override + protected ReactRootView createRootView() { + ReactRootView reactRootView = new ReactRootView(getContext()); + // If you opted-in for the New Architecture, we enable the Fabric Renderer. + reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); + return reactRootView; + } + } +} diff --git a/FabricExample/android/app/src/main/java/com/fabricexample/MainApplication.java b/FabricExample/android/app/src/main/java/com/fabricexample/MainApplication.java new file mode 100644 index 000000000..5ed55250d --- /dev/null +++ b/FabricExample/android/app/src/main/java/com/fabricexample/MainApplication.java @@ -0,0 +1,91 @@ +package com.fabricexample; + +import android.app.Application; +import android.content.Context; +import com.facebook.react.PackageList; +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.soloader.SoLoader; +import com.fabricexample.newarchitecture.MainApplicationReactNativeHost; +import java.lang.reflect.InvocationTargetException; +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() { + @SuppressWarnings("UnnecessaryLocalVariable") + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + }; + + private final ReactNativeHost mNewArchitectureNativeHost = + new MainApplicationReactNativeHost(this); + + @Override + public ReactNativeHost getReactNativeHost() { + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + return mNewArchitectureNativeHost; + } else { + return mReactNativeHost; + } + } + + @Override + public void onCreate() { + super.onCreate(); + // If you opted-in for the New Architecture, we enable the TurboModule system + ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + SoLoader.init(this, /* native exopackage */ false); + initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + } + + /** + * Loads Flipper in React Native templates. Call this in the onCreate method with something like + * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); + * + * @param context + * @param reactInstanceManager + */ + private static void initializeFlipper( + Context context, ReactInstanceManager reactInstanceManager) { + if (BuildConfig.DEBUG) { + try { + /* + We use reflection here to pick up the class that initializes Flipper, + since Flipper library is not available in release mode + */ + Class aClass = Class.forName("com.fabricexample.ReactNativeFlipper"); + aClass + .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) + .invoke(null, context, reactInstanceManager); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } +} diff --git a/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/MainApplicationReactNativeHost.java b/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/MainApplicationReactNativeHost.java new file mode 100644 index 000000000..0968cb255 --- /dev/null +++ b/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/MainApplicationReactNativeHost.java @@ -0,0 +1,116 @@ +package com.fabricexample.newarchitecture; + +import android.app.Application; +import androidx.annotation.NonNull; +import com.facebook.react.PackageList; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.JSIModulePackage; +import com.facebook.react.bridge.JSIModuleProvider; +import com.facebook.react.bridge.JSIModuleSpec; +import com.facebook.react.bridge.JSIModuleType; +import com.facebook.react.bridge.JavaScriptContextHolder; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.UIManager; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.react.fabric.CoreComponentsRegistry; +import com.facebook.react.fabric.EmptyReactNativeConfig; +import com.facebook.react.fabric.FabricJSIModuleProvider; +import com.facebook.react.uimanager.ViewManagerRegistry; +import com.fabricexample.BuildConfig; +import com.fabricexample.newarchitecture.components.MainComponentsRegistry; +import com.fabricexample.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate; +import java.util.ArrayList; +import java.util.List; + +/** + * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both + * TurboModule delegates and the Fabric Renderer. + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +public class MainApplicationReactNativeHost extends ReactNativeHost { + public MainApplicationReactNativeHost(Application application) { + super(application); + } + + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + // TurboModules must also be loaded here providing a valid TurboReactPackage implementation: + // packages.add(new TurboReactPackage() { ... }); + // If you have custom Fabric Components, their ViewManagers should also be loaded here + // inside a ReactPackage. + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @NonNull + @Override + protected ReactPackageTurboModuleManagerDelegate.Builder + getReactPackageTurboModuleManagerDelegateBuilder() { + // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary + // for the new architecture and to use TurboModules correctly. + return new MainApplicationTurboModuleManagerDelegate.Builder(); + } + + @Override + protected JSIModulePackage getJSIModulePackage() { + return new JSIModulePackage() { + @Override + public List getJSIModules( + final ReactApplicationContext reactApplicationContext, + final JavaScriptContextHolder jsContext) { + final List specs = new ArrayList<>(); + + // Here we provide a new JSIModuleSpec that will be responsible of providing the + // custom Fabric Components. + specs.add( + new JSIModuleSpec() { + @Override + public JSIModuleType getJSIModuleType() { + return JSIModuleType.UIManager; + } + + @Override + public JSIModuleProvider getJSIModuleProvider() { + final ComponentFactory componentFactory = new ComponentFactory(); + CoreComponentsRegistry.register(componentFactory); + + // Here we register a Components Registry. + // The one that is generated with the template contains no components + // and just provides you the one from React Native core. + MainComponentsRegistry.register(componentFactory); + + final ReactInstanceManager reactInstanceManager = getReactInstanceManager(); + + ViewManagerRegistry viewManagerRegistry = + new ViewManagerRegistry( + reactInstanceManager.getOrCreateViewManagers(reactApplicationContext)); + + return new FabricJSIModuleProvider( + reactApplicationContext, + componentFactory, + new EmptyReactNativeConfig(), + viewManagerRegistry); + } + }); + return specs; + } + }; + } +} diff --git a/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/components/MainComponentsRegistry.java b/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/components/MainComponentsRegistry.java new file mode 100644 index 000000000..d7762eaac --- /dev/null +++ b/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/components/MainComponentsRegistry.java @@ -0,0 +1,36 @@ +package com.fabricexample.newarchitecture.components; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.fabric.ComponentFactory; +import com.facebook.soloader.SoLoader; + +/** + * Class responsible to load the custom Fabric Components. This class has native methods and needs a + * corresponding C++ implementation/header file to work correctly (already placed inside the jni/ + * folder for you). + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +@DoNotStrip +public class MainComponentsRegistry { + static { + SoLoader.loadLibrary("fabricjni"); + } + + @DoNotStrip private final HybridData mHybridData; + + @DoNotStrip + private native HybridData initHybrid(ComponentFactory componentFactory); + + @DoNotStrip + private MainComponentsRegistry(ComponentFactory componentFactory) { + mHybridData = initHybrid(componentFactory); + } + + @DoNotStrip + public static MainComponentsRegistry register(ComponentFactory componentFactory) { + return new MainComponentsRegistry(componentFactory); + } +} diff --git a/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java b/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java new file mode 100644 index 000000000..1f2326167 --- /dev/null +++ b/FabricExample/android/app/src/main/java/com/fabricexample/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java @@ -0,0 +1,48 @@ +package com.fabricexample.newarchitecture.modules; + +import com.facebook.jni.HybridData; +import com.facebook.react.ReactPackage; +import com.facebook.react.ReactPackageTurboModuleManagerDelegate; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.soloader.SoLoader; +import java.util.List; + +/** + * Class responsible to load the TurboModules. This class has native methods and needs a + * corresponding C++ implementation/header file to work correctly (already placed inside the jni/ + * folder for you). + * + *

Please note that this class is used ONLY if you opt-in for the New Architecture (see the + * `newArchEnabled` property). Is ignored otherwise. + */ +public class MainApplicationTurboModuleManagerDelegate + extends ReactPackageTurboModuleManagerDelegate { + + private static volatile boolean sIsSoLibraryLoaded; + + protected MainApplicationTurboModuleManagerDelegate( + ReactApplicationContext reactApplicationContext, List packages) { + super(reactApplicationContext, packages); + } + + protected native HybridData initHybrid(); + + native boolean canCreateTurboModule(String moduleName); + + public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder { + protected MainApplicationTurboModuleManagerDelegate build( + ReactApplicationContext context, List packages) { + return new MainApplicationTurboModuleManagerDelegate(context, packages); + } + } + + @Override + protected synchronized void maybeLoadOtherSoLibraries() { + if (!sIsSoLibraryLoaded) { + // If you change the name of your application .so file in the Android.mk file, + // make sure you update the name here as well. + SoLoader.loadLibrary("fabricexample_appmodules"); + sIsSoLibraryLoaded = true; + } + } +} diff --git a/FabricExample/android/app/src/main/jni/Android.mk b/FabricExample/android/app/src/main/jni/Android.mk new file mode 100644 index 000000000..b8a16aebb --- /dev/null +++ b/FabricExample/android/app/src/main/jni/Android.mk @@ -0,0 +1,49 @@ +THIS_DIR := $(call my-dir) + +include $(REACT_ANDROID_DIR)/Android-prebuilt.mk + +# If you wish to add a custom TurboModule or Fabric component in your app you +# will have to include the following autogenerated makefile. +# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk +include $(CLEAR_VARS) + +LOCAL_PATH := $(THIS_DIR) + +# You can customize the name of your application .so file here. +LOCAL_MODULE := fabricexample_appmodules + +LOCAL_C_INCLUDES := $(LOCAL_PATH) +LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) + +# If you wish to add a custom TurboModule or Fabric component in your app you +# will have to uncomment those lines to include the generated source +# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni) +# +# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni +# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp) +# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni + +# Here you should add any native library you wish to depend on. +LOCAL_SHARED_LIBRARIES := \ + libfabricjni \ + libfbjni \ + libfolly_futures \ + libfolly_json \ + libglog \ + libjsi \ + libreact_codegen_rncore \ + libreact_debug \ + libreact_nativemodule_core \ + libreact_render_componentregistry \ + libreact_render_core \ + libreact_render_debug \ + libreact_render_graphics \ + librrc_view \ + libruntimeexecutor \ + libturbomodulejsijni \ + libyoga + +LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall + +include $(BUILD_SHARED_LIBRARY) diff --git a/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp b/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp new file mode 100644 index 000000000..0ac23cc62 --- /dev/null +++ b/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.cpp @@ -0,0 +1,24 @@ +#include "MainApplicationModuleProvider.h" + +#include + +namespace facebook { +namespace react { + +std::shared_ptr MainApplicationModuleProvider( + const std::string moduleName, + const JavaTurboModule::InitParams ¶ms) { + // Here you can provide your own module provider for TurboModules coming from + // either your application or from external libraries. The approach to follow + // is similar to the following (for a library called `samplelibrary`: + // + // auto module = samplelibrary_ModuleProvider(moduleName, params); + // if (module != nullptr) { + // return module; + // } + // return rncore_ModuleProvider(moduleName, params); + return rncore_ModuleProvider(moduleName, params); +} + +} // namespace react +} // namespace facebook diff --git a/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h b/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h new file mode 100644 index 000000000..0fa43fa69 --- /dev/null +++ b/FabricExample/android/app/src/main/jni/MainApplicationModuleProvider.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +#include + +namespace facebook { +namespace react { + +std::shared_ptr MainApplicationModuleProvider( + const std::string moduleName, + const JavaTurboModule::InitParams ¶ms); + +} // namespace react +} // namespace facebook diff --git a/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp b/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp new file mode 100644 index 000000000..dbbdc3d13 --- /dev/null +++ b/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp @@ -0,0 +1,45 @@ +#include "MainApplicationTurboModuleManagerDelegate.h" +#include "MainApplicationModuleProvider.h" + +namespace facebook { +namespace react { + +jni::local_ref +MainApplicationTurboModuleManagerDelegate::initHybrid( + jni::alias_ref) { + return makeCxxInstance(); +} + +void MainApplicationTurboModuleManagerDelegate::registerNatives() { + registerHybrid({ + makeNativeMethod( + "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid), + makeNativeMethod( + "canCreateTurboModule", + MainApplicationTurboModuleManagerDelegate::canCreateTurboModule), + }); +} + +std::shared_ptr +MainApplicationTurboModuleManagerDelegate::getTurboModule( + const std::string name, + const std::shared_ptr jsInvoker) { + // Not implemented yet: provide pure-C++ NativeModules here. + return nullptr; +} + +std::shared_ptr +MainApplicationTurboModuleManagerDelegate::getTurboModule( + const std::string name, + const JavaTurboModule::InitParams ¶ms) { + return MainApplicationModuleProvider(name, params); +} + +bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule( + std::string name) { + return getTurboModule(name, nullptr) != nullptr || + getTurboModule(name, {.moduleName = name}) != nullptr; +} + +} // namespace react +} // namespace facebook diff --git a/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h b/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h new file mode 100644 index 000000000..077a0002d --- /dev/null +++ b/FabricExample/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h @@ -0,0 +1,38 @@ +#include +#include + +#include +#include + +namespace facebook { +namespace react { + +class MainApplicationTurboModuleManagerDelegate + : public jni::HybridClass< + MainApplicationTurboModuleManagerDelegate, + TurboModuleManagerDelegate> { + public: + // Adapt it to the package you used for your Java class. + static constexpr auto kJavaDescriptor = + "Lcom/fabricexample/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate;"; + + static jni::local_ref initHybrid(jni::alias_ref); + + static void registerNatives(); + + std::shared_ptr getTurboModule( + const std::string name, + const std::shared_ptr jsInvoker) override; + std::shared_ptr getTurboModule( + const std::string name, + const JavaTurboModule::InitParams ¶ms) override; + + /** + * Test-only method. Allows user to verify whether a TurboModule can be + * created by instances of this class. + */ + bool canCreateTurboModule(std::string name); +}; + +} // namespace react +} // namespace facebook diff --git a/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp b/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp new file mode 100644 index 000000000..8f7edffd6 --- /dev/null +++ b/FabricExample/android/app/src/main/jni/MainComponentsRegistry.cpp @@ -0,0 +1,61 @@ +#include "MainComponentsRegistry.h" + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {} + +std::shared_ptr +MainComponentsRegistry::sharedProviderRegistry() { + auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry(); + + // Custom Fabric Components go here. You can register custom + // components coming from your App or from 3rd party libraries here. + // + // providerRegistry->add(concreteComponentDescriptorProvider< + // AocViewerComponentDescriptor>()); + return providerRegistry; +} + +jni::local_ref +MainComponentsRegistry::initHybrid( + jni::alias_ref, + ComponentFactory *delegate) { + auto instance = makeCxxInstance(delegate); + + auto buildRegistryFunction = + [](EventDispatcher::Weak const &eventDispatcher, + ContextContainer::Shared const &contextContainer) + -> ComponentDescriptorRegistry::Shared { + auto registry = MainComponentsRegistry::sharedProviderRegistry() + ->createComponentDescriptorRegistry( + {eventDispatcher, contextContainer}); + + auto mutableRegistry = + std::const_pointer_cast(registry); + + mutableRegistry->setFallbackComponentDescriptor( + std::make_shared( + ComponentDescriptorParameters{ + eventDispatcher, contextContainer, nullptr})); + + return registry; + }; + + delegate->buildRegistryFunction = buildRegistryFunction; + return instance; +} + +void MainComponentsRegistry::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid), + }); +} + +} // namespace react +} // namespace facebook diff --git a/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h b/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h new file mode 100644 index 000000000..191c0a71c --- /dev/null +++ b/FabricExample/android/app/src/main/jni/MainComponentsRegistry.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +class MainComponentsRegistry + : public facebook::jni::HybridClass { + public: + // Adapt it to the package you used for your Java class. + constexpr static auto kJavaDescriptor = + "Lcom/fabricexample/newarchitecture/components/MainComponentsRegistry;"; + + static void registerNatives(); + + MainComponentsRegistry(ComponentFactory *delegate); + + private: + static std::shared_ptr + sharedProviderRegistry(); + + static jni::local_ref initHybrid( + jni::alias_ref, + ComponentFactory *delegate); +}; + +} // namespace react +} // namespace facebook diff --git a/FabricExample/android/app/src/main/jni/OnLoad.cpp b/FabricExample/android/app/src/main/jni/OnLoad.cpp new file mode 100644 index 000000000..c569b6e86 --- /dev/null +++ b/FabricExample/android/app/src/main/jni/OnLoad.cpp @@ -0,0 +1,11 @@ +#include +#include "MainApplicationTurboModuleManagerDelegate.h" +#include "MainComponentsRegistry.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { + return facebook::jni::initialize(vm, [] { + facebook::react::MainApplicationTurboModuleManagerDelegate:: + registerNatives(); + facebook::react::MainComponentsRegistry::registerNatives(); + }); +} diff --git a/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml b/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 000000000..f35d99620 --- /dev/null +++ b/FabricExample/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a2f590828 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 000000000..1b5239980 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ff10afd6e Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 000000000..115a4c768 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..dcd3cd808 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 000000000..459ca609d Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8ca12fe02 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..8e19b410a Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b824ebdd4 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..4c19a13c2 Binary files /dev/null and b/FabricExample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/FabricExample/android/app/src/main/res/values/strings.xml b/FabricExample/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..30038583e --- /dev/null +++ b/FabricExample/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + FabricExample + diff --git a/FabricExample/android/app/src/main/res/values/styles.xml b/FabricExample/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..7ba83a2ad --- /dev/null +++ b/FabricExample/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/FabricExample/android/build.gradle b/FabricExample/android/build.gradle new file mode 100644 index 000000000..f75a6aff9 --- /dev/null +++ b/FabricExample/android/build.gradle @@ -0,0 +1,57 @@ +import org.apache.tools.ant.taskdefs.condition.Os + +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = "31.0.0" + minSdkVersion = 21 + compileSdkVersion = 31 + targetSdkVersion = 31 + + if (System.properties['os.arch'] == "aarch64") { + // For M1 Users we need to use the NDK 24 which added support for aarch64 + ndkVersion = "24.0.8215888" + } else if (Os.isFamily(Os.FAMILY_WINDOWS)) { + // For Android Users, we need to use NDK 23, otherwise the build will + // fail due to paths longer than the OS limit + ndkVersion = "23.1.7779620" + } else { + // Otherwise we default to the side-by-side NDK version from AGP. + ndkVersion = "21.4.7075529" + } + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:7.0.4") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("de.undercouch:gradle-download-task:4.1.2") + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url("$rootDir/../node_modules/react-native/android") + } + maven { + // Android JSC is installed from npm + url("$rootDir/../node_modules/jsc-android/dist") + } + mavenCentral { + // We don't want to fetch react-native from Maven Central as there are + // older versions over there. + content { + excludeGroup "com.facebook.react" + } + } + google() + maven { url 'https://www.jitpack.io' } + } +} \ No newline at end of file diff --git a/FabricExample/android/gradle.properties b/FabricExample/android/gradle.properties new file mode 100644 index 000000000..ac336f339 --- /dev/null +++ b/FabricExample/android/gradle.properties @@ -0,0 +1,40 @@ +# 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: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# 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 + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + +# Version of flipper SDK to use with React Native +FLIPPER_VERSION=0.125.0 + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true diff --git a/FabricExample/android/gradle/wrapper/gradle-wrapper.jar b/FabricExample/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7454180f2 Binary files /dev/null and b/FabricExample/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/FabricExample/android/gradle/wrapper/gradle-wrapper.properties b/FabricExample/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..669386b87 --- /dev/null +++ b/FabricExample/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/FabricExample/android/gradlew b/FabricExample/android/gradlew new file mode 100755 index 000000000..1b6c78733 --- /dev/null +++ b/FabricExample/android/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${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='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# 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 ;; #( + MSYS* | 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" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/FabricExample/android/gradlew.bat b/FabricExample/android/gradlew.bat new file mode 100644 index 000000000..107acd32c --- /dev/null +++ b/FabricExample/android/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@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 Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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="-Xmx64m" "-Xms64m" + +@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 execute + +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 execute + +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 + +: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 %* + +: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/FabricExample/android/settings.gradle b/FabricExample/android/settings.gradle new file mode 100644 index 000000000..ec6845e61 --- /dev/null +++ b/FabricExample/android/settings.gradle @@ -0,0 +1,9 @@ +rootProject.name = 'FabricExample' +apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) +include ':app' +includeBuild('../node_modules/react-native-gradle-plugin') + +if (settings.hasProperty("newArchEnabled") && settings.newArchEnabled == "true") { + include(":ReactAndroid") + project(":ReactAndroid").projectDir = file('../node_modules/react-native/ReactAndroid') +} diff --git a/FabricExample/app.json b/FabricExample/app.json new file mode 100644 index 000000000..957883ae2 --- /dev/null +++ b/FabricExample/app.json @@ -0,0 +1,4 @@ +{ + "name": "FabricExample", + "displayName": "FabricExample" +} \ No newline at end of file diff --git a/FabricExample/babel.config.js b/FabricExample/babel.config.js new file mode 100644 index 000000000..f842b77fc --- /dev/null +++ b/FabricExample/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], +}; diff --git a/FabricExample/index.js b/FabricExample/index.js new file mode 100644 index 000000000..69303b34d --- /dev/null +++ b/FabricExample/index.js @@ -0,0 +1,9 @@ +/** + * @format + */ + +import {AppRegistry} from 'react-native'; +import App from './src/App'; +import {name as appName} from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj b/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj new file mode 100644 index 000000000..1cbb0ed44 --- /dev/null +++ b/FabricExample/ios/FabricExample.xcodeproj/project.pbxproj @@ -0,0 +1,698 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 00E356F31AD99517003FC87E /* FabricExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* FabricExampleTests.m */; }; + 0C80B921A6F3F58F76C31292 /* libPods-FabricExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-FabricExample.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 7699B88040F8A987B510C191 /* libPods-FabricExample-FabricExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-FabricExample-FabricExampleTests.a */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = FabricExample; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00E356EE1AD99517003FC87E /* FabricExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FabricExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* FabricExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FabricExampleTests.m; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* FabricExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FabricExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = FabricExample/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = FabricExample/AppDelegate.mm; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = FabricExample/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = FabricExample/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = FabricExample/main.m; sourceTree = ""; }; + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-FabricExample-FabricExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FabricExample-FabricExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample.debug.xcconfig"; path = "Target Support Files/Pods-FabricExample/Pods-FabricExample.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample.release.xcconfig"; path = "Target Support Files/Pods-FabricExample/Pods-FabricExample.release.xcconfig"; sourceTree = ""; }; + 5B7EB9410499542E8C5724F5 /* Pods-FabricExample-FabricExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample-FabricExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests.debug.xcconfig"; sourceTree = ""; }; + 5DCACB8F33CDC322A6C60F78 /* libPods-FabricExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FabricExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = FabricExample/LaunchScreen.storyboard; sourceTree = ""; }; + 89C6BE57DB24E9ADA2F236DE /* Pods-FabricExample-FabricExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FabricExample-FabricExampleTests.release.xcconfig"; path = "Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests.release.xcconfig"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7699B88040F8A987B510C191 /* libPods-FabricExample-FabricExampleTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C80B921A6F3F58F76C31292 /* libPods-FabricExample.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00E356EF1AD99517003FC87E /* FabricExampleTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* FabricExampleTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = FabricExampleTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* FabricExample */ = { + isa = PBXGroup; + children = ( + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = FabricExample; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 5DCACB8F33CDC322A6C60F78 /* libPods-FabricExample.a */, + 19F6CBCC0A4E27FBF8BF4A61 /* libPods-FabricExample-FabricExampleTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* FabricExample */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* FabricExampleTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* FabricExample.app */, + 00E356EE1AD99517003FC87E /* FabricExampleTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */, + 5B7EB9410499542E8C5724F5 /* Pods-FabricExample-FabricExampleTests.debug.xcconfig */, + 89C6BE57DB24E9ADA2F236DE /* Pods-FabricExample-FabricExampleTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* FabricExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "FabricExampleTests" */; + buildPhases = ( + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = FabricExampleTests; + productName = FabricExampleTests; + productReference = 00E356EE1AD99517003FC87E /* FabricExampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* FabricExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "FabricExample" */; + buildPhases = ( + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + FD10A7F022414F080027D42C /* Start Packager */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FabricExample; + productName = FabricExample; + productReference = 13B07F961A680F5B00A75B9A /* FabricExample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "FabricExample" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* FabricExample */, + 00E356ED1AD99517003FC87E /* FabricExampleTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets 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 = "set -e\n\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; + }; + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FabricExample-FabricExampleTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FabricExample-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FabricExample-FabricExampleTests/Pods-FabricExample-FabricExampleTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FD10A7F022414F080027D42C /* Start Packager */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Start Packager"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* FabricExampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* FabricExample */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-FabricExample-FabricExampleTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = FabricExampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FabricExample.app/FabricExample"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-FabricExample-FabricExampleTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = FabricExampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/FabricExample.app/FabricExample"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = FabricExample/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 = FabricExample; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = FabricExample/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 = FabricExample; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + 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 = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + 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 = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "FabricExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "FabricExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "FabricExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme b/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme new file mode 100644 index 000000000..bc4aae220 --- /dev/null +++ b/FabricExample/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata b/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..3e9ae53e5 --- /dev/null +++ b/FabricExample/ios/FabricExample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/FabricExample/ios/FabricExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/FabricExample/ios/FabricExample/AppDelegate.h b/FabricExample/ios/FabricExample/AppDelegate.h new file mode 100644 index 000000000..ef1de86a2 --- /dev/null +++ b/FabricExample/ios/FabricExample/AppDelegate.h @@ -0,0 +1,8 @@ +#import +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/FabricExample/ios/FabricExample/AppDelegate.mm b/FabricExample/ios/FabricExample/AppDelegate.mm new file mode 100644 index 000000000..016600407 --- /dev/null +++ b/FabricExample/ios/FabricExample/AppDelegate.mm @@ -0,0 +1,108 @@ +#import "AppDelegate.h" + +#import +#import +#import + +#import + +#if RCT_NEW_ARCH_ENABLED +#import +#import +#import +#import +#import +#import + +#import + +@interface AppDelegate () { + RCTTurboModuleManager *_turboModuleManager; + RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; + std::shared_ptr _reactNativeConfig; + facebook::react::ContextContainer::Shared _contextContainer; +} +@end +#endif + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + RCTAppSetupPrepareApp(application); + + RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; + +#if RCT_NEW_ARCH_ENABLED + _contextContainer = std::make_shared(); + _reactNativeConfig = std::make_shared(); + _contextContainer->insert("ReactNativeConfig", _reactNativeConfig); + _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; + bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; +#endif + + UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"FabricExample", nil); + + if (@available(iOS 13.0, *)) { + rootView.backgroundColor = [UIColor systemBackgroundColor]; + } else { + rootView.backgroundColor = [UIColor whiteColor]; + } + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +#if RCT_NEW_ARCH_ENABLED + +#pragma mark - RCTCxxBridgeDelegate + +- (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge +{ + _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge + delegate:self + jsInvoker:bridge.jsCallInvoker]; + return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); +} + +#pragma mark RCTTurboModuleManagerDelegate + +- (Class)getModuleClassFromName:(const char *)name +{ + return RCTCoreModulesClassProvider(name); +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + jsInvoker:(std::shared_ptr)jsInvoker +{ + return nullptr; +} + +- (std::shared_ptr)getTurboModule:(const std::string &)name + initParams: + (const facebook::react::ObjCTurboModule::InitParams &)params +{ + return nullptr; +} + +- (id)getModuleInstanceFromClass:(Class)moduleClass +{ + return RCTAppSetupDefaultModuleFromClass(moduleClass); +} + +#endif + +@end diff --git a/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json b/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..81213230d --- /dev/null +++ b/FabricExample/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/FabricExample/ios/FabricExample/Images.xcassets/Contents.json b/FabricExample/ios/FabricExample/Images.xcassets/Contents.json new file mode 100644 index 000000000..2d92bd53f --- /dev/null +++ b/FabricExample/ios/FabricExample/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/FabricExample/ios/FabricExample/Info.plist b/FabricExample/ios/FabricExample/Info.plist new file mode 100644 index 000000000..3202b2fbb --- /dev/null +++ b/FabricExample/ios/FabricExample/Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + FabricExample + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/FabricExample/ios/FabricExample/LaunchScreen.storyboard b/FabricExample/ios/FabricExample/LaunchScreen.storyboard new file mode 100644 index 000000000..c4f28caff --- /dev/null +++ b/FabricExample/ios/FabricExample/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FabricExample/ios/FabricExample/main.m b/FabricExample/ios/FabricExample/main.m new file mode 100644 index 000000000..d645c7246 --- /dev/null +++ b/FabricExample/ios/FabricExample/main.m @@ -0,0 +1,10 @@ +#import + +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/FabricExample/ios/FabricExampleTests/FabricExampleTests.m b/FabricExample/ios/FabricExampleTests/FabricExampleTests.m new file mode 100644 index 000000000..f023368a4 --- /dev/null +++ b/FabricExample/ios/FabricExampleTests/FabricExampleTests.m @@ -0,0 +1,66 @@ +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React" + +@interface FabricExampleTests : XCTestCase + +@end + +@implementation FabricExampleTests + +- (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; +#ifdef DEBUG + RCTSetLogFunction( + ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); +#endif + + 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; + }]; + } + +#ifdef DEBUG + RCTSetLogFunction(RCTDefaultLogFunction); +#endif + + 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/FabricExample/ios/FabricExampleTests/Info.plist b/FabricExample/ios/FabricExampleTests/Info.plist new file mode 100644 index 000000000..ba72822e8 --- /dev/null +++ b/FabricExample/ios/FabricExampleTests/Info.plist @@ -0,0 +1,24 @@ + + + + + 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/FabricExample/ios/Podfile b/FabricExample/ios/Podfile new file mode 100644 index 000000000..6005b90b0 --- /dev/null +++ b/FabricExample/ios/Podfile @@ -0,0 +1,39 @@ +require_relative '../node_modules/react-native/scripts/react_native_pods' +require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' + +platform :ios, '11.0' +install! 'cocoapods', :deterministic_uuids => false + +ENV['RCT_NEW_ARCH_ENABLED'] = '1' + +target 'FabricExample' do + config = use_native_modules! + + # Flags change depending on the env values. + flags = get_default_flags() + + use_react_native!( + :path => config[:reactNativePath], + # to enable hermes on iOS, change `false` to `true` and then install pods + :hermes_enabled => flags[:hermes_enabled], + :fabric_enabled => flags[:fabric_enabled], + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + target 'FabricExampleTests' do + inherit! :complete + # Pods for testing + end + + # Enables Flipper. + # + # Note that if you have use_frameworks! enabled, Flipper will not work and + # you should disable the next line. + use_flipper!() + + post_install do |installer| + react_native_post_install(installer) + __apply_Xcode_12_5_M1_post_install_workaround(installer) + end +end diff --git a/FabricExample/ios/Podfile.lock b/FabricExample/ios/Podfile.lock new file mode 100644 index 000000000..4f7af0c33 --- /dev/null +++ b/FabricExample/ios/Podfile.lock @@ -0,0 +1,938 @@ +PODS: + - boost (1.76.0) + - CocoaAsyncSocket (7.6.5) + - DoubleConversion (1.1.6) + - FBLazyVector (0.68.1) + - FBReactNativeSpec (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-Core (= 0.68.1) + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - Flipper (0.125.0): + - Flipper-Folly (~> 2.6) + - Flipper-RSocket (~> 1.4) + - Flipper-Boost-iOSX (1.76.0.1.11) + - Flipper-DoubleConversion (3.2.0) + - Flipper-Fmt (7.1.7) + - Flipper-Folly (2.6.10): + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt (= 7.1.7) + - Flipper-Glog + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - Flipper-Glog (0.5.0.4) + - Flipper-PeerTalk (0.0.4) + - Flipper-RSocket (1.4.3): + - Flipper-Folly (~> 2.6) + - FlipperKit (0.125.0): + - FlipperKit/Core (= 0.125.0) + - FlipperKit/Core (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/CppBridge + - FlipperKit/FBCxxFollyDynamicConvert + - FlipperKit/FBDefines + - FlipperKit/FKPortForwarding + - SocketRocket (~> 0.6.0) + - FlipperKit/CppBridge (0.125.0): + - Flipper (~> 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (0.125.0): + - Flipper-Folly (~> 2.6) + - FlipperKit/FBDefines (0.125.0) + - FlipperKit/FKPortForwarding (0.125.0): + - CocoaAsyncSocket (~> 7.6) + - Flipper-PeerTalk (~> 0.0.4) + - FlipperKit/FlipperKitHighlightOverlay (0.125.0) + - FlipperKit/FlipperKitLayoutHelpers (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutTextSearchable + - FlipperKit/FlipperKitLayoutIOSDescriptors (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitHighlightOverlay + - FlipperKit/FlipperKitLayoutHelpers + - FlipperKit/FlipperKitLayoutIOSDescriptors + - FlipperKit/FlipperKitLayoutTextSearchable + - YogaKit (~> 1.18) + - FlipperKit/FlipperKitLayoutTextSearchable (0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitReactPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitUserDefaultsPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/SKIOSNetworkPlugin (0.125.0): + - FlipperKit/Core + - FlipperKit/FlipperKitNetworkPlugin + - fmt (6.2.1) + - glog (0.3.5) + - hermes-engine (0.11.0) + - libevent (2.1.12) + - OpenSSL-Universal (1.1.1100) + - RCT-Folly (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Default (= 2021.06.28.00-v2) + - RCT-Folly/Default (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Fabric (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Futures (2021.06.28.00-v2): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - libevent + - RCTRequired (0.68.1) + - RCTTypeSafety (0.68.1): + - FBLazyVector (= 0.68.1) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - React-Core (= 0.68.1) + - React (0.68.1): + - React-Core (= 0.68.1) + - React-Core/DevSupport (= 0.68.1) + - React-Core/RCTWebSocket (= 0.68.1) + - React-RCTActionSheet (= 0.68.1) + - React-RCTAnimation (= 0.68.1) + - React-RCTBlob (= 0.68.1) + - React-RCTImage (= 0.68.1) + - React-RCTLinking (= 0.68.1) + - React-RCTNetwork (= 0.68.1) + - React-RCTSettings (= 0.68.1) + - React-RCTText (= 0.68.1) + - React-RCTVibration (= 0.68.1) + - React-callinvoker (0.68.1) + - React-Codegen (0.68.1): + - FBReactNativeSpec (= 0.68.1) + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-Core (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-rncore (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Core (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.68.1) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/CoreModulesHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/Default (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/DevSupport (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.68.1) + - React-Core/RCTWebSocket (= 0.68.1) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-jsinspector (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTActionSheetHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTAnimationHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTBlobHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTImageHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTLinkingHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTNetworkHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTSettingsHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTTextHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTVibrationHeaders (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-Core/RCTWebSocket (0.68.1): + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-Core/Default (= 0.68.1) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-perflogger (= 0.68.1) + - Yoga + - React-CoreModules (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.68.1) + - React-Codegen (= 0.68.1) + - React-Core/CoreModulesHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - React-RCTImage (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-cxxreact (0.68.1): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsinspector (= 0.68.1) + - React-logger (= 0.68.1) + - React-perflogger (= 0.68.1) + - React-runtimeexecutor (= 0.68.1) + - React-Fabric (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-Fabric/animations (= 0.68.1) + - React-Fabric/attributedstring (= 0.68.1) + - React-Fabric/butter (= 0.68.1) + - React-Fabric/componentregistry (= 0.68.1) + - React-Fabric/componentregistrynative (= 0.68.1) + - React-Fabric/components (= 0.68.1) + - React-Fabric/config (= 0.68.1) + - React-Fabric/core (= 0.68.1) + - React-Fabric/debug_core (= 0.68.1) + - React-Fabric/debug_renderer (= 0.68.1) + - React-Fabric/imagemanager (= 0.68.1) + - React-Fabric/leakchecker (= 0.68.1) + - React-Fabric/mounting (= 0.68.1) + - React-Fabric/runtimescheduler (= 0.68.1) + - React-Fabric/scheduler (= 0.68.1) + - React-Fabric/telemetry (= 0.68.1) + - React-Fabric/templateprocessor (= 0.68.1) + - React-Fabric/textlayoutmanager (= 0.68.1) + - React-Fabric/uimanager (= 0.68.1) + - React-Fabric/utils (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/animations (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/attributedstring (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/butter (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/componentregistry (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/componentregistrynative (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-Fabric/components/activityindicator (= 0.68.1) + - React-Fabric/components/image (= 0.68.1) + - React-Fabric/components/inputaccessory (= 0.68.1) + - React-Fabric/components/legacyviewmanagerinterop (= 0.68.1) + - React-Fabric/components/modal (= 0.68.1) + - React-Fabric/components/root (= 0.68.1) + - React-Fabric/components/safeareaview (= 0.68.1) + - React-Fabric/components/scrollview (= 0.68.1) + - React-Fabric/components/slider (= 0.68.1) + - React-Fabric/components/text (= 0.68.1) + - React-Fabric/components/textinput (= 0.68.1) + - React-Fabric/components/unimplementedview (= 0.68.1) + - React-Fabric/components/view (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/activityindicator (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/image (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/inputaccessory (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/legacyviewmanagerinterop (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/modal (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/root (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/safeareaview (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/scrollview (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/slider (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/text (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/textinput (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/unimplementedview (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/components/view (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - Yoga + - React-Fabric/config (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/core (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/debug_core (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/debug_renderer (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/imagemanager (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-RCTImage (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/leakchecker (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/mounting (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/runtimescheduler (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/scheduler (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/telemetry (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/templateprocessor (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/textlayoutmanager (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-Fabric/uimanager + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/uimanager (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-Fabric/utils (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - RCTRequired (= 0.68.1) + - RCTTypeSafety (= 0.68.1) + - React-graphics (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-graphics (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - React-Core/Default (= 0.68.1) + - React-hermes (0.68.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2021.06.28.00-v2) + - RCT-Folly/Futures (= 2021.06.28.00-v2) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-jsiexecutor (= 0.68.1) + - React-jsinspector (= 0.68.1) + - React-perflogger (= 0.68.1) + - React-jsi (0.68.1): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi/Default (= 0.68.1) + - React-jsi/Default (0.68.1): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsi/Fabric (0.68.1): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-jsiexecutor (0.68.1): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-perflogger (= 0.68.1) + - React-jsinspector (0.68.1) + - React-logger (0.68.1): + - glog + - React-perflogger (0.68.1) + - React-RCTActionSheet (0.68.1): + - React-Core/RCTActionSheetHeaders (= 0.68.1) + - React-RCTAnimation (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.68.1) + - React-Codegen (= 0.68.1) + - React-Core/RCTAnimationHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-RCTBlob (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 0.68.1) + - React-Core/RCTBlobHeaders (= 0.68.1) + - React-Core/RCTWebSocket (= 0.68.1) + - React-jsi (= 0.68.1) + - React-RCTNetwork (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-RCTFabric (0.68.1): + - RCT-Folly/Fabric (= 2021.06.28.00-v2) + - React-Core (= 0.68.1) + - React-Fabric (= 0.68.1) + - React-RCTImage (= 0.68.1) + - React-RCTImage (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.68.1) + - React-Codegen (= 0.68.1) + - React-Core/RCTImageHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - React-RCTNetwork (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-RCTLinking (0.68.1): + - React-Codegen (= 0.68.1) + - React-Core/RCTLinkingHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-RCTNetwork (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.68.1) + - React-Codegen (= 0.68.1) + - React-Core/RCTNetworkHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-RCTSettings (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTTypeSafety (= 0.68.1) + - React-Codegen (= 0.68.1) + - React-Core/RCTSettingsHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-RCTText (0.68.1): + - React-Core/RCTTextHeaders (= 0.68.1) + - React-RCTVibration (0.68.1): + - RCT-Folly (= 2021.06.28.00-v2) + - React-Codegen (= 0.68.1) + - React-Core/RCTVibrationHeaders (= 0.68.1) + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (= 0.68.1) + - React-rncore (0.68.1) + - React-runtimeexecutor (0.68.1): + - React-jsi (= 0.68.1) + - ReactCommon/turbomodule/core (0.68.1): + - DoubleConversion + - glog + - RCT-Folly (= 2021.06.28.00-v2) + - React-callinvoker (= 0.68.1) + - React-Core (= 0.68.1) + - React-cxxreact (= 0.68.1) + - React-jsi (= 0.68.1) + - React-logger (= 0.68.1) + - React-perflogger (= 0.68.1) + - RNSVG (12.4.4): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired + - RCTTypeSafety + - React + - React-Codegen + - React-RCTFabric + - ReactCommon/turbomodule/core + - RNSVG/common (= 12.4.4) + - RNSVG/common (12.4.4): + - RCT-Folly (= 2021.06.28.00-v2) + - RCTRequired + - RCTTypeSafety + - React + - React-Codegen + - React-RCTFabric + - ReactCommon/turbomodule/core + - SocketRocket (0.6.0) + - Yoga (1.14.0) + - YogaKit (1.18.1): + - Yoga (~> 1.14) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - Flipper (= 0.125.0) + - Flipper-Boost-iOSX (= 1.76.0.1.11) + - Flipper-DoubleConversion (= 3.2.0) + - Flipper-Fmt (= 7.1.7) + - Flipper-Folly (= 2.6.10) + - Flipper-Glog (= 0.5.0.4) + - Flipper-PeerTalk (= 0.0.4) + - Flipper-RSocket (= 1.4.3) + - FlipperKit (= 0.125.0) + - FlipperKit/Core (= 0.125.0) + - FlipperKit/CppBridge (= 0.125.0) + - FlipperKit/FBCxxFollyDynamicConvert (= 0.125.0) + - FlipperKit/FBDefines (= 0.125.0) + - FlipperKit/FKPortForwarding (= 0.125.0) + - FlipperKit/FlipperKitHighlightOverlay (= 0.125.0) + - FlipperKit/FlipperKitLayoutPlugin (= 0.125.0) + - FlipperKit/FlipperKitLayoutTextSearchable (= 0.125.0) + - FlipperKit/FlipperKitNetworkPlugin (= 0.125.0) + - FlipperKit/FlipperKitReactPlugin (= 0.125.0) + - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.125.0) + - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (~> 0.11.0) + - libevent (~> 2.1.12) + - OpenSSL-Universal (= 1.1.1100) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsi/Fabric (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNSVG (from `../..`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - CocoaAsyncSocket + - Flipper + - Flipper-Boost-iOSX + - Flipper-DoubleConversion + - Flipper-Fmt + - Flipper-Folly + - Flipper-Glog + - Flipper-PeerTalk + - Flipper-RSocket + - FlipperKit + - fmt + - hermes-engine + - libevent + - OpenSSL-Universal + - SocketRocket + - YogaKit + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../node_modules/react-native/React" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rncore: + :path: "../node_modules/react-native/ReactCommon" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNSVG: + :path: "../.." + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: a7c83b31436843459a1961bfd74b96033dc77234 + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 + FBLazyVector: 2c76493a346ef8cacf1f442926a39f805fffec1f + FBReactNativeSpec: d0cd6132e81f71704f0fbe656aa8e7e28e98477b + Flipper: 26fc4b7382499f1281eb8cb921e5c3ad6de91fe0 + Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c + Flipper-DoubleConversion: 3d3d04a078d4f3a1b6c6916587f159dc11f232c4 + Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b + Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 + Flipper-Glog: 87bc98ff48de90cb5b0b5114ed3da79d85ee2dd4 + Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 + Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 + FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 476ee3e89abb49e07f822b48323c51c57124b572 + hermes-engine: 84e3af1ea01dd7351ac5d8689cbbea1f9903ffc3 + libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8 + RCTRequired: 00581111c53531e39e3c6346ef0d2c0cf52a5a37 + RCTTypeSafety: 07e03ee7800e7dd65cba8e52ad0c2edb06c96604 + React: e61f4bf3c573d0c61c56b53dc3eb1d9daf0768a0 + React-callinvoker: 047d47230bb6fd66827f8cb0bea4e944ffd1309b + React-Codegen: 04db108bf33ffa80318c16d544146f3cb44e65b3 + React-Core: a4a3a8e10d004b08e013c3d0438259dd89a3894c + React-CoreModules: bb9f8bc36f1ae6d780b856927fa9d4aa01ccccc0 + React-cxxreact: 7dd472aefb8629d6080cbb859240bafccd902704 + React-Fabric: 250c9a06ca52b543e8781a062a54c0553eb69106 + React-graphics: b25a8a7e8d8cd14e368eaf275d35d0596355559d + React-hermes: a245deb80c8d0bc35ed599109562c1c75ca803bc + React-jsi: b25808afe821b607d51c779bdd1717be8393b7ec + React-jsiexecutor: 4a4bae5671b064a2248a690cf75957669489d08c + React-jsinspector: 218a2503198ff28a085f8e16622a8d8f507c8019 + React-logger: f79dd3cc0f9b44f5611c6c7862badd891a862cf8 + React-perflogger: 30ab8d6db10e175626069e742eead3ebe8f24fd5 + React-RCTActionSheet: 4b45da334a175b24dabe75f856b98fed3dfd6201 + React-RCTAnimation: d6237386cb04500889877845b3e9e9291146bc2e + React-RCTBlob: bc9e2cd738c43bd2948e862e371402ef9584730a + React-RCTFabric: fa0dd5a689cab27d51a30eeb7a274b0702c4a175 + React-RCTImage: 9f8cac465c6e5837007f59ade2a0a741016dd6a3 + React-RCTLinking: 5073abb7d30cc0824b2172bd4582fc15bfc40510 + React-RCTNetwork: 28ff94aa7d8fc117fc800b87dd80869a00d2bef3 + React-RCTSettings: f27aa036f7270fe6ca43f8cdd1819e821fa429a0 + React-RCTText: 7cb6f86fa7bc86f22f16333ad243b158e63b2a68 + React-RCTVibration: 9e344c840176b0af9c84d5019eb4fed8b3c105a1 + React-rncore: 6fbbec7c9933e3d187b9db3ec222a931d5dd33b9 + React-runtimeexecutor: 7285b499d0339104b2813a1f58ad1ada4adbd6c0 + ReactCommon: bf2888a826ceedf54b99ad1b6182d1bc4a8a3984 + RNSVG: 5dfdc0de5db1d279cd7fe8d1532c8ded0b827b5f + SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + Yoga: 17cd9a50243093b547c1e539c749928dd68152da + YogaKit: f782866e155069a2cca2517aafea43200b01fd5a + +PODFILE CHECKSUM: cb1a8b8570e204ff83f9b7dbdbac0b2f0dc80a36 + +COCOAPODS: 1.11.3 diff --git a/FabricExample/metro.config.js b/FabricExample/metro.config.js new file mode 100644 index 000000000..bf6d9564c --- /dev/null +++ b/FabricExample/metro.config.js @@ -0,0 +1,42 @@ +/* eslint-disable import/no-commonjs */ + +const path = require('path'); +const exclusionList = require('metro-config/src/defaults/exclusionList'); +const escape = require('escape-string-regexp'); +const pack = require('../package.json'); + +const root = path.resolve(__dirname, '..'); + +const modules = [ + ...Object.keys(pack.peerDependencies), +]; + +module.exports = { + projectRoot: __dirname, + watchFolders: [root], + + // We need to make sure that only one version is loaded for peerDependencies + // So we exclude them at the root, and alias them to the versions in example's node_modules + resolver: { + blacklistRE: exclusionList( + modules.map( + (m) => + new RegExp(`^${escape(path.join(root, 'node_modules', m))}\\/.*$`), + ), + ), + + extraNodeModules: modules.reduce((acc, name) => { + acc[name] = path.join(__dirname, 'node_modules', name); + return acc; + }, {}), + }, + + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, +}; \ No newline at end of file diff --git a/FabricExample/package.json b/FabricExample/package.json new file mode 100644 index 000000000..7d054a6eb --- /dev/null +++ b/FabricExample/package.json @@ -0,0 +1,30 @@ +{ + "name": "FabricExample", + "version": "0.0.1", + "private": true, + "scripts": { + "android": "react-native run-android", + "ios": "react-native run-ios", + "start": "react-native start", + "test": "jest", + "lint": "eslint ." + }, + "dependencies": { + "react": "17.0.2", + "react-native": "^0.68.1", + "react-native-svg": "link:../" + }, + "devDependencies": { + "@babel/core": "^7.12.9", + "@babel/runtime": "^7.12.5", + "@react-native-community/eslint-config": "^2.0.0", + "babel-jest": "^26.6.3", + "eslint": "^7.32.0", + "jest": "^26.6.3", + "metro-react-native-babel-preset": "^0.67.0", + "react-test-renderer": "17.0.2" + }, + "jest": { + "preset": "react-native" + } +} diff --git a/FabricExample/src/App.tsx b/FabricExample/src/App.tsx new file mode 100644 index 000000000..7ed84db50 --- /dev/null +++ b/FabricExample/src/App.tsx @@ -0,0 +1,211 @@ +/** + * Sample React Native App for react-native-svg library + * https://github.com/magicismight/react-native-svg/tree/master/Example + */ +'use strict'; + +import React, {Component} from 'react'; +import { + Dimensions, + StyleSheet, + Text, + View, + ScrollView, + TouchableHighlight, + TouchableOpacity, +} from 'react-native'; +import {Modal} from 'react-native'; +import {Svg, Circle, Line} from 'react-native-svg'; + +import * as examples from './examples'; + +const hairline = StyleSheet.hairlineWidth; + +const styles = StyleSheet.create({ + container: { + flex: 1, + paddingTop: 20, + alignItems: 'center', + overflow: 'hidden', + }, + contentContainer: { + alignSelf: 'stretch', + borderTopWidth: hairline, + borderTopColor: '#ccc', + borderBottomWidth: hairline, + borderBottomColor: '#ccc', + flexWrap: 'wrap', + flexDirection: 'row', + marginHorizontal: 10, + }, + welcome: { + padding: 10, + color: '#f60', + fontSize: 18, + fontWeight: 'bold', + }, + link: { + height: 40, + alignSelf: 'stretch', + width: Dimensions.get('window').width / 2 - 10, + }, + title: { + marginLeft: 10, + }, + cell: { + height: 40, + paddingHorizontal: 10, + alignSelf: 'stretch', + alignItems: 'center', + flexDirection: 'row', + borderTopWidth: hairline, + borderTopColor: '#ccc', + marginTop: -hairline, + backgroundColor: 'transparent', + }, + close: { + position: 'absolute', + right: 20, + top: 40, + }, + scroll: { + position: 'absolute', + top: 30, + right: 10, + bottom: 20, + left: 10, + backgroundColor: '#fff', + }, + scrollContent: { + borderTopWidth: hairline, + borderTopColor: '#ccc', + }, + example: { + paddingVertical: 25, + alignSelf: 'stretch', + alignItems: 'center', + borderBottomWidth: hairline, + borderBottomColor: '#ccc', + }, + sampleTitle: { + marginHorizontal: 15, + fontSize: 16, + color: '#666', + }, +}); + +const names = [ + 'Svg', + 'Stroking', + 'Path', + 'Line', + 'Rect', + 'Polygon', + 'Polyline', + 'Circle', + 'Ellipse', + 'G', + 'Text', + 'Gradients', + 'Clipping', + 'Image', + 'TouchEvents', + 'PanResponder', + 'Reusable', +]; + +const initialState = { + modal: false, + content: null, +}; + +export default class SvgExample extends Component { + state: { + content: React.ReactNode; + modal: boolean; + scroll?: boolean; + } = initialState; + + show = name => { + if (this.state.modal) { + return; + } + let example = examples[name]; + if (example) { + let samples = example.samples; + this.setState({ + modal: true, + content: ( + + {samples.map((Sample, i) => ( + + {Sample.title} + + + ))} + + ), + scroll: example.scroll !== false, + }); + } + }; + + hide = () => { + this.setState(initialState); + }; + + getExamples = () => { + return names.map(name => { + var icon; + let example = examples[name]; + if (example) { + icon = example.icon; + } + return ( + this.show(name)}> + + {icon} + {name} + + + ); + }); + }; + + modalContent = () => ( + <> + + {this.state.content} + + + + + + + + + + + + ); + + render() { + if (this.state.modal) { + return this.modalContent(); + } else { + return ( + + SVG library for React Apps + {this.getExamples()} + + ); + } + } +} diff --git a/FabricExample/src/assets/adaptive-icon.png b/FabricExample/src/assets/adaptive-icon.png new file mode 100644 index 000000000..03d6f6b6c Binary files /dev/null and b/FabricExample/src/assets/adaptive-icon.png differ diff --git a/FabricExample/src/assets/favicon.png b/FabricExample/src/assets/favicon.png new file mode 100644 index 000000000..e75f697b1 Binary files /dev/null and b/FabricExample/src/assets/favicon.png differ diff --git a/FabricExample/src/assets/icon.png b/FabricExample/src/assets/icon.png new file mode 100644 index 000000000..a0b1526fc Binary files /dev/null and b/FabricExample/src/assets/icon.png differ diff --git a/FabricExample/src/assets/image.jpg b/FabricExample/src/assets/image.jpg new file mode 100644 index 000000000..8fddd5c17 Binary files /dev/null and b/FabricExample/src/assets/image.jpg differ diff --git a/FabricExample/src/assets/splash.png b/FabricExample/src/assets/splash.png new file mode 100644 index 000000000..0e89705a9 Binary files /dev/null and b/FabricExample/src/assets/splash.png differ diff --git a/FabricExample/src/examples.tsx b/FabricExample/src/examples.tsx new file mode 100644 index 000000000..a1d56f38b --- /dev/null +++ b/FabricExample/src/examples.tsx @@ -0,0 +1,37 @@ +import * as Svg from './examples/Svg'; +import * as Rect from './examples/Rect'; +import * as Circle from './examples/Circle'; +import * as Ellipse from './examples/Ellipse'; +import * as Line from './examples/Line'; +import * as Polygon from './examples/Polygon'; +import * as Polyline from './examples/Polyline'; +import * as Path from './examples/Path'; +import * as Text from './examples/Text'; +import * as G from './examples/G'; +import * as Stroking from './examples/Stroking'; +import * as Gradients from './examples/Gradients'; +import * as Clipping from './examples/Clipping'; +import * as Image from './examples/Image'; +import * as Reusable from './examples/Reusable'; +import * as TouchEvents from './examples/TouchEvents'; +import * as PanResponder from './examples/PanResponder'; + +export { + Svg, + Rect, + Circle, + Ellipse, + Line, + Polygon, + Polyline, + Path, + Text, + Stroking, + G, + Gradients, + Clipping, + Image, + TouchEvents, + Reusable, + PanResponder, +}; diff --git a/FabricExample/src/examples/Circle.tsx b/FabricExample/src/examples/Circle.tsx new file mode 100644 index 000000000..fcbead224 --- /dev/null +++ b/FabricExample/src/examples/Circle.tsx @@ -0,0 +1,81 @@ +import React, {Component} from 'react'; +import {Svg, Circle} from 'react-native-svg'; + +class CircleExample extends Component { + static title = 'Circle'; + render() { + return ( + + + + ); + } +} + +class StrokeCircle extends Component { + static title = 'Stroke Circle'; + render() { + return ( + + + + ); + } +} + +class StrokeOpacityCircle extends Component { + static title = 'Circle with strokeOpacity'; + render() { + return ( + + + + ); + } +} + +class PieCircle extends Component { + static title = 'Draw a Pie shape with circle'; + render() { + return ( + + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [CircleExample, StrokeCircle, StrokeOpacityCircle, PieCircle]; +export {icon, samples}; diff --git a/FabricExample/src/examples/Clipping.tsx b/FabricExample/src/examples/Clipping.tsx new file mode 100644 index 000000000..7a3e6ef4a --- /dev/null +++ b/FabricExample/src/examples/Clipping.tsx @@ -0,0 +1,139 @@ +import React, {Component} from 'react'; +import { + Svg, + Circle, + Ellipse, + G, + Text, + Path, + Polygon, + Rect, + Defs, + RadialGradient, + Stop, + ClipPath, +} from 'react-native-svg'; + +class ClipPathElement extends Component { + static title = 'Clip by set clip-path with a path data'; + render() { + return ( + + + + + + + + + + + + + Q + + + + + + ); + } +} + +class ClipRule extends Component { + static title = 'Clip a group with clipRule="evenodd"'; + render() { + return ( + + + + + + + + + + + + + + ); + } +} + +class TextClipping extends Component { + static title = 'Transform the text'; + render() { + return ( + + + + + + + + + + + + + + + + + + NOT THE FACE + + + ); + } +} + +const icon = ( + + + + + + + + + + + + + +); + +const samples = [ClipPathElement, ClipRule, TextClipping]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Ellipse.tsx b/FabricExample/src/examples/Ellipse.tsx new file mode 100644 index 000000000..fc870803f --- /dev/null +++ b/FabricExample/src/examples/Ellipse.tsx @@ -0,0 +1,66 @@ +import React, {Component} from 'react'; +import {Svg, Ellipse} from 'react-native-svg'; + +class EllipseExample extends Component { + static title = 'Ellipse'; + render() { + return ( + + + + ); + } +} + +class PileEllipses extends Component { + static title = + 'The following example creates three ellipses on top of each other'; + render() { + return ( + + + + + + ); + } +} + +class CombinedEllipses extends Component { + static title = + 'The following example combines two ellipses (one yellow and one white)'; + render() { + return ( + + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [EllipseExample, PileEllipses, CombinedEllipses]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/G.tsx b/FabricExample/src/examples/G.tsx new file mode 100644 index 000000000..9561a996d --- /dev/null +++ b/FabricExample/src/examples/G.tsx @@ -0,0 +1,98 @@ +import React, {Component} from 'react'; +import {Svg, Circle, G, Text, Line, Rect, Use} from 'react-native-svg'; + +class GExample extends Component { + static title = 'G children props inherit'; + state = { + fill: 'purple', + }; + componentDidMount = () => { + setTimeout(() => { + if (!this._unmounted) { + this.setState({ + fill: '#856', + }); + } + }, 2000); + }; + componentWillUnmount = () => { + this._unmounted = true; + }; + private _unmounted: any; + render() { + return ( + + + + + + + + + + ); + } +} + +class GTransform extends Component { + static title = 'G transform'; + render() { + return ( + + + + + + Text grouped with shapes + + + + + ); + } +} + +const icon = ( + + + + + + + + + +); + +const samples = [GExample, GTransform]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Gradients.tsx b/FabricExample/src/examples/Gradients.tsx new file mode 100644 index 000000000..4f01975bf --- /dev/null +++ b/FabricExample/src/examples/Gradients.tsx @@ -0,0 +1,321 @@ +import React, {Component} from 'react'; +import {View} from 'react-native'; +import { + Svg, + Circle, + Ellipse, + Text, + Rect, + Defs, + LinearGradient, + RadialGradient, + Stop, +} from 'react-native-svg'; + +class LinearGradientHorizontal extends Component { + static title = + 'Define an ellipse with a horizontal linear gradient from yellow to red'; + render() { + return ( + + + + + + + + + + ); + } +} + +class LinearGradientHorizontalBug extends Component { + static title = + 'Define an ellipse with a horizontal linear gradient from transparent yellow to red, buggy on android'; + render() { + return ( + + + + + + + + + + ); + } +} + +class LinearGradientRotated extends Component { + static title = + 'Define an ellipse with a rotated linear gradient from yellow to red'; + render() { + return ( + + + + + + + + + + ); + } +} + +class GradientUnits extends Component { + static title = 'Compare gradientUnits="userSpaceOnUse" with default'; + render() { + return ( + + + + + + + + + + + + + + + + + + + + + ); + } +} + +class LinearGradientPercent extends Component { + static title = 'Define a linear gradient in percent unit'; + render() { + return ( + + + + + + + + + x1=0% + + + x2=100% + + + + ); + } +} + +class RadialGradientExample extends Component { + static title = + 'Define an ellipse with a radial gradient from yellow to purple'; + render() { + return ( + + + + + + + + + + + + ); + } +} + +class RadialGradientPercent extends Component { + static title = 'Define a radial gradient in percent unit'; + render() { + return ( + + + + + + + + + + ); + } +} + +class RadialGradientPart extends Component { + static title = + 'Define another ellipse with a radial gradient from white to blue'; + render() { + return ( + + + + + + + + + + ); + } +} + +class FillGradientWithOpacity extends Component { + static title = 'Fill a radial gradient with fillOpacity prop'; + render() { + return ( + + + + + + + + + + ); + } +} + +class FillGradientInRect extends Component { + static title = 'Fill a radial gradient inside a rect and stroke it'; + render() { + return ( + + + + + + + + + + ); + } +} + +const icon = ( + + + + + + + + + +); + +const samples = [ + LinearGradientHorizontal, + LinearGradientHorizontalBug, + LinearGradientRotated, + GradientUnits, + LinearGradientPercent, + RadialGradientExample, + RadialGradientPercent, + RadialGradientPart, + FillGradientWithOpacity, + FillGradientInRect, +]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Image.tsx b/FabricExample/src/examples/Image.tsx new file mode 100644 index 000000000..d0b8c6f38 --- /dev/null +++ b/FabricExample/src/examples/Image.tsx @@ -0,0 +1,111 @@ +import React, {Component} from 'react'; +import {Platform} from 'react-native'; +import {Svg, Circle, Text, Rect, Defs, ClipPath, Image} from 'react-native-svg'; + +class ImageExample extends Component { + static title = 'Draw Image with preserveAspectRatio prop'; + render() { + return ( + + + + + + + + + + + HOGWARTS + + + ); + } +} + +class ClipImage extends Component { + static title = 'Clip Image'; + render() { + return ( + + + + + + + alert('press on Image')} + x="5%" + y="5%" + width="90%" + height="90%" + href={require('../assets/image.jpg')} + opacity="0.6" + clipPath="url(#clip-image)" + /> + + HOGWARTS + + + ); + } +} + +class DataURI extends Component { + static title = 'Data URI'; + render() { + return ( + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [ImageExample, ClipImage, DataURI]; + +export {icon, samples}; + +const dataUriExample = + 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMTEhUTExMWFhQWFhgXGRgXGB0gGBgaIBseGhsbHRoeHSggGh0lGx8aITIhJSorLi4uHR8zODMuNygtLisBCgoKDg0OGxAQGysmICYwLS42Ni0tLTItLy0vLy0tMjA1LS0tLS0tLzUtLTUvLS0tLS0tKy8tLS0tLy0tLzUvLf/AABEIAOkA2AMBIgACEQEDEQH/xAAcAAACAwEBAQEAAAAAAAAAAAAABgQFBwMCAQj/xABLEAACAQIEBAQCBgcECAMJAAABAgMAEQQSITEFBkFREyJhcTKBBxQjQpGhUmJyscHR8CQzU+FDgpKissLT8RVEZEVjc4OTo7PD0v/EABoBAAIDAQEAAAAAAAAAAAAAAAADAgQFAQb/xAAzEQACAgEDAQQKAgICAwAAAAABAgADEQQSITETQVGhBSIyYXGBkcHR8LHhFDMjUhUk8f/aAAwDAQACEQMRAD8A3GiiiiEKKKKIQqBx3iS4aCSdyAqC5J6agfPU7VPrJPpr5lDKOHxG9yGnI7DVI/xsx7WXuahY2FMfpqGusCLKvGfSdC0ly8rC/wB1Rb82Bpr4Bzasq5sPMHtqY2v+BB1X9oae9YXHhh0Gg/rWvcTSQOssTFHU3BH9aishtPzuRyG95mzb6McJkc/KfqfhPFEnUldGXR0PxKfX0PQ7Gp1YzyrzYZ7SoRHiYxZl+646gjqhPzU/K+qcD4zHiUzLoy6Oh+JD2PcHodjV3S6rtPUfhx+5ExLKyvwllRRRV2KhRRRRCFFFFEIUUVyxOIVBdjXCQBkwn2eYKLmk7mnmqKAXlmEYI0UaufZR09Tp6iqnnnncQrljs07/AAJ0H67enYdfxNZTieC4jEFpXZnlJuQ5Hm06G/lPSx006Cs5i+p9k4TzMmx7MdMmOZ+kiDZJJoz0cqNOx0Y39rVqvJ3F2xeCgxDWzOnmsCAWBKsQDqASCQOxr8yRwgggja++hBG4I3BG1j1rXfoX5lAT6jJ5d2gJO99Xj/G7D3bsK7pNtbFcnnxMrDV9odrDE1eiiitGOhRRRRCFFFFEIUUUUQhRULH8RWPTc9qWuOPJionhMjxq43jbKw+Y/MbGqd+uqpODyfdGJWWlbz/9JMeHDQYVhJiDcFxqkXc9mcdth12scVZ2YlmJLEliSbsSdSSTubm96mcxcvy4GTK3mjb4ZAN/Q9jUbD+4/r1pTW9p6w6T1noyqlU/4/n4zlfp2r04013PT+VfJiLXO+w7ntbqfbvVdxTFzQNkeLI5AYZmBNjfWw266XriKW6R+p1dVHtmSYHkicSxmzqb+/8AMGnzgHNudlkiPhYhdCL/ABDS9x99D23Hodazw49fDvnIc28hUkEnY/CMv4t6VInw4vrmRxYgEFWN9iAwBt62rltG7BPBHQzIYU6kk1HnwPfP0fwbnKGQWmtFIN+qH1B6A/rW+dMMGLjf4HVv2WB/dX5Xi4tiUFmIkXs2/wCO/wCN6lYfmeRfiWQfsm4/hTFuuUYYA/CZ76IjuI+U/UlFfnDh/N8hkR4pHEkTCRVc2DW0ZTa91Kkqe2a41Fbtw3mWCbCjFK1kI1U2zK43RuzA/K2u2tWKrw+cjBEqWVFJc1zeZRuwHuRWD8z89g4hjnex6J26bkW9u1qqH586KsrftPYflekHVsfZTM6a0X2mAm88V5mghB8wLdAP5dazTm7n3IuYkGQ/DFfbsWtsPT/M0iScQxOJ1zeGpVmUINTbdcx3I62qPNwMFM6XZwSCBrmFrnKdmYam25BO9gKi9VtwzZ08B+ZxrFRfUGTIacQkaQzSgO7Nmvcg+w6ewt26U28PnYtGUkur5dwbWLEMDdiQQFcbizAXvShGQw0PtrpV5wSQ+DZTeTxmyhdbL5L39Q6lh872Usabp7CTt8JQpuZ2IaeeZZFGJzqLZrgnozJZcwPc6qQf8P1qrw8rKwObK2jKwJBBBuCCOul71cc1qB4ZKhZH8zgG/wAIt7buBf09KpYpAR6+vQdqRqRh8iV9QMPxNv5E+keOcLBi2WPEbK50SXoPRXPbYnbew0OvzRyxypNj2vfwsOps8rC9z1WNfvN+Q69juHB0OHhSGOSRlQWDSsXc+5PTsBYAaCpjWLWALOsvacWMvrRnoqpwXGVLCOSys2in7rHt6N6fherarldi2LuU8RpBHWFFFFTnIVC4vjPCiLddh7/9r1Nqg51OXDh/upIhb0U3Qn2GYE+gNJ1DMtTFeuJJMbhmZ3zZz6uEOQr4kx1AvZV9zub9vz7qeH+lzEZrvDGV7KGB/HMR+VRvpa4Q64hcQASkihSR0YAC3poAfnSAPn/Xz96oaTSU20hm5J6/GMd2DYm5JxjD8TgZQdLaqfiQ9/b1rMJ4WhlaJt1OnqOhqs4JxWTDyrIh2NiL6Feot2P9bU0c1IJY0xCa2sfXKe/sf40sUHTWbM+q3T3GX9FqSp3fWK3MTHyHXW/XtbW3zqUFjZVEIyGaWRYg40CufCync+VMtm1FzJ1GtJxBmzeZrjUj0BN6aOBKZ4YIY4fFkRpCSt1MQJjyEMd5c4JtqLED9nQI2oIjVWdrqGOP3iN3LXMOHV1iWGNY/GSJoyyCONk83jZsl5DdRZnYE2sLm9W2N49Ciu04fEJIxYKoRleMs8cYUNoQURnYhlFyunmpOg4Xh+HYnEeO0igeGkbC5RmIzvmVbZ1BCDIdSGDW7RxzThpAIZY5ZsjERuj5HZdbI5Pb9MWJG4FqomkMcoCRxJ1uMgP5dZxaGPMxhR1iB8iubuF28xvudTb1t0r40YOtesG3kHmzEWB9W2OvvXpyu5On777C3U36U3nM9SiIlYA6Y75WTwspDpoVO/r/ACtVlHzI6YdgLgOwuvQsBbU7kWH5V25p4ZPhY43doUzqGMTP9qAx08gN9BvpptrVHOn2aX2zn+NSKhgCZ5/WWVes1XdCOIsczEljqa6+Df8AyqXDFYfl/wB6+Rs2ayjMx2UddQN+mpA+dK3FjhZ5Euzt4mWnBZ0UCOSTwxctHIdoyLki23mPf1HUU1rlc5JV8OUWBAtZtjYH7w1BtuPzpZxnLMgRWzxPmUkKCwNrdCRbt8WUVw4Fi5SxhK+Iig3Vr5ka1hlNiQ9hYDa17W63amcAK4lypnGFcS44vyojuDEXQvoSDmJNv0WOpt5txpGR1qVhskJyBBG4X/SsyxhBlF0YjzDMRpvc66Za6YWYkAFs0TOFUyWzRSXGSKS975xYXtdcw3uDXrjfD9PDkJACNkkF7Rs5y2BAGnlUFRuHYAWNg7AEdgDmJ3GuIfWJBKLhcqhB6WuTb1JPyAr5yzwY4zECMtliUB5XG4S+w/WY6D5nW1RsTJZcxsDbbsex9v4U28OIweEs2jW8WU9S5HlT/VFh7k1l2WkAtjnoPjEaSo32Fm6CN/GeZsPgoUWwVFGWOJN7D9w7sdz3NJUv0v4i9kgiy9jmLfiGH7qQeMcTkxErSOdSdugHQD0FQCL02j0egG6zljLz2dy9JufLPN0XElaJkKSBblQdNPvK26sDY/uJ1rSOS+JvPhQZdZY2eGQ/pMhtm9My5Xt+tWR/QnwBvClxb6LJaOK/UKTnYel7L8mrUPo9S8Esw+CfEySJ6oMsSsPRhHmHowqOlTs9Q6J7OPODnKgnrGmiiitOKhXLE4dZEaN1DI6lWU7FSLEH3FdaKITLuIcOEd+H4sZ43B+ryt/pFA0Un/GQaEffGo6gZDzfyjLhSXS7w75huv7Q/j/3r9R8X4XFiYmhmQOjdOoI2ZSNVYHUEaist5k4ViMGVSS88DHLHORqL7JMANG6Bxo3Wx0rNep9Mxer2e8fiPTD+q3WYP8A1vTly84kw2RthdD7H+PX51C5v4EIT4qABGNiP0T6DambhnK82DwsTzjK+IzS+GRZkRcoF/1iCCRuOut7S1LrbRvX3SVIKW7TM04lCVOu4JU+4p65W4ymCLeFGrSR4ZzNMFAQMVDRJmuc15MqEm1yRlG5ZY5lw6+LNbcMGB9Gsf41Qa29Dr/X508KLaxmdtyj58f/AJNb4hxCNpTiQViDi2J6xsLSaZWBXxRZJAg1PiWZb3zJ+BYTDxkwLWCss7wxlo0PRwjBox5dWQi2l1K7h75E5fwmMwZmxBVnYMoUWP1eEEoFRDcITlJz2zakgg3amSDmjhsAOHw13toYsPE7nYJ90WvYAb3qmbAmVVSSJIKWwScTIuWIJ8SzrFGoIAZmNkgiW2jMQNNPcta+utN+aHhJV2/teOkH2KZciQr1exJIvr5jYkAgWBJP3ifHsNhWIw2EmklDooOKzrFA+X7MCI/eVFFrKDlAOalmwLvLM+eaQ3ZybfIdgP4VIkuckYHh4/19JpaWu7UKE3eqv78z9QJL5m47isblM7IqqcwSNAMpta2c3Y+ovY9tKrMdFbCwuOsh/wCeu0+E8SCWUrN4QGRJIyuTxjsHJuxW5A8ulzYkVL4lhcvCcKx+IzEE/OShuAo9/wBjE641BWSscDv8TIMMgIt1A3/hV5yjh1vJM2Wy+QBj8ThS1gDvofXbbeqDh0BY7+RFzObgWX5+x1sbAGmfB8ShjijcXSNiUS4J0A88mTWw8uUddbm96dp6tp3meaorwd5lTDzFK9vFbxEJBPlF18p1Ww21vY3029bqBFzrLD5msrHLrmW4cPlHxMga2W/mU+U3Fqp+aZQ0qsHDjJ8emoNiuqixt5qOX+LLCTnLFQDkN9AbaI2hIW+ug0PcbNV9rFWMYtm1ijGXzYqPwpE8RDIySKAHu7MScpKkBolFhc6ZdzYC9MeJxSBLs65SNSSLEEfmP51RJjDOAcylGJtlJNitzclXXS40N+2g3qixvGVAbKxMhASMrcLHl+I32JBIATW2UX3LM4kAZMeSAMmVMUaSYpUX+78diOxUMW/AgafKpvO+OOQLf43Ykeg6fifyqFwWO0wA1yo1rfJf41bYzlmbGriHw4zNhY45PDAu0gdnDBf1gEuB11G9qzRh71+ZjtNgUMw7zEEC1O3JHIr4krNibx4XcdJJx2QdE7v66X3Hzk7gSKq4qdA5J+xiYeXQ/wB446i98o6+1aBwDAYriLtkdooASsuIt5mI0McI2uNi9rL0BNPuvYt2dQ58e4SS1gLubpLkZsW/1DCjJCgCTyJosEVv7lD/AIrLp+qCSdbVomGw6xosaKFRFCqo2CgWAHoBUfg/CocNEsMCBI12A3J6kk6sxOpJ1NTadRQKlx1PeYtmyYUUUU+RhRRRRCFI/wBJXF54lVEglaNhdpUQuqm50YLdl6EEi2u9xTxRULE3qVMkrbTmYrytw2XGYuE+DIsEUqzSSOjKnk8yImYDOTIF20ABvTB9MbWOF9pvlrH/ABrSqyr6aXzPCnZGOn6zAf8ALVS2laqCq/vMsVOXuBMyLiJVsSx7hb/gAa443g3jFBHYE2RAPvMzABbdB6+tc3k+2ct92w9dh+daryTweOF18Vc2LMfiEbjDodFBOwdr27mzW0BJS1ppUEeE2V7L/HKvyTn+f34y7wcWD4akUPkjDgRmUqBndV8viOB8TDNa+mhHa/zmrheGxMTLiEUgjR7DOvZlbcfuNVnNTlpSrCSLSyyCAz4eaM2LRzRgaENmte1gbg6kVB5fwSSS5IwvgxWaUxNIIS+6xrGzEKxOpA2A13FUwmR2hJz1lBm2+rjiKfN/EoL4KCUidMJCPHVZMplcqqAA/ET5b9wDUSbmVPL4PB8Ii3/0iB3PsWA19SprTsbyNgsSS7xCOQ388Nla51JIsVJv1Iqlxf0TTbwYpGHRZVKn5sua/wCAqxRqanUAef8AXEiiVZPaMR8B94iY3i+JlQLIyRxKbrh4EVIVPsBrrc6k61b8ZF+CYU9fHP75al476NeJL9yJ/wBmVdf9rLU3i/K+LPC8NhhDedZSzKHTyi8huWzZdiOvUV21lBTke19jHaw0mnbT/cSMBiyisAqkNobi4y5bWy6A636jRmFEmIaTKWKjKoUKNEUaXt0W9gbWt8rAXMXIeOIAIhT9qZf+TNUheQbaz4pfVYULE/6zZQPexprXDbgsMTAXT3ONvQRUTEkgLa9rKO5Fz+G4+d6u+F8HEoF3N+qKLBRqNWNs2otYW96vYsDh4ARDCCxFvElOd9NrCwRD7CqLhOM+rlo3cIBezkXYjdQq9Tv310t2ZRZVY3HWWbdKQe0cdZcYnCqALxgItlvoGC9FVRmLHew1JvbS1VHHm1jTqAXZSfh2RFIGgZVQ3toS3tXWfjQv9lmLWW80upuDclE2W+g6bbVVTjUtf4rkk7k31J9Tvep33LjaJSuuXG0STwU/av8AsgDtvWp/Qqbz479jC/vnrJeGyMs2mvl/jf8AjWpfQ1iLYzEqdDJBGwH7DsD/APkFV6Bi4H3TQo50gx+8yHzfwmXD42YvHKYJGMkciIzIA3mZGKg5CHLWBsLWt1pm+iyacNLGIpBhMudWkQoBKW8wQNZmVrliQLAg63atEoq2umVbDYCftBriy7TCiiirEVCiiiiEKKKKIQoooohCsb+krErJjmDHyxIBcW6W79cxI/GtexmIEcbO2yqT+HSvzdzTxVn8d2OrkgepJ3/MmqWsJICDvlrSjkt4Sl5aAkx8JJ0eZit9swDGO/fz5a27gvDkw8YVf2pHY+eR7eZ3PUn8hYDQVhHAYicfgkXcTRMfbxF/gK3jjnChiEWJjaMupkF7F0W7ZPYsFB9L1Q1w9ZRniXxwSO8Y/j8xH+kHHy44rgsAQ6tG00rq3lKglVUNsQWB23OXpepX0U8T8TD/AFUqEaAkFQuU9mLDq+bc+orrg+MYeLH4mO6qfFihK6BUjEKCI+iiXOh7GRO9esXCMJxKHErosx8KXsbjysf3f7Paouu6rssY4yP5lZupeaHhMP1ql49zimDkEc0ZGYFkbN5XAIBscuhFxcHXUb0woKzP6aV8+CPpiPX/AAvQ1HRVqXCkRFhPWW0/0mQGwWMuzEKqhtWZiFVRdQLkm2pFWfFIpGHlYI9r2+Jb9tgbX6j86xTBNaeA/wDqID/9xb/wrcOI4gC5+VT9IUpWylRO0EnMzCLnNnUEqwJtpdbD55da6YDjrzIXbRWuFUWuLEi7NbUkjYDT16KMHwL10/Df/P8Ao1d8soDAv7Un/G1WtbTWleVUDnwktKxZ/WMl4ibXU1Q8fkuVVRqPMTb4R/K/7qYsTg9DeqLgWLVpJHB+0LeVT95R0XXe2vfek6OsO2fCP1bgV48eJDiF6++FfQm1hpr1q1x+FCWkUBVY2KjZTa4I/VYbdARbrpVNL270x1ZWxPLOjKxE+YOQCaMnqbfKtG5Gm8HiWGY7SeJh27DOudfxeNR86zbF2IuPiGtNGExjSQq8f96uWRL/AOIhDp/vAVAttZX+U2PR7b6Wrn6QoqHwbiKYmCKeP4ZUVx3Fxex9RsfaplbEjCiiiiEKKKKIQoooohCiiuGNxSxIXbYD8a4SAMmESfpV4+IoRAp877j0/rX/AGawfjuMBZY7iyasfW1h+At+JrQOd8TnLzvrtlHck2AHqfyHtVBgIcQPhwsfm11yk6jfzRE1k9uHc2d3d0+80UxWoHzilwXiQglGKtfLKjBeuVWBI9yK03Ec+L4UuLIKIEKYdGtnkY6l2AJsLhQB2DHqKqnmxINjhIRY7WT/AKVWUfFplK58Dh2JvYMUu3e32Xtt6dxRaVsIJXzHT6wa49x7vPJOfOZZxMuztiFfzPcsCRcA9P1hbS1WnD+ZpBhCkrmVUdMgb443BzpZvvIcpH6th0NadFx2VdDwuA9Pu+/+DRiOaCnx8KwwG+6/9Kmi8MMFfMfmIsKk5QYj4vFIkhjklkVAyra+5JsNBudSNu4rPPpfxKyDBuoa15x51ZD/AKPo6g2+VMvMvBJsdhcLPGww2LhyzRgG8YJscjEAaaIb5dLbUi89Y/EypCuNh8GZGcKVN45bhQSCCcoFgbE9elK06qLFweec8/uflFt0MUkezxnoJou+v2imtR45jzmsugv/AJ1lEz6KTuGQ33Gjg20F7+16f5MXJKfJA2tzeU+EnzuDK3yVfemekKS5U5AHPUxmmcLmIMA8q9rfy7+vtVzy/i0jh1zkhn0SJ3+8TqQAoPzqraXP58gW+uVAcqjsASf6FWPAGIh9nf8A4zVjWFRX6wzzI6YEtgHHEsJOJs+FlmyhUysIyfibdcxXXKL7a/IaXSsJIq7n89vb+dPmPxIjheRkDhcpym1jdgOoPvUfh30hqnxYCF/kg/8A11T0qs4Y1pxnu/uR1qA4DNIP1yJsNnYgsUF++fMBf8QDbpftVBNiFvoRT0/0lRHQcMh/3P8Ap1Gk+kND/wCz4R8k/wCnVyyu5iD2Z+o/MpulbnJcRRWcdSLW6VP5Ux9i0Z/aX+v62q3fnXxBZMFCDZiTZPKF3Y/Z7VBn5nmGUfV41MighVVA2X1IS4BtffYHsarNWxBXb5j8yxpqVpbfu8jNY+iri4R5MCx8rZp4PYm8sfyY+IP22/RrS6/NeF4m/wBniIWCyRtnQ9mF9D3U6qe4av0By1xuPGYaPER6Bh5lO6ONGQ+oNx679as6Swsm1uojtRXtbcOhlpRRRVuV4UUUUQhRRRRCFZ5zxxvxG8FCMoBJ13/r93uavecePCFPDUjOwPy/r/Lrpj3G8W7uIomvLJqxH3F6t+0dh86zNZduPZJ85apTA3tOSg4nEgC5iiOnXM+xI722HzpzxChIrM3hlSgMpFxEpYB5CoNjlUlr7aa6A1y5f4QkcSRjMHAOw3Ft7W3HberLh3BDxK4LsuCF1kK6NO4Jui/oxI2jHW5FhaxqnXX2tioo4H75zrNgEmUGN5iwwiMckuWaFkIbCymVMRHYAqJniskgF7kKouNDYkC74NxDg0isy4mSKWWNoy+IkbxEDW0DSZo9CARa4vfuatZPom4cRYLKvqJST/vXFV2I+iGPXwcXIl1ZfPGj6EFT+iNidRYjpatwVoOgH0lXJkrGYdoXRJyJI5j9lKgsrG2YKQD5WygtoSGCki1stUvM0OVGQHcZQCDrfYa9zpTHwrgWMwkC4b+z4zDodAzNFKmt/KfONDqNVI76CyzgsRLiuIeFJF4aQS5srOGcZBm82UWsTkt3DA3N6ytRotj9ons+EetuRgx+eyIqj7oC/gLVln0sOL4b9qX9y1pGLmAB1Hv0rKvpCxSyMmUSExl/hR2vew0IWwta+p9utVdIS+pDdwz/ABJsMIYk4k6Dp5k/4hp71oZck721IrOsUWtpHLcFTbw21sQeopyTGB/OpIB11BBHoQdb1c9JAnaR7/tJ6TvEUMOBkW47a/17b1a8vC8ZHTxZP+KqqNSFF9CBrcbemvX/ACq95TjujX28V/x0P8as6/8A1fOK0n+z5SXxQZsPKv6hIHt5v4Um4YeX36+1aO2GBBvsdLVnPhFHaM38rEH5Hf1pnoG0bnT5xPpVMqGEkLHfb+v51Kw3DfFkWNLlmNrjoN2PyUGueEiZ2EcaM7nUKv3e7MdlHqSBVtJh1jEJ8NZFaYDxVfyOuSxQEj4CxNwpuVBLC1gNnW61KVKr7Z8vfMrS6Z7GDH2R5zlHgFiYiKJpVnCrlBsHa4KWY6CMlWY6EnUHQ17ggOWSxUyNcS4hv7uMaApGTudAN7jS5UkKtpzCBJG8rFykYYmxyKzZdmkGljcLZCR9258pTzHgInVGllOJCqAkeHTLAlhYANcLf1Z1PcHavMpbxlj9/wB+eB456TcZe4RZ4XLHHKYM32bfCT+lte3QHb8DYbDQ+Q+O/UJvO39mlYLKP8N9lm9tlb0sfu0h8x4VgwXwkjFjZFPmT3sBcnvbL+j1q55Xx4nXw3/vFFiD95dr+42Pyp+pVqwNTX0PXv8AP8cZkaLQ+aX6ifpEGikbkLjZS2CmbYfYMTuoH90T+ko27r+ybvNW6rFsUMsSylTgwooopkjCofE8aIlJ69BXbEzhFuaz3mrjyxq00pso0UdSegHqfyHtVDWavssIvLGNrTdyekXuc+KZAXbzSOSqL1J/kNyf51A5P4QyHxXsZHNyTt7e3QWqLy8wxc31iR1Zz5Vj1AUb5VvbMe9tetaBDhVjHiEWA6liALWub36679hWY4NQ2n2j1ljdu+Erub8cR4OGiOWbElUU9Y1JAZ+19bD5npatE4CiLhoREmSPwkyL+iuUZQfW2/rWLcb42H4hFKDmWMKBp1zEkgdtd+vtY1oXCeZD9XUDyiONUJNr+VRmIuQL+p0UZdywWtfRU9nUMjk9ZWsbLRsx2PSIakliDZVVmY+uVAWttc2sL1hkX0i8SklQfWAgdkBCRR2FyAbZlY9epNW/MfGWxAN1JU3IBdrOehfLlzWGw0UXOmpvT/R1Cn1+KRwMisdxoCVYL+ZUfOrR6RcdZeFwZzL4Mfi3uZMgDX7lgB+XrUbgGPhGImDSKszEIkZ0OUeZiNLEsbab2W9OWP4IwBEYBF79M40tbUgNppqQR60h808utILvGyOLWexFiOuYeW43rDOntGRZn49ZZ3L3S0x+NF7VWY3FBhf+u1LqjiMwCZUW2hkIuWt13AB/GvsfL05ID4l9r+XKPyAvVNdMV9phLHaL3ZkfiV9x+NVTMWP/AHpgxXJjAXaWVx0PiNY6ejUucU4SyQRsHcK02UnMb7PpmPTSrVaAYwZPtwQQRPH/AIajElvEJO58SS5/3qt+C8HRCTHmFzc+ckE9yCTrVHhOFyHFeB48gBjDjzNqSSN7A9OgI9a84jG4nDmPJM3miWQhgDoxIG4vYgdR7E1Z7G649mrZzENdUg3FcRrfCHNc3NKHNkaDEBkYFmAzgbhhpr8rV2k5uxJQoVXMRYMosR62va9UscYGrHU9Se9XPRno6+u7e/GPOVNbra3r2rzmNHK3nTE4cBQ0sJKsctrqMpFiPMBctY3AJvpvUnFnNicG0TEuwzWIe4j8Mk3LMzgAka31uNrLaPyZAxxkJspy573AuFykXF7WsSNRrbvrf66uZMLFnIBxDyAIMhADyEEeSP4hm+F2Y2sDqLc9I1hNW2O8Z+oP4kdG+6hfdx9DPPMWFabw1C5isqWHiDz2uWCiRnVdL/GEF9PN8NMPFsCxXOz4pCRopMYY+l0mVT+NqruKzkz4eJ1kaJ5tmgYqTlbUocuax1IN2sNNRV4+GyiykJ3COIT7lTHcf7RrNZ2XbiXAAczNcRFllKEOgtmIfLcg/euqga9gT7mvELPGwlj0dTceo7VI41F/anytnUjUrIJLH9dt82m3avKnS3T8P+9eu04F+mG/nI/fGYF7Gm4lO6aXy/i48XEGBIIIvlPmjcagg+h1B/zFaVyzxkzKY5bCeMea20i7CRfQ9R0OnYn838L4nJhJfFjNxs630Zf61v0/Gtg4RjFxMceIw72ZdVbqrW1Vx1B2I6jUdDXmbkf0ddzyhmvXcupTPfNMoqv4LxQTobjLIukiX+E+ndTuD19wQCtNWDDI6RZGIq43i0rYlsNiFEbi7R2N0mjv8aGw1GgZN1PcEEofPfBJXmzySfZtZYja6x6C4I/WNzffbtati5i4HHi4sjEq6nPHIvxxONnX9xGxBIOhpUwg8US4TFqBOgAcD4XU/DNHf7rW91IIO1Y+o07UXdsvIPlHqwZdpmcLwXEoqpHhs6nqCuQ9QRrp10IBrjNh8WGtJh5Rk8wJR2Gn62oHyPSmnAYg4SdsPN5stmjP6S9LetMeG4uS1zqDpa342/rrXX9IWKeVBE6KgR1mTObnN946mrfC8Qzgqb7fDf2ufa/7hWh8ewUMiESKMmUa9hqbqx0Fh12FZPHlhLFnzDMyqbasl7Breosau6TVi8HjGIt69ssppgNNu1zXfh+IKkldCQynTowIP5H91UfGJfgHuf3V34XiCwvcafvHX8KuRc2HBc5K3nOmU2kTqV/TTuVJsRuRr0tTMuNidM6uGW2a666d/l/A1ggxLXte1+3epeB4jJGR4cjLqDodjtf3t+I0ohHjm/Ew6NCfDxAPlNgY5QRfw5O2YAFW03BViC1onAsYJ4QwRRc2cZtVcaWOl9ihGmx6dFzGYxpl84UEE2sLWve4HQAnWw0Bva1zfzydihFiXjf4Z1AB6ZlvcemZbf7NutUNdQGQuByP4jam5xHnikahMq5bqLXHSs55nlX6jApNrYo3P/1O9vStF4k6xw6LY2I9h/Ksp5jjEmHhjb72Ia4G/wB/uRWXRyV+P2MeR1+E7YZ1+vAEh82HS2q2aztt9plNu1zvt2ssbwATxGIDJPh1+zzeVGiJJAI1W3xLddiouQDaqLDYQ6FFh+tYcHIgAySxtsV8zEuDcXAIBzL6i34XxW7RSSKYru8UiELZsqOwVrLZ/tIyLqF6jXU1bLOjB6zyP36ESGFYbWHWQ+XuTnlxDLOCkcY8yhhmkY7WZSSo+9fQkFbb0/YHg0SBUWBUVdQqH0t5rWzG1tDcepsDVbgBIsrgspxC3LBhupXySeUnynKAT7iruUlwrRyZToQNCr373sSLbWI6Gk6zVW3vlz/OBO0UJUuFETIcTCs7yR4MpKLiPIM8UiE/EHHliuoJOToDqbFar8HGYZF8aNh4UAIICDMWJSUHOlnABQlVNhqRckCu/G55ZGfwZpEOcpfOrm7BnLKblkUBTddACpGay6VrPJLAPHnBw7BoyZCc4A8mdGUqJULBrMWYfBmJsTTva5Pu8SZLCgSby5EZZ2xBFlAMcIvIBlve6qOpABzC6lSLgUwYnEGIWDMVF7iMoUX2kSJSPmK+YLAkxogJKqgCkLoU30te4OmkeZQNjULmDj0cELoJmz2sY42iXLcaXEiB19rG/Y0r/Y2AMznsiJGIxPj4iSU7LdAS4Zha5AuqhTc+51rjbbt+6ueBYiMX81+mlhfta2UdtNNq6Kf5f517bT1iupVHhPM3OXsZjOcn9fuv+FaH9EvL86q2LdjHA4skfWb9f0UdDudenxUXIPLX16ctIP7LCQZP/eNusY99z2X9oGtb4zxBwyYbDKpxMo8ikeSGMaGVwNkXYD7xsBWJ6W1Af/10GSfKaWhpKjeZFlxsjYuKLCLfELYysf7uKAnXxbb5vupuTroATRTVy7wOPCRZEJZmOeSRvjlkO7se/YbAWA2r5SdNR2NYXOZbZsnMtaouaeBmdVlhIXFQ3aJzsb/FG/eNwLHsbEagVe0U9lDDBkZlXMEAx2GEsalMRCW8jfGrjSSJvXT2+EjQ1nMPMMzyPaZ1CW8oIUj8NT8yd62fm3A/V5fryD7N8qYodvupP7rorH9Gx+5SDzXwZIcQJREskU58wKBssm5sLG4bf3vWOoGntKOMjqPx+/ePzuGRFfivNjyKFklaQC1lawX0uFUZv9a+3euPDuFYvEt4iIbdXbyovbfcewNPY4ZkAkkjCBVtHDlA3HxyKAANNl39qrMBjWwkwOZvBbT9n0/lTP8ANC+pWoB/fDHM72JI3Eyj5p4DNBkZm8SMqAZFFgrdQwvtfQN120OhpMFijHe2oYfge/tW04WcSIwGVkK7MBZwbi1ttvSl3i30cwOpkw7tGw1KZbp3sB8S/In2rlHpEezb18Zxqe9YoxYsFQRb130PWpPDZA2vW+3a1q5PyfjYyVjQSXNmEbaDe1w2UjbauEGAxOGYmSGQKCM10Ngfe1uvfW4rRW6tvZYfWKKkd0u5B2uL9648Gw74jEoEBASSN7/oAMGJProQB1JtXaGXML9N6ZOUgohkAuJPFckC/vqOvly/lUNVYa6yR8J1Bky24vJdCrDKwvvroe+utZPxqf7OG/SY9L/p6269K1zjlxGASSwXYjf5206dfesZ5rF41uR/ff8A9HprWNpF3MB7/wAy0xwCfdLvH4Vpo1dXJmQEAs5WMKfivla6KQL3Lr8OgOtL8sRTEh3VrxunlVgWdQpYuSbHyRgnzjTS5tvZ8uYhpRZ7jLlAAsC7G5VIkFwoGUm+trX0BNo3MXDi2ebXxGPhpZiEyAMJdb6x6lSx3IJ18QVaXdXYa34/uQ4Zdyx4x0rNCkkrFZB4ZHhTao1mUkSHyvc28r+UlTc2qLJLlLtK+IRWChhJ4QWVyWtGj3JFwxBKgCwuCNapuCFV8AqSB5XzRyARqrIfK6kZr2WQ5fbXS4suI4u7St4rCQraFWUiwzMCEW2YufOoJBsQNGGlVDkHb+/eOxxmQ+YHRbymQMQsLKiebKFZWZBqLpora5SWAOlr1DwbPnhw0bDLEFaSNbq2ZLEhAUYq1/Mcp81mZRc3NZxriueK10yhXIANtGBUkXclzaxAbQgLrqAfXKeNKx5lUOXbzqWIDj4iq/oSqRnRlIDAON00shCtef39+8VkFsR3fFBBnRyq76SZFtfqw8gX2ux9KROaMSjYoGJjovnBkJUX6qNxfchtb2OxFXPG+MRqpbMyubjOo84a1xnUaMSotewJGxUEFvHIvKisi4jFi6v5oobWDjo722j7KPi9qdoWWn/nsOAPOK1KGwdmvfFwPe1t/wChX3C4d5nSKIXkkcIo9T1PYAa+gBpm5o5RmVnmgXMrEsUUWK3/AEVHTpYVffRby6Y0ONlUq8gKRKwsUjBszkHYsRYX6D9atmz0vUdMbVPPh75lpoGFu09I04WOPhuESKNS5UhUUfFPOx6erN+CjsKaeVeBHDq0kxD4qazTONh+jGnaNBoB11O5ql5OwX1mX6+4+yXMmEU/o7PPbu/wr+qP1qd6zNHSwBss9puZouR0HSFFFFXZCFFFFEJ4miV1ZGAZWBUg7EEWII7EVnWHw7YaV8IxP2VmhYk3eE3CG/Vk1Q+wP3q0iqTmblxMZ4d5HieMm0kdg+RhZ0uQbBrKb7gqCKp63S/5Fe0dR0k632mI7pLi5/q2GsWUgzSsLpAu9jqM0jdEv6mwqq4vwqWGU4XFZSWUskiAhJkGjEKSSrrcXW5tcEE1rfCOFQ4aJYYECIvQbkncknVmPUnU1E5p4CuMgMZOSRTniktcxyDZrdQdQR1BIquPRiLVtHtePv8AxGi87s90ybgvEThpFhkGZb3Rj1H86eBKGUOjnzaaWIt1HqPSlObDrKHgnTJiIzZ0/RPR1P3kbcN8jqDbhhMfJhlySDMt9HtpY9+3vWYwLHB4YdY7HeOkaOJLKYpPAfLKUbITsjZcoFyNBcb69u9IuNwuNRMuIEjEWuDKDGTf4tXy2vqNAb+tOmExa2z3UgaD2I7adf31y5n4YmKCMHICMHBW1x5StiCb2sdgOwpmlu7J8EDB7yOki67hEfh8hOZiMt/0tbkXFx30sPlVnwTiBixCKtys7CNgdrn4HA7g2+VWuF5LhAzTzSaDyomVQfU2LMfxG9WnD+UoIysyJc5SQWdmI9gSQLi+taF+upZCvJiVrbOZI4h5ULs17i2ttT/X8axXmNwQBaw8U7fOtm4zleLykE6ggaXv1FyPTvWM8yoci/8AxT+Pmqp6O/2DPiI6z2G+BkWLQhlJUgWBXRgCCp82+xa/vXWbFSkx3IZY1RQhFkypaykb2NgW/SNugAEaFh1NulSI1L2VbFiQq3Nhc9yfhFe0uppZd9gHA6zz1dtqnahM8wY9jPmcAgMrMHYZLsSZDZtMpYs2UFQLkdCTKlx4IIJGkYUqwVVaxFs5sDmLRISbkZjYhbkVX4iPVlFgpIa+bMGXuDYKVtbzGw0G2gaqnne5GYltANx6eXY9fW4tfsPOtWjtlRgTbDMFw3WWGNOZVtmKg3K5mIsddbWCr4fl8oJujjQAVInxMrXuQLlSdBfTq2lixIB2tcA2B1qtwoIUqTbOCwD2I8pFtG00GYXt0YbE2d+VuTJMUqSuGiwp1F753F9owdwRY5zprp2D6TQmTaOBE3dqcdmZE5L5X+tSePMCYI21zEkzOALICdbCwzegA66ah4cuIxAw+HCeIFDyyOCUgQ6KMoIzObHKlxoCTUXEXi8PD4eMGVhkw8C/CoG7seiDdnO/ua0DlbgK4OHw755GJeWQjWSQ/E3oNgB0AAqkCdbZvYYQdBGgdiu0Hnvif54J/q+JADsT4MiiyTrvYanLIB8SX9RcV64ij4qVMCrH7QZp2BN0w4NmAPRnPkHpmPSnri3C4sTEYpkDodbHcEbMpGqsDqGFiKr+WeW0wfikSPK8rAmSSxfKosiXAFwuvuWJ61z/AMaouDj2fD3zvbHbiXMMSooVQFVQFAGwAFgAOwFe6KK04mFFFFEIUUUUQhRRRRCFFFFEJRc0crxYwK1zFOl/DmQDMvdSDo6Hqp+VjrSJj4psLpjIsqj/AMxGC0DDux+KH2cW/WNaxQRVXUaSu8et18R1jEsZOkyWLg8bgSQtlvrmiIKN6kbH3FeDh8TEbhRKoN/IbN/st69iaesfyVhHYvGrYeQ6l8O2S57sn925/aU1T4nl3Hxao8WKTs32UtvcXjc/JBWe+huQcesPP9+caLVPulPw3jUeazAqwHwvdTptoR+dTIeIF/PcXGnyOpt0tpt71U43FrmEWJjaF2PlTEKACf1JLlG/1WNcMTwhovNBdtNUbUH9m/z3vVIkBtrAqffGY4yOYw8XTNHntbTWx0vbtWSc2xgYdD18Y/ub/KtHwvFBMhLAAgWy9V9KRedU/sMbf+oPv9+rOkUpYmf+w+8g7ZVvgYrYQAkC6j1YgD19evQE+9N0WFgXDmMWbxFBZiLlx91hqcqDQgddNTe5S8NC8jpHGheRjlVQLkn0Ht19zWlcv/R4iDNjpDNJbWJWtGosBZnGrEAWstgNRcit30zZgKGfA8O/P3+0o6BQMnbz4xQfCePI6QlnIJfIguXOYEAZMttiMxBsHsLWpki5OxExR51iw+Vr2azuVykZciGwF2a1yLC3a1NmGx0YPg4KJpSuhiwiDIp/Xk0RT+216t8PyzjpTd2iwiHon2stvc2jQ/J6x1N1n+tePE8S+xUdTF7B8tYLDASOolZdfFxGXKhAAuqfCuwOt9as8LisRiz/AGOMuDviZbrAvqv3pvQIMv6wpo4fyRhI2DyK2IlGofENnIPdUPkQ/sqKZAKsJoSxzc2fcOkUbf8AqJR8tctR4QM+Yy4iS3iTPbM3ZQBoiDog09zrV5RRWgAAMCJhRRRXYQoooohCiiiiEKKKKIQoooohCiiiiEKKKKIQoooohOOLwqSoUkRXRhYq4BUj1B0NJnFeUpMODJgCWQanCu11I6+C7G8bdkJynby7080Uu2pLV2uMidDEdJivF8MJojisNcML50sQ1xoysp1V1O4P/dd5lRn4XhsqlnfEWVRuWJkAFupJrVOcOG/V5RjIxaOQqmJUbXNljm9wbIx6gqfu1CjcApZV+z+Dyjy6EaaaGxOvrXn7WbR2qpGQCCPh4SyB2imL/AODRcLgMkpzYlwFdlGZrt8MEQ3JJ0NtWPoBZr4XyjJiQJMfdUOq4RGsoHTxnGsjd1Byj9avHJPDvrMxx8gvHGWjwoO2nlkn92N1U9FBP3qfa1NPQ1h7e/lj5RLMFG1ek44TCpEgSNFRFFgqABQPQDQV2oorQi4UUUUQhRRRRCFFFFEIUUUUQhRRRRCFFFFEIUUUUQhRRRRCFFFFEIUUUUQhRRRRCcMbhUljeKQZkdSjDuCLEfhWPSQYo4j/AML831g+Uy20+r9cTfa+Ty2/xNOlbRVf/wCa/wDkf89Iu06W43DpJq5XOJJwOESGNIo1ypGqooHRQLAfhXeiinyEKKKKIQoooohCiiiiEKKKKIQoooohCiiiiE//2Q=='; diff --git a/FabricExample/src/examples/Line.tsx b/FabricExample/src/examples/Line.tsx new file mode 100644 index 000000000..910aeb078 --- /dev/null +++ b/FabricExample/src/examples/Line.tsx @@ -0,0 +1,67 @@ +import React, {Component} from 'react'; +import {Svg, Line} from 'react-native-svg'; + +class LineExample extends Component { + static title = 'Line'; + render() { + return ( + + + + ); + } +} + +class LineWithStrokeLinecap extends Component { + static title = 'Line'; + render() { + return ( + + + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [LineExample, LineWithStrokeLinecap]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/PanResponder.tsx b/FabricExample/src/examples/PanResponder.tsx new file mode 100644 index 000000000..9452673ef --- /dev/null +++ b/FabricExample/src/examples/PanResponder.tsx @@ -0,0 +1,101 @@ +import React, {PureComponent} from 'react'; +import { + PanResponder, + View, + Animated, + TouchableWithoutFeedback, +} from 'react-native'; +import {Svg, G, Text, Path, Polyline, Line} from 'react-native-svg'; + +const AnimatedSvg = Animated.createAnimatedComponent(Svg); + +const zeroDelta = {x: 0, y: 0}; + +class PanExample extends PureComponent { + static title = 'Bind PanResponder on the SVG Shape - It does not work on Fabric since it uses `setNativeProps`'; + panXY: any; + constructor(props, context) { + super(props, context); + const xy = new Animated.ValueXY(); + const {x: dx, y: dy} = xy; + let offset = zeroDelta; + xy.addListener(flatOffset => { + offset = flatOffset; + }); + const {panHandlers} = PanResponder.create({ + onStartShouldSetPanResponder: () => true, + onMoveShouldSetPanResponderCapture: () => true, + onPanResponderGrant: () => { + xy.setOffset(offset); + xy.setValue(zeroDelta); + }, + onPanResponderMove: Animated.event([null, {dx, dy}]), + onPanResponderRelease: () => { + xy.flattenOffset(); + }, + }); + this.panXY = { + style: { + transform: xy.getTranslateTransform(), + }, + ...panHandlers, + }; + } + render() { + return ( + + + + + + STAR + + + + + ); + } +} + +const icon = ( + + + + + + + + + + +); + +const samples = [PanExample]; + +const scroll = false; + +export {icon, samples, scroll}; diff --git a/FabricExample/src/examples/Path.tsx b/FabricExample/src/examples/Path.tsx new file mode 100644 index 000000000..927c96372 --- /dev/null +++ b/FabricExample/src/examples/Path.tsx @@ -0,0 +1,103 @@ +import React, {Component} from 'react'; +import {Svg, Circle, G, Text, Path} from 'react-native-svg'; + +class PathExample extends Component { + static title = 'Path'; + render() { + return ( + + + + + + ); + } +} + +class UnclosedPath extends Component { + static title = 'Unclosed paths'; + render() { + return ( + + + + ); + } +} + +class BezierCurve extends Component { + static title = + 'The following example creates a quadratic Bézier curve, where A and C are the start and end points, B is the control point'; + render() { + return ( + + + + + + + + + + + + + + A + + + B + + + C + + + + + ); + } +} +const icon = ( + + + +); + +const samples = [PathExample, UnclosedPath, BezierCurve]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Polygon.tsx b/FabricExample/src/examples/Polygon.tsx new file mode 100644 index 000000000..d4e4ed3e7 --- /dev/null +++ b/FabricExample/src/examples/Polygon.tsx @@ -0,0 +1,91 @@ +import React, {Component} from 'react'; +import {Svg, G, Path, Polygon} from 'react-native-svg'; + +class PolygonExample extends Component { + static title = 'The following example creates a polygon with three sides'; + render() { + return ( + + + + ); + } +} + +class FourSidePolygon extends Component { + static title = 'The following example creates a polygon with four sides'; + render() { + return ( + + + + ); + } +} + +class StarPolygon extends Component { + static title = 'Use the element to create a star'; + render() { + return ( + + + + + + ); + } +} + +class EvenOddPolygon extends Component { + static title = 'Change the fill-rule property to "evenodd"'; + render() { + return ( + + + + + + + + + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [PolygonExample, FourSidePolygon, StarPolygon, EvenOddPolygon]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Polyline.tsx b/FabricExample/src/examples/Polyline.tsx new file mode 100644 index 000000000..10cbfd4e5 --- /dev/null +++ b/FabricExample/src/examples/Polyline.tsx @@ -0,0 +1,89 @@ +import React, {Component} from 'react'; +import {Svg, Polyline} from 'react-native-svg'; + +class PolylineExample extends Component { + static title = + 'The element is used to create any shape that consists of only straight lines'; + render() { + return ( + + + + ); + } +} + +class StraightLines extends Component { + static title = 'Another example with only straight lines'; + render() { + return ( + + + + ); + } +} + +class PolylineFill extends Component { + static title = 'Fill Polyline'; + render() { + return ( + + + + ); + } +} + +class PolylineFillStroke extends Component { + static title = 'Stroke Polyline with strokeLinecap and strokeLinejoin'; + render() { + return ( + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [ + PolylineExample, + StraightLines, + PolylineFill, + PolylineFillStroke, +]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Rect.tsx b/FabricExample/src/examples/Rect.tsx new file mode 100644 index 000000000..79c104032 --- /dev/null +++ b/FabricExample/src/examples/Rect.tsx @@ -0,0 +1,129 @@ +import React, {Component} from 'react'; +import {Svg, Rect} from 'react-native-svg'; + +class RectExample extends Component { + static title = 'Rect'; + render() { + return ( + + + + ); + } +} + +class RectStrokeFill extends Component { + static title = '`stroke` and `fill` Rect'; + render() { + return ( + + + + ); + } +} + +class RoundedRect extends Component { + static title = 'A rectangle with rounded corners'; + render() { + return ( + + + + ); + } +} + +class EllipseRect extends Component { + static title = 'Rect with different `rx` and `ry`'; + render() { + return ( + + + + ); + } +} + +class RoundOverflowRect extends Component { + static title = 'Rect with `rx` or `ry` overflowed'; + render() { + return ( + + + + ); + } +} + +const icon = ( + + + +); + +const samples = [ + RectExample, + RectStrokeFill, + RoundedRect, + EllipseRect, + RoundOverflowRect, +]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Reusable.tsx b/FabricExample/src/examples/Reusable.tsx new file mode 100644 index 000000000..09346d1e7 --- /dev/null +++ b/FabricExample/src/examples/Reusable.tsx @@ -0,0 +1,169 @@ +import React, {Component} from 'react'; +import { + Svg, + Circle, + G, + Path, + Rect, + Use, + Symbol, + Defs, + LinearGradient, + RadialGradient, + Stop, + ClipPath, +} from 'react-native-svg'; + +class UseExample extends Component { + static title = 'Reuse svg code'; + render() { + return ( + + + + + + + + + + + + ); + } +} + +class UseShapes extends Component { + static title = 'Using Shapes Outside of a Defs Element'; + render() { + return ( + + + + + + + + + ); + } +} + +class DefsExample extends Component { + static title = 'Basic Defs usage'; + render() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + ); + } +} + +class SymbolExample extends Component { + static title = 'Symbol example, reuse elements with viewBox prop'; + render() { + return ( + + + + + + + + + + ); + } +} + +const icon = ( + + + + + + + + + + + + +); + +const samples = [UseExample, UseShapes, DefsExample, SymbolExample]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Stroking.tsx b/FabricExample/src/examples/Stroking.tsx new file mode 100644 index 000000000..53e716511 --- /dev/null +++ b/FabricExample/src/examples/Stroking.tsx @@ -0,0 +1,163 @@ +import React, {Component} from 'react'; +import { + Svg, + Circle, + G, + Text, + Path, + Polyline, + Rect, + Defs, + RadialGradient, + Stop, + ClipPath, +} from 'react-native-svg'; + +class StrokeExample extends Component { + static title = + 'The stroke property defines the color of a line, text or outline of an element'; + render() { + return ( + + + + + + + + ); + } +} + +class StrokeLinecap extends Component { + static title = + 'The strokeLinecap property defines different types of endings to an open path'; + render() { + return ( + + + + + + + + ); + } +} + +class StrokeDasharray extends Component { + static title = 'strokeDasharray'; + render() { + return ( + + + + + + + + ); + } +} + +class StrokeDashoffset extends Component { + static title = + 'the strokeDashoffset attribute specifies the distance into the dash pattern to start the dash.'; + render() { + return ( + + + + STROKE + + + ); + } +} + +class StrokePattern extends Component { + static title = 'Advanced stroke example.'; + render() { + return ( + + + + + + + + + + + + + + ); + } +} + +const icon = ( + + + + + +); + +const samples = [ + StrokeExample, + StrokeLinecap, + StrokeDasharray, + StrokeDashoffset, + StrokePattern, +]; +export {icon, samples}; diff --git a/FabricExample/src/examples/Svg.tsx b/FabricExample/src/examples/Svg.tsx new file mode 100644 index 000000000..4f066f0a7 --- /dev/null +++ b/FabricExample/src/examples/Svg.tsx @@ -0,0 +1,210 @@ +import React, {Component} from 'react'; +import {StyleSheet, View, Image} from 'react-native'; +import {Svg, Circle, G, Path, Line, Rect} from 'react-native-svg'; + +const styles = StyleSheet.create({ + container: { + flex: 1, + height: 100, + width: 200, + }, + svg: { + flex: 1, + alignSelf: 'stretch', + }, +}); + +class SvgExample extends Component { + static title = 'SVG'; + render() { + return ( + + + + + ); + } +} + +class SvgOpacity extends Component { + static title = 'SVG with `opacity` prop'; + render() { + return ( + + + + + ); + } +} + +class SvgViewbox extends Component { + static title = + 'SVG with `viewBox="40 20 100 40" and preserveAspectRatio="none"`'; + render() { + return ( + + + + + + + + ); + } +} + +class SvgLayout extends Component { + static title = 'SVG with flex layout'; + render() { + return ( + + + + + + + + ); + } +} + +class SvgNativeMethods extends Component { + static title = + 'Tap the shapes to render the Image below based on the base64-data of the Svg'; + state = { + base64: null, + }; + alert = () => { + console.log("PRESSED"); + this.root.toDataURL(base64 => { + this.setState({ + base64, + }); + }); + + console.log(this.circle.isPointInFill({x: 200, y: 100})); + console.log(this.circle.isPointInStroke({x: 200, y: 100})); + console.log(this.circle.getTotalLength()); + console.log(this.circle.getPointAtLength(25)); + console.log(this.circle.getBBox({fill: true})); + console.log(this.circle.getCTM()); + console.log(this.circle.getScreenCTM()); + }; + root: any; + circle: any; + + componentDidMount() { + this.alert(); + } + + render() { + return ( + + { + this.root = ele; + }}> + + {this.circle = ele }} /> + + + + + {this.state.base64 && ( + + )} + + + ); + } +} + +const icon = ( + + + + +); + +const samples = [ + SvgExample, + SvgOpacity, + SvgViewbox, + SvgLayout, + SvgNativeMethods, +]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/Text.tsx b/FabricExample/src/examples/Text.tsx new file mode 100644 index 000000000..ed90199e7 --- /dev/null +++ b/FabricExample/src/examples/Text.tsx @@ -0,0 +1,191 @@ +import React, {Component} from 'react'; + +import { + Svg, + G, + Text, + TSpan, + TextPath, + Path, + Defs, + LinearGradient, + Stop, +} from 'react-native-svg'; + +class TextExample extends Component { + static title = 'Text'; + render() { + return ( + + + I love SVG! + + + ); + } +} + +class TextRotate extends Component { + static title = 'Transform the text'; + render() { + return ( + + + I love SVG + + + I love SVG + + + I love SVG + + + ); + } +} + +class TextStroke extends Component { + static title = 'Stroke the text'; + render() { + return ( + + + + + + + + + {['STROKE TEXT']} + + + ); + } +} + +class TextFill extends Component { + static title = 'Fill the text with LinearGradient'; + render() { + return ( + + + + + + + + + + FILL TEXT + + + ); + } +} + +const path = ` +M 10 20 +C 40 10 60 0 80 10 +C 100 20 120 30 140 20 +C 160 10 180 10 180 10 +`; +class TextPathExample extends Component { + static title = 'Draw text along path'; + render() { + return ( + + + + + + + + We go up and down, + + then up again + + + + + + + ); + } +} + +class TSpanExample extends Component { + static title = 'TSpan nest'; + render() { + return ( + + + tspan line 1 + + tspan line 2 + + + tspan line 3 + + + + 12345 + + 6 + 7 + + + 89a + + + + delta on text + + + ); + } +} + +const icon = ( + + + å­— + + +); + +const samples = [ + TextExample, + TextRotate, + TextStroke, + TextFill, + TextPathExample, + TSpanExample, +]; + +export {icon, samples}; diff --git a/FabricExample/src/examples/TouchEvents.tsx b/FabricExample/src/examples/TouchEvents.tsx new file mode 100644 index 000000000..507270f0b --- /dev/null +++ b/FabricExample/src/examples/TouchEvents.tsx @@ -0,0 +1,116 @@ +import React, {Component} from 'react'; + +import { + Svg, + Circle, + G, + Text, + Path, + Rect, + Defs, + ClipPath, +} from 'react-native-svg'; + +class PressExample extends Component { + static title = + 'Press on the red circle or long press on the blue rectangle to trigger the events'; + render() { + return ( + + alert('Press on Circle')} + /> + alert('Long press on Rect')} + /> + + + ); + } +} + +class HoverExample extends Component { + static title = 'Hover the svg path'; + state = { + hover: false, + }; + toggle = () => { + this.setState({hover: !this.state.hover}); + }; + render() { + return ( + + + + + + + + + ); + } +} + +class GroupExample extends Component { + static title = 'Bind touch events callback on Group element with viewBox'; + render() { + return ( + + alert('Pressed on G')} scale="1.4"> + + alert('Pressed on Text')}> + H + + + + + ); + } +} + +const icon = ( + + + + +); + +const samples = [PressExample, HoverExample, GroupExample]; + +export {icon, samples}; diff --git a/FabricExample/yarn.lock b/FabricExample/yarn.lock new file mode 100644 index 000000000..bd0b8ab41 --- /dev/null +++ b/FabricExample/yarn.lock @@ -0,0 +1,6930 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" + integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.0" + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" + integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.7.5": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.8.tgz#3dac27c190ebc3a4381110d46c80e77efe172e1a" + integrity sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.7" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.8" + "@babel/parser" "^7.17.8" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + +"@babel/generator@^7.14.0", "@babel/generator@^7.17.3", "@babel/generator@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" + integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.17.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9" + integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" + integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" + integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.17.8": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.8.tgz#288450be8c6ac7e4e44df37bcc53d345e07bc106" + integrity sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.3" + "@babel/types" "^7.17.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8", "@babel/parser@^7.7.0": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240" + integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ== + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.16.7.tgz#a40ab158ca55627b71c5513f03d3469026a9e929" + integrity sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-default-from" "^7.16.7" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" + integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== + dependencies: + "@babel/compat-data" "^7.17.0" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.16.7.tgz#fa89cf13b60de2c3f79acdc2b52a21174c6de060" + integrity sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.16.7", "@babel/plugin-syntax-flow@^7.2.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz#202b147e5892b8452bbb0bb269c7ed2539ab8832" + integrity sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" + integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" + integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz#291fb140c78dabbf87f2427e7c7c332b126964b8" + integrity sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-flow" "^7.16.7" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz#d86b217c8e45bb5f2dbc11eefc8eab62cf980d19" + integrity sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA== + dependencies: + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-object-assign@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.16.7.tgz#5fe08d63dccfeb6a33aa2638faf98e5c584100f8" + integrity sha512-R8mawvm3x0COTJtveuoqZIjNypn2FjfvXZr4pSQ8VhEFBuQGBz4XhHasZtHXjgXU4XptZ4HtGof3NoYc93ZH9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" + integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" + integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" + integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-jsx" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz#0a2e08b5e2b2d95c4b1d3b3371a2180617455b70" + integrity sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typescript@^7.16.7", "@babel/plugin-transform-typescript@^7.5.0": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0" + integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-typescript" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-flow@^7.13.13": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.16.7.tgz#7fd831323ab25eeba6e4b77a589f680e30581cbd" + integrity sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-flow-strip-types" "^7.16.7" + +"@babel/preset-typescript@^7.13.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz#ab114d68bb2020afc069cd51b37ff98a046a70b9" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" + +"@babel/register@^7.13.16": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.17.7.tgz#5eef3e0f4afc07e25e847720e7b987ae33f08d0b" + integrity sha512-fg56SwvXRifootQEDQAu1mKdjh5uthPzdO0N6t358FktfL4XjAVXuH58ULoiW8mesxiOgNIrxiImqEwv0+hRRA== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" + integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.0.0", "@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4": + version "7.17.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" + integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.3" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.3" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.7.0": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^27.0.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== + dependencies: + "@jest/types" "^27.5.1" + +"@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" + integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" + integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@react-native-community/cli-debugger-ui@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-7.0.3.tgz#3eeeacc5a43513cbcae56e5e965d77726361bcb4" + integrity sha512-G4SA6jFI0j22o+j+kYP8/7sxzbCDqSp2QiHA/X5E0lsGEd2o9qN2zbIjiFr8b8k+VVAYSUONhoC0+uKuINvmkA== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-hermes@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-6.3.0.tgz#92b2f07d08626a60f6893c3e3d57c1538c8fb5a7" + integrity sha512-Uhbm9bubyZLZ12vFCIfWbE/Qi3SBTbYIN/TC08EudTLhv/KbPomCQnmFsnJ7AXQFuOZJs73mBxoEAYSbRbwyVA== + dependencies: + "@react-native-community/cli-platform-android" "^6.3.0" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@^6.3.0": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-6.3.0.tgz#ab7d156bd69a392493323eeaba839a874c0e201f" + integrity sha512-d5ufyYcvrZoHznYm5bjBXaiHIJv552t5gYtQpnUsxBhHSQ8QlaNmlLUyeSPRDfOw4ND9b0tPHqs4ufwx6vp/fQ== + dependencies: + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" + execa "^1.0.0" + fs-extra "^8.1.0" + glob "^7.1.3" + jetifier "^1.6.2" + lodash "^4.17.15" + logkitty "^0.7.1" + slash "^3.0.0" + xmldoc "^1.1.2" + +"@react-native-community/cli-platform-android@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-7.0.1.tgz#d165897edf401f9bceff1f361ef446528133cb52" + integrity sha512-nOr0aMkxAymCnbtsQwXBlyoRN2Y+IzC7Qz5T+/zyWwEbTY8SKQI8uV+8+qttUvzSvuXa2PeXsTWluuliOS8KCw== + dependencies: + "@react-native-community/cli-tools" "^7.0.1" + chalk "^4.1.2" + execa "^1.0.0" + fs-extra "^8.1.0" + glob "^7.1.3" + jetifier "^1.6.2" + lodash "^4.17.15" + logkitty "^0.7.1" + slash "^3.0.0" + xmldoc "^1.1.2" + +"@react-native-community/cli-platform-ios@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-7.0.1.tgz#1c27af85229246b7a528e97f093e38859896cc93" + integrity sha512-PLRIbzrCzSedmpjuFtQqcqUD45G8q7sEciI1lf5zUbVMXqjIBwJWS7iz8235PyWwj8J4MNHohLC+oyRueFtbGg== + dependencies: + "@react-native-community/cli-tools" "^7.0.1" + chalk "^4.1.2" + execa "^1.0.0" + glob "^7.1.3" + js-yaml "^3.13.1" + lodash "^4.17.15" + ora "^5.4.1" + plist "^3.0.2" + xcode "^3.0.0" + +"@react-native-community/cli-plugin-metro@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-7.0.3.tgz#b381ed2f68a0b126e4fa238f1956a44846e1ef8a" + integrity sha512-HJrEkFbxv9DNixsGwO+Q0zCcZMghDltyzeB9yQ//D5ZR4ZUEuAIPrRDdEp9xVw0WkBxAIZs6KXLux2/yPMwLhA== + dependencies: + "@react-native-community/cli-server-api" "^7.0.3" + "@react-native-community/cli-tools" "^6.2.0" + chalk "^4.1.2" + metro "^0.67.0" + metro-config "^0.67.0" + metro-core "^0.67.0" + metro-react-native-babel-transformer "^0.67.0" + metro-resolver "^0.67.0" + metro-runtime "^0.67.0" + readline "^1.3.0" + +"@react-native-community/cli-server-api@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-7.0.3.tgz#ba9695a2fdfef22750d141153efd94baf641129b" + integrity sha512-JDrLsrkBgNxbG2u3fouoVGL9tKrXUrTsaNwr+oCV+3XyMwbVe42r/OaQ681/iW/7mHXjuVkDnMcp7BMg7e2yJg== + dependencies: + "@react-native-community/cli-debugger-ui" "^7.0.3" + "@react-native-community/cli-tools" "^6.2.0" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.0" + nocache "^2.1.0" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + +"@react-native-community/cli-tools@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-6.2.0.tgz#8f4adc2d83ab96e5654348533c8fa602742c4fce" + integrity sha512-08ssz4GMEnRxC/1FgTTN/Ud7mExQi5xMphItPjfHiTxpZPhrFn+IMx6mya0ncFEhhxQ207wYlJMRLPRRdBZ8oA== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + lodash "^4.17.15" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + semver "^6.3.0" + shell-quote "1.6.1" + +"@react-native-community/cli-tools@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-7.0.1.tgz#73790d6ca2825e42a70a770c1b403a6777e690d6" + integrity sha512-0xra4hKNA5PR2zYVXsDMNiXMGaDNoNRYMY6eTP2aVIxQbqIcVMDWSyCA8wMWX5iOpMWg0cZGaQ6a77f3Rlb34g== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + lodash "^4.17.15" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^6.3.0" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-6.0.0.tgz#90269fbdc7229d5e3b8f2f3e029a94083551040d" + integrity sha512-K493Fk2DMJC0ZM8s8gnfseKxGasIhuDaCUDeLZcoCSFlrjKEuEs1BKKEJiev0CARhKEXKOyyp/uqYM9nWhisNw== + dependencies: + ora "^3.4.0" + +"@react-native-community/cli@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-7.0.3.tgz#1addb462d71786fcbbd266fbceb41819b8cf7839" + integrity sha512-WyJOA829KAhU1pw2MDQt0YhOS9kyR2KqyqgJyTuQhzFVCBPX4F5aDEkZYYn4jdldaDHCPrLJ3ho3gxYTXy+x7w== + dependencies: + "@react-native-community/cli-debugger-ui" "^7.0.3" + "@react-native-community/cli-hermes" "^6.3.0" + "@react-native-community/cli-plugin-metro" "^7.0.3" + "@react-native-community/cli-server-api" "^7.0.3" + "@react-native-community/cli-tools" "^6.2.0" + "@react-native-community/cli-types" "^6.0.0" + appdirsjs "^1.2.4" + chalk "^4.1.2" + command-exists "^1.2.8" + commander "^2.19.0" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + envinfo "^7.7.2" + execa "^1.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + glob "^7.1.3" + graceful-fs "^4.1.3" + joi "^17.2.1" + leven "^3.1.0" + lodash "^4.17.15" + minimist "^1.2.0" + node-stream-zip "^1.9.1" + ora "^3.4.0" + pretty-format "^26.6.2" + prompts "^2.4.0" + semver "^6.3.0" + serve-static "^1.13.1" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + +"@react-native-community/eslint-config@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/eslint-config/-/eslint-config-2.0.0.tgz#35dcc529a274803fc4e0a6b3d6c274551fb91774" + integrity sha512-vHaMMfvMp9BWCQQ0lNIXibOJTcXIbYUQ8dSUsMOsrXgVkeVQJj88OwrKS00rQyqwMaC4/a6HuDiFzYUkGKOpVg== + dependencies: + "@react-native-community/eslint-plugin" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^3.1.0" + "@typescript-eslint/parser" "^3.1.0" + babel-eslint "^10.1.0" + eslint-config-prettier "^6.10.1" + eslint-plugin-eslint-comments "^3.1.2" + eslint-plugin-flowtype "2.50.3" + eslint-plugin-jest "22.4.1" + eslint-plugin-prettier "3.1.2" + eslint-plugin-react "^7.20.0" + eslint-plugin-react-hooks "^4.0.4" + eslint-plugin-react-native "^3.8.1" + prettier "^2.0.2" + +"@react-native-community/eslint-plugin@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@react-native-community/eslint-plugin/-/eslint-plugin-1.1.0.tgz#e42b1bef12d2415411519fd528e64b593b1363dc" + integrity sha512-W/J0fNYVO01tioHjvYWQ9m6RgndVtbElzYozBq1ZPrHO/iCzlqoySHl4gO/fpCl9QEFjvJfjPgtPMTMlsoq5DQ== + +"@react-native/assets@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e" + integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== + +"@react-native/normalize-color@*", "@react-native/normalize-color@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-2.0.0.tgz#da955909432474a9a0fe1cbffc66576a0447f567" + integrity sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw== + +"@react-native/polyfills@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" + integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.3": + version "7.0.10" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.10.tgz#9b05b7896166cd00e9cbd59864853abf65d9ac23" + integrity sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A== + +"@types/node@*": + version "17.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" + integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/prettier@^2.0.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" + integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^3.1.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== + dependencies: + "@typescript-eslint/experimental-utils" "3.10.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.1.0": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.10.1" + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/typescript-estree" "3.10.1" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/types@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== + +"@typescript-eslint/typescript-estree@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== + dependencies: + "@typescript-eslint/types" "3.10.1" + "@typescript-eslint/visitor-keys" "3.10.1" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.10.1": + version "3.10.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== + dependencies: + eslint-visitor-keys "^1.1.0" + +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +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.7, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +appdirsjs@^1.2.4: + version "1.2.6" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.6.tgz#fccf9ee543315492867cacfcfd4a2b32257d30ac" + integrity sha512-D8wJNkqMCeQs3kLasatELsddox/Xqkhp+J07iXGyL54fVN7oc+nmNfYzGuCs1IEP6uBw+TfpuO3JKwc+lECy4w== + +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@^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.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@^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-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.1.3, array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +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-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +array.prototype.flatmap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.0" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +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= + +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +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.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + +babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-istanbul@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +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-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-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-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-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +big-integer@1.6.x: + version "1.6.51" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.0.tgz#ba50666370f61bbf94881636cd9f7d23c5286090" + integrity sha512-zgmaRvT6AN1JpPPV+S0a1/FAtoxSreYDccZGIqEMSvZl9DMe70mJ7MFzpxa1X+gHVdkToE2haRUHHMiW1OdejA== + dependencies: + big-integer "1.6.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.17.5, browserslist@^4.19.1: + version "4.20.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" + integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== + dependencies: + caniuse-lite "^1.0.30001317" + electron-to-chromium "^1.4.84" + escalade "^3.1.1" + node-releases "^2.0.2" + picocolors "^1.0.0" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +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" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +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= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001317: + version "1.0.30001320" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz#8397391bec389b8ccce328636499b7284ee13285" + integrity sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +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-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.0.0, cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +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= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +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== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +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= + +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + 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-compat@^3.21.0: + version "3.21.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" + integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +dayjs@^1.8.15: + version "1.11.0" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.0.tgz#009bf7ef2e2ea2d5db2e6583d2d39a4b5061e805" + integrity sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug== + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +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-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +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= + +deprecated-react-native-prop-types@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz#c10c6ee75ff2b6de94bb127f142b814e6e08d9ab" + integrity sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA== + dependencies: + "@react-native/normalize-color" "*" + invariant "*" + prop-types "*" + +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-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +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" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^5.0.1, domhandler@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.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= + +electron-to-chromium@^1.4.84: + version "1.4.92" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.92.tgz#88996e9aceb3a500710fd439abfa89b6cc1ac56c" + integrity sha512-YAVbvQIcDE/IJ/vzDMjD484/hsRbFPW2qXJPaYTfOhtligmfYEYOep+5QojpaEU9kq6bMvNeC2aG7arYvTHYsA== + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4" + integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg== + +envinfo@^7.7.2: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +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" + +error-stack-parser@^2.0.6: + version "2.0.7" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.7.tgz#b0c6e2ce27d0495cf78ad98715e0cad1219abb57" + integrity sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA== + dependencies: + stackframe "^1.1.1" + +errorhandler@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^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= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^6.10.1: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== + dependencies: + get-stdin "^6.0.0" + +eslint-plugin-eslint-comments@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-flowtype@2.50.3: + version "2.50.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" + integrity sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ== + dependencies: + lodash "^4.17.10" + +eslint-plugin-jest@22.4.1: + version "22.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz#a5fd6f7a2a41388d16f527073b778013c5189a9c" + integrity sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg== + +eslint-plugin-prettier@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" + integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.0.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== + +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.8.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz#c73b0886abb397867e5e6689d3a6a418682e6bac" + integrity sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA== + dependencies: + "@babel/traverse" "^7.7.4" + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@^7.20.0: + version "7.29.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2" + integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ== + dependencies: + array-includes "^3.1.4" + array.prototype.flatmap "^1.2.5" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.0" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.6" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1, 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.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +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@^5.0.0, event-target-shim@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + +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" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.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@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.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" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +flow-parser@0.*: + version "0.174.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.174.1.tgz#bb81e17fe45a1e64d9752090e819a6744a539fa0" + integrity sha512-nDMOvlFR+4doLpB3OJpseHZ7uEr3ENptlF6qMas/kzQmNcLzMwfQeFX0gGJ/+em7UdldB/nGsk55tDTOvjbCuw== + +flow-parser@^0.121.0: + version "0.121.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" + integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== + +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= + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +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" + klaw "^1.0.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +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@^2.1.2, fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +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-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +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= + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.13.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" + integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== + dependencies: + type-fest "^0.20.2" + +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, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +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= + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hermes-engine@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.11.0.tgz#bb224730d230a02a5af02c4e090d1f52d57dd3db" + integrity sha512-7aMUlZja2IyLYAcZ69NBnwJAR5ZOYlSllj0oMpx08a8HzxHOys0eKCzfphrf6D0vX1JGO1QQvVsQKe6TkYherw== + +hermes-estree@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.5.0.tgz#36432a2b12f01b217244da098924efdfdfc12327" + integrity sha512-1h8rvG23HhIR5K6Kt0e5C7BC72J1Ath/8MmSta49vxXp/j6wl7IMHvIRFYBQr35tWnQY97dSGR2uoAJ5pHUQkg== + +hermes-parser@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.5.0.tgz#8b678dd8b29a08b57cbaf60adba4896494c59a53" + integrity sha512-ARnJBScKAkkq8j3BHrNGBUv/4cSpZNbKDsVizEtzmsFeqC67Dopa5s4XRe+e3wN52Dh5Mj2kDB5wJvhcxwDkPg== + dependencies: + hermes-estree "0.5.0" + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.0.5: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +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-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.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" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@*, 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" + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +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-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.2.0, is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-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-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +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@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-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-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +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-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +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-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +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== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-instrument@^5.0.4: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-cli@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-haste-map@^27.3.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^26.5.2, jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-worker@^26.0.0, jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" + integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== + dependencies: + "@jest/core" "^26.6.3" + import-local "^3.0.2" + jest-cli "^26.6.3" + +jetifier@^1.6.2: + version "1.6.8" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" + integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== + +joi@^17.2.1: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsc-android@^250230.2.1: + version "250230.2.1" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250230.2.1.tgz#3790313a970586a03ab0ad47defbc84df54f1b83" + integrity sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q== + +jscodeshift@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef" + integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.20.4" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsdom@^16.4.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +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-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-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= + +json5@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== + dependencies: + array-includes "^3.1.3" + object.assign "^4.1.2" + +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.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +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" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.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.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +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" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +metro-babel-transformer@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.67.0.tgz#42fe82af9953e5c62d9a8d7d544eb7be9020dd18" + integrity sha512-SBqc4nq/dgsPNFm+mpWcQQzJaXnh0nrfz2pSnZC4i6zMtIakrTWb8SQ78jOU1FZVEZ3nu9xCYVHS9Tbr/LoEuw== + dependencies: + "@babel/core" "^7.14.0" + hermes-parser "0.5.0" + metro-source-map "0.67.0" + nullthrows "^1.1.1" + +metro-cache-key@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.67.0.tgz#4df6a73cced199e1bddd0f3454bb931a27141eeb" + integrity sha512-FNJe5Rcb2uzY6G6tsqCf0RV4t2rCeX6vSHBxmP7k+4aI4NqX4evtPI0K82r221nBzm5DqNWCURZ0RYUT6jZMGA== + +metro-cache@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.67.0.tgz#928db5742542719677468c4d22ea29b71c7ec8fc" + integrity sha512-IY5dXiR76L75b2ue/mv+9vW8g5hdQJU6YEe81lj6gTSoUrhcONT0rzY+Gh5QOS2Kk6z9utZQMvd9PRKL9/635A== + dependencies: + metro-core "0.67.0" + mkdirp "^0.5.1" + rimraf "^2.5.4" + +metro-config@0.67.0, metro-config@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.67.0.tgz#5507d3b295bd10c87bd13dbe5a3033a357418786" + integrity sha512-ThAwUmzZwTbKyyrIn2bKIcJDPDBS0LKAbqJZQioflvBGfcgA21h3fdL3IxRmvCEl6OnkEWI0Tn1Z9w2GLAjf2g== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^26.5.2" + metro "0.67.0" + metro-cache "0.67.0" + metro-core "0.67.0" + metro-runtime "0.67.0" + +metro-core@0.67.0, metro-core@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.67.0.tgz#75066e11b4df220992abf9cd6200279dd87876c8" + integrity sha512-TOa/ShE1bUq83fGNfV6rFwyfZ288M8ydmWN3g9C2OW8emOHLhJslYD/SIU4DhDkP/99yaJluIALdZ2g0+pCrvQ== + dependencies: + jest-haste-map "^27.3.1" + lodash.throttle "^4.1.1" + metro-resolver "0.67.0" + +metro-hermes-compiler@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.67.0.tgz#9c1340f1882fbf535145868d0d28211ca15b0477" + integrity sha512-X5Pr1jC8/kO6d1EBDJ6yhtuc5euHX89UDNv8qdPJHAET03xfFnlojRPwOw6il2udAH20WLBv+F5M9VY+58zspQ== + +metro-inspector-proxy@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.67.0.tgz#22b360a837b07e9e2bc87a71af6154dd8fcc02a5" + integrity sha512-5Ubjk94qpNaU3OT2IZa4/dec09bauic1hzWms4czorBzDenkp4kYXG9/aWTmgQLtCk92H3Q8jKl1PQRxUSkrOQ== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + ws "^7.5.1" + yargs "^15.3.1" + +metro-minify-uglify@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.67.0.tgz#28a77dbd78d9e558dba8c2f31c2b9c6f939df966" + integrity sha512-4CmM5b3MTAmQ/yFEfsHOhD2SuBObB2YF6PKzXZc4agUsQVVtkrrNElaiWa8w26vrTzA9emwcyurxMf4Nl3lYPQ== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.67.0, metro-react-native-babel-preset@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.67.0.tgz#53aec093f53a09b56236a9bb534d76658efcbec7" + integrity sha512-tgTG4j0SKwLHbLRELMmgkgkjV1biYkWlGGKOmM484/fJC6bpDikdaFhfjsyE+W+qt7I5szbCPCickMTNQ+zwig== + dependencies: + "@babel/core" "^7.14.0" + "@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-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^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-self" "^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.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + +metro-react-native-babel-transformer@0.67.0, metro-react-native-babel-transformer@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.67.0.tgz#756d32eb3c05cab3d72fcb1700f8fd09322bb07f" + integrity sha512-P0JT09n7T01epUtgL9mH6BPat3xn4JjBakl4lWHdL61cvEGcrxuIom1eoFFKkgU/K5AVLU4aCAttHS7nSFCcEQ== + dependencies: + "@babel/core" "^7.14.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.5.0" + metro-babel-transformer "0.67.0" + metro-react-native-babel-preset "0.67.0" + metro-source-map "0.67.0" + nullthrows "^1.1.1" + +metro-resolver@0.67.0, metro-resolver@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.67.0.tgz#8143c716f77e468d1d42eca805243706eb349959" + integrity sha512-d2KS/zAyOA/z/q4/ff41rAp+1txF4H6qItwpsls/RHStV2j6PqgRHUzq/3ga+VIeoUJntYJ8nGW3+3qSrhFlig== + dependencies: + absolute-path "^0.0.0" + +metro-runtime@0.67.0, metro-runtime@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.67.0.tgz#a8888dfd06bcebbac3c99dcac7cd622510dd8ee0" + integrity sha512-IFtSL0JUt1xK3t9IoLflTDft82bjieSzdIJWLzrRzBMlesz8ox5bVmnpQbVQEwfYUpEOxbM3VOZauVbdCmXA7g== + +metro-source-map@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.67.0.tgz#e28db7253b9ca688e60d5710ebdccba60b45b2df" + integrity sha512-yxypInsRo3SfS00IgTuL6a2W2tfwLY//vA2E+GeqGBF5zTbJZAhwNGIEl8S87XXZhwzJcxf5/8LjJC1YDzabww== + dependencies: + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + invariant "^2.2.4" + metro-symbolicate "0.67.0" + nullthrows "^1.1.1" + ob1 "0.67.0" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.67.0.tgz#16729d05663d28176895244b3d932a898fca2b45" + integrity sha512-ZqVVcfa0xSz40eFzA5P8pCF3V6Tna9RU1prFzAJTa3j9dCGqwh0HTXC8AIkMtgX7hNdZrCJI1YipzUBlwkT0/A== + dependencies: + invariant "^2.2.4" + metro-source-map "0.67.0" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.67.0.tgz#6122aa4e5e5f9a767cebcc5af6fd1695666683ce" + integrity sha512-DQFoSDIJdTMPDTUlKaCNJjEXiHGwFNneAF9wDSJ3luO5gigM7t7MuSaPzF4hpjmfmcfPnRhP6AEn9jcza2Sh8Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.14.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.67.0.tgz#5689553c25b0657aadefdf4ea2cd8dd06e18882a" + integrity sha512-29n+JdTb80ROiv/wDiBVlY/xRAF/nrjhp/Udv/XJl1DZb+x7JEiPxpbpthPhwwl+AYxVrostGB0W06WJ61hfiw== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + metro "0.67.0" + metro-babel-transformer "0.67.0" + metro-cache "0.67.0" + metro-cache-key "0.67.0" + metro-hermes-compiler "0.67.0" + metro-source-map "0.67.0" + metro-transform-plugins "0.67.0" + nullthrows "^1.1.1" + +metro@0.67.0, metro@^0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.67.0.tgz#8007a041d22de1cdb05184431c67eb7989eef6e0" + integrity sha512-DwuBGAFcAivoac/swz8Lp7Y5Bcge1tzT7T6K0nf1ubqJP8YzBUtyR4pkjEYVUzVu/NZf7O54kHSPVu1ibYzOBQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + accepts "^1.3.7" + async "^2.4.0" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + hermes-parser "0.5.0" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "^27.3.1" + jest-worker "^26.0.0" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.67.0" + metro-cache "0.67.0" + metro-cache-key "0.67.0" + metro-config "0.67.0" + metro-core "0.67.0" + metro-hermes-compiler "0.67.0" + metro-inspector-proxy "0.67.0" + metro-minify-uglify "0.67.0" + metro-react-native-babel-preset "0.67.0" + metro-resolver "0.67.0" + metro-runtime "0.67.0" + metro-source-map "0.67.0" + metro-symbolicate "0.67.0" + metro-transform-plugins "0.67.0" + metro-transform-worker "0.67.0" + mime-types "^2.1.27" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + temp "0.8.3" + throat "^5.0.0" + ws "^7.5.1" + yargs "^15.3.1" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +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== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +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= + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +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== + +nocache@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" + integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.2.0, node-fetch@^2.6.0: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +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-notifier@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" + integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +node-releases@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" + integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== + +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +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" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +ob1@0.67.0: + version "0.67.0" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.67.0.tgz#91f104c90641b1af8c364fc82a4b2c7d0801072d" + integrity sha512-YvZtX8HKYackQ5PwdFIuuNFVsMChRPHvnARRRT0Vk59xsBvL5t9U1Ock3M1sYrKj+Gp73+0q9xcHLAxI+xLi5g== + +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" + kind-of "^3.0.3" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.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.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +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" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^6.2.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-each-series@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" + integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== + +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-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-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" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.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-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1, pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +plist@^3.0.2, plist@^3.0.4: + version "3.0.5" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" + integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^9.0.7" + +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.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.0.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4" + integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A== + +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" + integrity sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@*, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +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" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +react-devtools-core@^4.23.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.2.tgz#ce10e3ea502559ce4299c13837d2374cf0d435a7" + integrity sha512-UC3rvQCG/dnC95NPNWBFrUEtdAEiFZ9xZe1tTHFOELVR5qfNLroZ3w9tC51NQvvK5E10G2ko3lQ5Vrh3p0bHrA== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +"react-is@^16.12.0 || ^17.0.0", react-is@^17.0.1, react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-native-codegen@^0.0.13: + version "0.0.13" + resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.13.tgz#4cc94546fc75a5dbe9350d59c10108f2efe6bc17" + integrity sha512-rCh1P+s0Q4N6vNgS97ckafbhJRztz22+0l0VZoyQC06F07J98kI5cUByH0ATypPRIdpkMbAZc59DoPdDFc01bg== + dependencies: + "@babel/parser" "^7.14.0" + flow-parser "^0.121.0" + jscodeshift "^0.13.1" + nullthrows "^1.1.1" + +react-native-gradle-plugin@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.6.tgz#b61a9234ad2f61430937911003cddd7e15c72b45" + integrity sha512-eIlgtsmDp1jLC24dRn43hB3kEcZVqx6DUQbR0N1ABXGnMEafm9I3V3dUUeD1vh+Dy5WqijSoEwLNUPLgu5zDMg== + +"react-native-svg@link:..": + version "0.0.0" + uid "" + +react-native@^0.68.1: + version "0.68.1" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.68.1.tgz#c3d92f89028cdc2453fe7cd2d532b3f68d1c27c8" + integrity sha512-5gfvslo5NO2Ece2k/q41eVOK3ca4u1QAOf+qM+auvOiUA4/QR5Yr0WfSGbRpUr2GaFgv7qP11F4+elCravg7uQ== + dependencies: + "@jest/create-cache-key-function" "^27.0.1" + "@react-native-community/cli" "^7.0.3" + "@react-native-community/cli-platform-android" "^7.0.1" + "@react-native-community/cli-platform-ios" "^7.0.1" + "@react-native/assets" "1.0.0" + "@react-native/normalize-color" "2.0.0" + "@react-native/polyfills" "2.0.0" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + deprecated-react-native-prop-types "^2.3.0" + event-target-shim "^5.0.1" + hermes-engine "~0.11.0" + invariant "^2.2.4" + jsc-android "^250230.2.1" + metro-react-native-babel-transformer "0.67.0" + metro-runtime "0.67.0" + metro-source-map "0.67.0" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.0.3" + react-devtools-core "^4.23.0" + react-native-codegen "^0.0.13" + react-native-gradle-plugin "^0.0.6" + react-refresh "^0.4.0" + react-shallow-renderer "16.14.1" + regenerator-runtime "^0.13.2" + scheduler "^0.20.2" + stacktrace-parser "^0.1.3" + use-subscription ">=1.0.0 <1.6.0" + whatwg-fetch "^3.0.0" + ws "^6.1.4" + +react-refresh@^0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== + +react-shallow-renderer@16.14.1, react-shallow-renderer@^16.13.1: + version "16.14.1" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz#bf0d02df8a519a558fd9b8215442efa5c840e124" + integrity sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0" + +react-test-renderer@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-17.0.2.tgz#4cd4ae5ef1ad5670fc0ef776e8cc7e1231d9866c" + integrity sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ== + dependencies: + object-assign "^4.1.1" + react-is "^17.0.2" + react-shallow-renderer "^16.13.1" + scheduler "^0.20.2" + +react@17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw= + +recast@^0.20.4: + version "0.20.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +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" + +regexp.prototype.flags@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" + integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== + +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== + 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.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +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= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +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-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-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.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.18.1: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +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" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +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-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-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": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.2: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +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.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +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" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shell-quote@^1.6.1, shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +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== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-plist@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.0.tgz#f451997663eafd8ea6bad353a01caf49ef186d43" + integrity sha512-uYWpeGFtZtVt2NhG4AHgpwx323zxD85x42heMJBan1qAiqqozIlaGrwrEt6kRjXWRWIXsuV1VLCvVmZan2B5dg== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.0" + plist "^3.0.4" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16, source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + +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= + +stack-utils@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.1.tgz#1033a3473ee67f08e2f2fc8eba6aef4f845124e1" + integrity sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg== + +stacktrace-parser@^0.1.3: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +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" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6: + version "4.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" + integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~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@^5.0.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-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-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +table@^6.0.9: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +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" + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tsutils@^3.17.1: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +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" + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +universalify@^0.1.0, universalify@^0.1.2: + 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" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + 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-subscription@>=1.0.0 <1.6.0": + version "1.5.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +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@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + +uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +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" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +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.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.1.4: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.4.6, ws@^7.5.1: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +xcode@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-3.0.1.tgz#3efb62aac641ab2c702458f9a0302696146aa53c" + integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== + dependencies: + simple-plist "^1.1.0" + uuid "^7.0.3" + +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== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmldoc@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.1.2.tgz#6666e029fe25470d599cd30e23ff0d1ed50466d7" + integrity sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ== + dependencies: + sax "^1.2.1" + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^15.1.0, yargs@^15.3.1, yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" diff --git a/RNSVG.podspec b/RNSVG.podspec index 796fa502e..8d438d6a8 100644 --- a/RNSVG.podspec +++ b/RNSVG.podspec @@ -2,6 +2,8 @@ require 'json' package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) +fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] + Pod::Spec.new do |s| s.name = 'RNSVG' s.version = package['version'] @@ -11,10 +13,45 @@ Pod::Spec.new do |s| s.authors = 'Horcrux Chen' s.platforms = { :osx => "10.14", :ios => "9.0", :tvos => "9.2" } s.source = { :git => 'https://github.com/react-native-community/react-native-svg.git', :tag => "v#{s.version}" } - s.source_files = 'apple/**/*.{h,m}' - s.ios.exclude_files = '**/*.macos.{h,m}' - s.tvos.exclude_files = '**/*.macos.{h,m}' - s.osx.exclude_files = '**/*.ios.{h,m}' - s.requires_arc = true - s.dependency 'React-Core' + + if fabric_enabled + # folly_version must match the version used in React Native + # See folly_version in react-native/React/FBReactNativeSpec/FBReactNativeSpec.podspec + folly_version = '2021.06.28.00-v2' + folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' + + s.pod_target_xcconfig = { + 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"', + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + } + s.platforms = { ios: '11.0', tvos: '11.0' } + s.compiler_flags = folly_compiler_flags + ' -DRN_FABRIC_ENABLED' + s.source_files = 'apple/**/*.{h,m,mm,cpp}' + s.ios.exclude_files = '**/*.macos.{h,m,mm,cpp}' + s.tvos.exclude_files = '**/*.macos.{h,m,mm,cpp}' + s.osx.exclude_files = '**/*.ios.{h,m,mm,cpp}' + s.requires_arc = true + + s.dependency "React" + s.dependency "React-RCTFabric" + s.dependency "React-Codegen" + s.dependency "RCT-Folly", folly_version + s.dependency "RCTRequired" + s.dependency "RCTTypeSafety" + s.dependency "ReactCommon/turbomodule/core" + + s.subspec "common" do |ss| + ss.source_files = "common/cpp/**/*.{cpp,h}" + ss.header_dir = "rnsvg" + ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\"" } + end + else + s.source_files = 'apple/**/*.{h,m,mm}' + s.exclude_files = 'apple/Utils/RNSVGFabricConversions.h' + s.ios.exclude_files = '**/*.macos.{h,m,mm}' + s.tvos.exclude_files = '**/*.macos.{h,m,mm}' + s.osx.exclude_files = '**/*.ios.{h,m,mm}' + s.requires_arc = true + s.dependency 'React-Core' + end end diff --git a/__tests__/__snapshots__/css.test.tsx.snap b/__tests__/__snapshots__/css.test.tsx.snap index dbd433ee5..0cb174ec9 100644 --- a/__tests__/__snapshots__/css.test.tsx.snap +++ b/__tests__/__snapshots__/css.test.tsx.snap @@ -155,8 +155,13 @@ exports[`supports CSS in style element 1`] = ` diff --git a/apple/Brushes/RNSVGBrush.m b/apple/Brushes/RNSVGBrush.mm similarity index 100% rename from apple/Brushes/RNSVGBrush.m rename to apple/Brushes/RNSVGBrush.mm diff --git a/apple/Brushes/RNSVGContextBrush.m b/apple/Brushes/RNSVGContextBrush.mm similarity index 100% rename from apple/Brushes/RNSVGContextBrush.m rename to apple/Brushes/RNSVGContextBrush.mm diff --git a/apple/Brushes/RNSVGPainter.m b/apple/Brushes/RNSVGPainter.mm similarity index 99% rename from apple/Brushes/RNSVGPainter.m rename to apple/Brushes/RNSVGPainter.mm index 77fd02a69..48539b7ea 100644 --- a/apple/Brushes/RNSVGPainter.m +++ b/apple/Brushes/RNSVGPainter.mm @@ -163,7 +163,7 @@ - (void)paintPattern:(CGContextRef)context bounds:(CGRect)bounds // This is needed because macOS and iOS have different conventions for where the origin is. // For macOS, it's in the bottom-left corner. For iOS, it's in the top-left corner. viewbox = CGAffineTransformScale(viewbox, 1, -1); -#endif +#endif // TARGET_OS_OSX CGRect newBounds = CGRectMake(x, y, w, h); CGSize size = newBounds.size; self.useObjectBoundingBoxForContentUnits = _useContentObjectBoundingBox; diff --git a/apple/Brushes/RNSVGPainterBrush.m b/apple/Brushes/RNSVGPainterBrush.mm similarity index 100% rename from apple/Brushes/RNSVGPainterBrush.m rename to apple/Brushes/RNSVGPainterBrush.mm diff --git a/apple/Brushes/RNSVGSolidColorBrush.h b/apple/Brushes/RNSVGSolidColorBrush.h index 6e12929c0..a6cccd0b1 100644 --- a/apple/Brushes/RNSVGSolidColorBrush.h +++ b/apple/Brushes/RNSVGSolidColorBrush.h @@ -11,5 +11,6 @@ @interface RNSVGSolidColorBrush : RNSVGBrush - (instancetype)initWithNumber:(NSNumber *)number; +- (instancetype)initWithColor:(RNSVGColor *)color; @end diff --git a/apple/Brushes/RNSVGSolidColorBrush.m b/apple/Brushes/RNSVGSolidColorBrush.mm similarity index 91% rename from apple/Brushes/RNSVGSolidColorBrush.m rename to apple/Brushes/RNSVGSolidColorBrush.mm index 88f1cf4cc..f2dc6d05e 100644 --- a/apple/Brushes/RNSVGSolidColorBrush.m +++ b/apple/Brushes/RNSVGSolidColorBrush.mm @@ -33,6 +33,15 @@ - (instancetype)initWithNumber:(NSNumber *)number return self; } +- (instancetype)initWithColor:(RNSVGColor *)color +{ + if ((self = [super init])) { + _color = color; + } + return self; +} + + - (void)dealloc { _color = nil; diff --git a/apple/Elements/RNSVGClipPath.m b/apple/Elements/RNSVGClipPath.m deleted file mode 100644 index 8def3785a..000000000 --- a/apple/Elements/RNSVGClipPath.m +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RNSVGClipPath.h" - -@implementation RNSVGClipPath - -- (void)parseReference -{ - self.dirty = false; - [self.svgView defineClipPath:self clipPathName:self.name]; -} - - -- (BOOL)isSimpleClipPath -{ - NSArray *children = self.subviews; - if (children.count == 1) { - RNSVGView* child = children[0]; - if ([child class] != [RNSVGGroup class]) { - return true; - } - } - return false; -} - -@end diff --git a/apple/Elements/RNSVGClipPath.mm b/apple/Elements/RNSVGClipPath.mm new file mode 100644 index 000000000..28fd70181 --- /dev/null +++ b/apple/Elements/RNSVGClipPath.mm @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNSVGClipPath.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGClipPath + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + setCommonNodeProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; +} +#endif // RN_FABRIC_ENABLED + +- (void)parseReference +{ + self.dirty = false; + [self.svgView defineClipPath:self clipPathName:self.name]; +} + + +- (BOOL)isSimpleClipPath +{ + NSArray *children = self.subviews; + if (children.count == 1) { + RNSVGView* child = children[0]; + if ([child class] != [RNSVGGroup class]) { + return true; + } + } + return false; +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGClipPathCls(void) +{ + return RNSVGClipPath.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGDefs.m b/apple/Elements/RNSVGDefs.m deleted file mode 100644 index 22fe9871d..000000000 --- a/apple/Elements/RNSVGDefs.m +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ -#import "RNSVGDefs.h" - -@class RNSVGNode; - -@implementation RNSVGDefs - -- (void)renderTo:(CGContextRef)context -{ - // Defs do not render -} - -- (void)parseReference -{ - self.dirty = false; - [self traverseSubviews:^(RNSVGNode *node) { - if ([node isKindOfClass:[RNSVGNode class]]) { - [node parseReference]; - } - return YES; - }]; -} - -- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event -{ - return nil; -} - -@end - diff --git a/apple/Elements/RNSVGDefs.mm b/apple/Elements/RNSVGDefs.mm new file mode 100644 index 000000000..35a3d91da --- /dev/null +++ b/apple/Elements/RNSVGDefs.mm @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ +#import "RNSVGDefs.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGDefs + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} +#endif // RN_FABRIC_ENABLED + +- (void)renderTo:(CGContextRef)context +{ + // Defs do not render +} + +- (void)parseReference +{ + self.dirty = false; + [self traverseSubviews:^(RNSVGNode *node) { + if ([node isKindOfClass:[RNSVGNode class]]) { + [node parseReference]; + } + return YES; + }]; +} + +- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event +{ + return nil; +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGDefsCls(void) +{ + return RNSVGDefs.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGForeignObject.m b/apple/Elements/RNSVGForeignObject.mm similarity index 66% rename from apple/Elements/RNSVGForeignObject.m rename to apple/Elements/RNSVGForeignObject.mm index a3f8fde61..2b74454ee 100644 --- a/apple/Elements/RNSVGForeignObject.m +++ b/apple/Elements/RNSVGForeignObject.mm @@ -10,8 +10,66 @@ #import "RNSVGMask.h" #import "RNSVGNode.h" +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGForeignObject +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x = RCTNSStringFromStringNilIfEmpty(newProps.x) ? [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x)] : nil; + self.y = RCTNSStringFromStringNilIfEmpty(newProps.y) ? [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y)] : nil; + if (RCTNSStringFromStringNilIfEmpty(newProps.foreignObjectheight)) { + self.foreignObjectheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.foreignObjectheight)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.foreignObjectwidth)) { + self.foreignObjectwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.foreignObjectwidth)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.height)) { + self.foreignObjectheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.height)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.width)) { + self.foreignObjectwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.width)]; + } + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x = nil; + _y = nil; + _foreignObjectheight = nil; + _foreignObjectwidth = nil; +} +#endif // RN_FABRIC_ENABLED - (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { return nil; @@ -158,3 +216,9 @@ - (void)setForeignObjectheight:(RNSVGLength *)foreignObjectheight @end +#ifdef RN_FABRIC_ENABLED +Class RNSVGForeignObjectCls(void) +{ + return RNSVGForeignObject.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGGroup.m b/apple/Elements/RNSVGGroup.mm similarity index 85% rename from apple/Elements/RNSVGGroup.m rename to apple/Elements/RNSVGGroup.mm index 0322c7c70..90a61b9bb 100644 --- a/apple/Elements/RNSVGGroup.m +++ b/apple/Elements/RNSVGGroup.mm @@ -10,11 +10,54 @@ #import "RNSVGClipPath.h" #import "RNSVGMask.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGGroup { RNSVGGlyphContext *_glyphContext; } +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _font = nil; + _glyphContext = nil; +} +#endif // RN_FABRIC_ENABLED + - (void)setFont:(NSDictionary*)font { if (font == _font) { @@ -124,7 +167,7 @@ - (RNSVGGlyphContext *)getGlyphContext - (void)pushGlyphContext { - __weak typeof(self) weakSelf = self; + __typeof__(self) __weak weakSelf = self; [[self.textRoot getGlyphContext] pushContext:weakSelf font:self.font]; } @@ -155,7 +198,7 @@ - (CGPathRef)getPath:(CGContextRef)context return YES; }]; - cached = CGPathRetain(CFAutorelease(path)); + cached = CGPathRetain((CGPathRef)CFAutorelease(path)); self.path = cached; return cached; } @@ -227,7 +270,7 @@ - (void)parseReference { self.dirty = false; if (self.name) { - typeof(self) __weak weakSelf = self; + __typeof__(self) __weak weakSelf = self; [self.svgView defineTemplate:weakSelf templateName:self.name]; } @@ -250,3 +293,10 @@ - (void)resetProperties } @end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGGroupCls(void) +{ + return RNSVGGroup.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGImage.h b/apple/Elements/RNSVGImage.h index dc7e78d00..0383d5d74 100644 --- a/apple/Elements/RNSVGImage.h +++ b/apple/Elements/RNSVGImage.h @@ -13,6 +13,8 @@ #import "RNSVGVBMOS.h" #import "RNSVGLength.h" +#import + @interface RNSVGImage : RNSVGRenderable @property (nonatomic, weak) RCTBridge *bridge; @@ -24,4 +26,6 @@ @property (nonatomic, strong) NSString *align; @property (nonatomic, assign) RNSVGVBMOS meetOrSlice; +- (void)setImageSrc:(RCTImageSource *)source request:(NSURLRequest *)request; + @end diff --git a/apple/Elements/RNSVGImage.m b/apple/Elements/RNSVGImage.mm similarity index 52% rename from apple/Elements/RNSVGImage.m rename to apple/Elements/RNSVGImage.mm index 79691149a..7445b839f 100644 --- a/apple/Elements/RNSVGImage.m +++ b/apple/Elements/RNSVGImage.mm @@ -8,7 +8,6 @@ #import "RNSVGImage.h" #import "RCTConvert+RNSVG.h" -#import #if __has_include() @@ -21,10 +20,28 @@ #import #import -#endif +#endif // RN_FABRIC_ENABLED #import #import "RNSVGViewBox.h" +#import "RCTBridge.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#import "RCTImagePrimitivesConversions.h" +#import "RCTImageSource.h" + +// Some RN private method hacking below similar to how it is done in RNScreens: +// https://github.com/software-mansion/react-native-screens/blob/90e548739f35b5ded2524a9d6410033fc233f586/ios/RNSScreenStackHeaderConfig.mm#L30 +@interface RCTBridge (Private) ++ (RCTBridge *)currentBridge; +@end + +#endif // RN_FABRIC_ENABLED @implementation RNSVGImage { @@ -32,6 +49,78 @@ @implementation RNSVGImage CGSize _imageSize; RCTImageLoaderCancellationBlock _reloadImageCancellationBlock; } +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + const auto &oldImageProps = *std::static_pointer_cast(oldProps); + + self.x = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x)]; + self.y = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y)]; + if (RCTNSStringFromStringNilIfEmpty(newProps.imageheight)) { + self.imageheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.imageheight)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.imagewidth)) { + self.imagewidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.imagewidth)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.height)) { + self.imageheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.height)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.width)) { + self.imagewidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.width)]; + } + + if (oldProps == nullptr || oldImageProps.src != newProps.src) { + // TODO: make it the same as in e.g. slider + NSURLRequest *request = NSURLRequestFromImageSource(newProps.src); + CGSize size = RCTCGSizeFromSize(newProps.src.size); + CGFloat scale = newProps.src.scale; + RCTImageSource *imageSource = [[RCTImageSource alloc] initWithURLRequest:request size:size scale:scale]; + [self setImageSrc:imageSource request:request]; + } + self.align = RCTNSStringFromStringNilIfEmpty(newProps.align); + self.meetOrSlice = intToRNSVGVBMOS(newProps.meetOrSlice); + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x = nil; + _y = nil; + _imageheight = nil; + _imagewidth = nil; + _src = nil; + _align = nil; + _meetOrSlice = kRNSVGVBMOSMeet; + + if (_image) { + CGImageRelease(_image); + } + _image = nil; + _imageSize = CGSizeZero; + _reloadImageCancellationBlock = nil; +} +#endif // RN_FABRIC_ENABLED - (void)setSrc:(id)src { @@ -63,6 +152,37 @@ - (void)setSrc:(id)src }]; } +- (void)setImageSrc:(RCTImageSource *)source request:(NSURLRequest *)request +{ + CGImageRelease(_image); + _image = nil; + if (source.size.width != 0 && source.size.height != 0) { + _imageSize = source.size; + } else { + _imageSize = CGSizeMake(0, 0); + } + + RCTImageLoaderCancellationBlock previousCancellationBlock = _reloadImageCancellationBlock; + if (previousCancellationBlock) { + previousCancellationBlock(); + _reloadImageCancellationBlock = nil; + } + + _reloadImageCancellationBlock = [[ +#ifdef RN_FABRIC_ENABLED + [RCTBridge currentBridge] +#else + self.bridge +#endif // RN_FABRIC_ENABLED + moduleForName:@"ImageLoader"] loadImageWithURLRequest:request callback:^(NSError *error, UIImage *image) { + dispatch_async(dispatch_get_main_queue(), ^{ + self->_image = CGImageRetain(image.CGImage); + self->_imageSize = CGSizeMake(CGImageGetWidth(self->_image), CGImageGetHeight(self->_image)); + [self invalidate]; + }); + }]; +} + - (void)setX:(RNSVGLength *)x { if ([x isEqualTo:_x]) { @@ -192,3 +312,10 @@ - (CGPathRef)getPath:(CGContextRef)context } @end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGImageCls(void) +{ + return RNSVGImage.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGLinearGradient.m b/apple/Elements/RNSVGLinearGradient.m deleted file mode 100644 index fde9f0a76..000000000 --- a/apple/Elements/RNSVGLinearGradient.m +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ -#import "RNSVGLinearGradient.h" -#import "RNSVGPainter.h" -#import "RNSVGBrushType.h" - -@implementation RNSVGLinearGradient - -- (instancetype)init -{ - if (self = [super init]) { - _gradientTransform = CGAffineTransformIdentity; - } - return self; -} - -- (void)setX1:(RNSVGLength *)x1 -{ - if ([x1 isEqualTo:_x1]) { - return; - } - - _x1 = x1; - [self invalidate]; -} - -- (void)setY1:(RNSVGLength *)y1 -{ - if ([y1 isEqualTo:_y1]) { - return; - } - - _y1 = y1; - [self invalidate]; -} - -- (void)setX2:(RNSVGLength *)x2 -{ - if ([x2 isEqualTo:_x2]) { - return; - } - - _x2 = x2; - [self invalidate]; -} - -- (void)setY2:(RNSVGLength *)y2 -{ - if ([y2 isEqualTo:_y2]) { - return; - } - - _y2 = y2; - [self invalidate]; -} - -- (void)setGradient:(NSArray *)gradient -{ - if (gradient == _gradient) { - return; - } - - _gradient = gradient; - [self invalidate]; -} - -- (void)setGradientUnits:(RNSVGUnits)gradientUnits -{ - if (gradientUnits == _gradientUnits) { - return; - } - - _gradientUnits = gradientUnits; - [self invalidate]; -} - -- (void)setGradientTransform:(CGAffineTransform)gradientTransform -{ - _gradientTransform = gradientTransform; - [self invalidate]; -} - -- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event -{ - return nil; -} - -- (void)parseReference -{ - self.dirty = false; - NSArray *points = @[self.x1, self.y1, self.x2, self.y2]; - RNSVGPainter *painter = [[RNSVGPainter alloc] initWithPointsArray:points]; - [painter setUnits:self.gradientUnits]; - [painter setTransform:self.gradientTransform]; - [painter setLinearGradientColors:self.gradient]; - - if (self.gradientUnits == kRNSVGUnitsUserSpaceOnUse) { - [painter setUserSpaceBoundingBox:[self.svgView getContextBounds]]; - } - - [self.svgView definePainter:painter painterName:self.name]; -} -@end - diff --git a/apple/Elements/RNSVGLinearGradient.mm b/apple/Elements/RNSVGLinearGradient.mm new file mode 100644 index 000000000..52834d8e7 --- /dev/null +++ b/apple/Elements/RNSVGLinearGradient.mm @@ -0,0 +1,178 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ +#import "RNSVGLinearGradient.h" +#import "RNSVGPainter.h" +#import "RNSVGBrushType.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGLinearGradient + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x1 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x1)]; + self.y1 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y1)]; + self.x2 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x2)]; + self.y2 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y2)]; + if (newProps.gradient.size() > 0) { + NSMutableArray *gradientArray = [NSMutableArray new]; + for (auto number : newProps.gradient) { + [gradientArray addObject:[NSNumber numberWithDouble:number]]; + } + self.gradient = gradientArray; + } + self.gradientUnits = newProps.gradientUnits == 0 ? kRNSVGUnitsObjectBoundingBox : kRNSVGUnitsUserSpaceOnUse; + if (newProps.gradientTransform.size() == 6) { + self.gradientTransform = CGAffineTransformMake(newProps.gradientTransform.at(0), newProps.gradientTransform.at(1), newProps.gradientTransform.at(2), newProps.gradientTransform.at(3), newProps.gradientTransform.at(4), newProps.gradientTransform.at(5)); + } + + setCommonNodeProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x1 = nil; + _y1 = nil; + _x2 = nil; + _y2 = nil; + _gradient = nil; + _gradientUnits = kRNSVGUnitsObjectBoundingBox; + _gradientTransform = CGAffineTransformIdentity; +} +#endif // RN_FABRIC_ENABLED + +- (instancetype)init +{ + if (self = [super init]) { + _gradientTransform = CGAffineTransformIdentity; + } + return self; +} + +- (void)setX1:(RNSVGLength *)x1 +{ + if ([x1 isEqualTo:_x1]) { + return; + } + + _x1 = x1; + [self invalidate]; +} + +- (void)setY1:(RNSVGLength *)y1 +{ + if ([y1 isEqualTo:_y1]) { + return; + } + + _y1 = y1; + [self invalidate]; +} + +- (void)setX2:(RNSVGLength *)x2 +{ + if ([x2 isEqualTo:_x2]) { + return; + } + + _x2 = x2; + [self invalidate]; +} + +- (void)setY2:(RNSVGLength *)y2 +{ + if ([y2 isEqualTo:_y2]) { + return; + } + + _y2 = y2; + [self invalidate]; +} + +- (void)setGradient:(NSArray *)gradient +{ + if (gradient == _gradient) { + return; + } + + _gradient = gradient; + [self invalidate]; +} + +- (void)setGradientUnits:(RNSVGUnits)gradientUnits +{ + if (gradientUnits == _gradientUnits) { + return; + } + + _gradientUnits = gradientUnits; + [self invalidate]; +} + +- (void)setGradientTransform:(CGAffineTransform)gradientTransform +{ + _gradientTransform = gradientTransform; + [self invalidate]; +} + +- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event +{ + return nil; +} + +- (void)parseReference +{ + self.dirty = false; + NSArray *points = @[self.x1, self.y1, self.x2, self.y2]; + RNSVGPainter *painter = [[RNSVGPainter alloc] initWithPointsArray:points]; + [painter setUnits:self.gradientUnits]; + [painter setTransform:self.gradientTransform]; + [painter setLinearGradientColors:self.gradient]; + + if (self.gradientUnits == kRNSVGUnitsUserSpaceOnUse) { + [painter setUserSpaceBoundingBox:[self.svgView getContextBounds]]; + } + + [self.svgView definePainter:painter painterName:self.name]; +} +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGLinearGradientCls(void) +{ + return RNSVGLinearGradient.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGMarker.m b/apple/Elements/RNSVGMarker.mm similarity index 66% rename from apple/Elements/RNSVGMarker.m rename to apple/Elements/RNSVGMarker.mm index 8065e3946..1ae04ed87 100644 --- a/apple/Elements/RNSVGMarker.m +++ b/apple/Elements/RNSVGMarker.mm @@ -11,8 +11,75 @@ #import "RNSVGNode.h" #import "RNSVGViewBox.h" +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGMarker +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.refX = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.refX)]; + self.refY = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.refY)]; + self.markerHeight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.markerHeight)]; + self.markerWidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.markerWidth)]; + self.markerUnits = RCTNSStringFromStringNilIfEmpty(newProps.markerUnits); + self.orient = RCTNSStringFromStringNilIfEmpty(newProps.orient); + + self.minX = newProps.minX; + self.minY = newProps.minY; + self.vbWidth = newProps.vbWidth; + self.vbHeight = newProps.vbHeight; + self.align = RCTNSStringFromStringNilIfEmpty(newProps.align); + self.meetOrSlice = intToRNSVGVBMOS(newProps.meetOrSlice); + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _refX = nil; + _refY = nil; + _markerHeight = nil; + _markerWidth = nil; + _markerUnits = nil; + _orient = nil; + + _minX = 0; + _minY = 0; + _vbWidth = 0; + _vbHeight = 0; + _align = nil; + _meetOrSlice = kRNSVGVBMOSMeet; +} +#endif // RN_FABRIC_ENABLED + - (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { return nil; @@ -198,3 +265,10 @@ - (void)renderMarker:(CGContextRef)context rect:(CGRect)rect position:(RNSVGMark @end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGMarkerCls(void) +{ + return RNSVGMarker.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGMask.m b/apple/Elements/RNSVGMask.m deleted file mode 100644 index ee921a466..000000000 --- a/apple/Elements/RNSVGMask.m +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ -#import "RNSVGMask.h" -#import "RNSVGPainter.h" -#import "RNSVGBrushType.h" -#import "RNSVGNode.h" - -@implementation RNSVGMask - -- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event -{ - return nil; -} - -- (void)parseReference -{ - self.dirty = false; - [self.svgView defineMask:self maskName:self.name]; -} - -- (void)setX:(RNSVGLength *)x -{ - if ([x isEqualTo:_x]) { - return; - } - - _x = x; - [self invalidate]; -} - -- (void)setY:(RNSVGLength *)y -{ - if ([y isEqualTo:_y]) { - return; - } - - _y = y; - [self invalidate]; -} - -- (void)setMaskwidth:(RNSVGLength *)maskwidth -{ - if ([maskwidth isEqualTo:_maskwidth]) { - return; - } - - _maskwidth = maskwidth; - [self invalidate]; -} - -- (void)setMaskheight:(RNSVGLength *)maskheight -{ - if ([maskheight isEqualTo:_maskheight]) { - return; - } - - _maskheight = maskheight; - [self invalidate]; -} - -- (void)setMaskUnits:(RNSVGUnits)maskUnits -{ - if (maskUnits == _maskUnits) { - return; - } - - _maskUnits = maskUnits; - [self invalidate]; -} - -- (void)setMaskContentUnits:(RNSVGUnits)maskContentUnits -{ - if (maskContentUnits == _maskContentUnits) { - return; - } - - _maskContentUnits = maskContentUnits; - [self invalidate]; -} - -- (void)setMaskTransform:(CGAffineTransform)maskTransform -{ - _maskTransform = maskTransform; - [self invalidate]; -} - -@end - diff --git a/apple/Elements/RNSVGMask.mm b/apple/Elements/RNSVGMask.mm new file mode 100644 index 000000000..cc2fbdecc --- /dev/null +++ b/apple/Elements/RNSVGMask.mm @@ -0,0 +1,167 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ +#import "RNSVGMask.h" +#import "RNSVGPainter.h" +#import "RNSVGBrushType.h" +#import "RNSVGNode.h" + + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGMask + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x)]; + self.y = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y)]; + if (RCTNSStringFromStringNilIfEmpty(newProps.maskheight)) { + self.maskheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.maskheight)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.maskwidth)) { + self.maskwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.maskwidth)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.height)) { + self.maskheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.height)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.width)) { + self.maskwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.width)]; + } + self.maskUnits = newProps.maskUnits == 0 ? kRNSVGUnitsObjectBoundingBox : kRNSVGUnitsUserSpaceOnUse; + self.maskContentUnits = newProps.maskUnits == 0 ? kRNSVGUnitsObjectBoundingBox : kRNSVGUnitsUserSpaceOnUse; + if (newProps.maskTransform.size() == 6) { + self.maskTransform = CGAffineTransformMake(newProps.maskTransform.at(0), newProps.maskTransform.at(1), newProps.maskTransform.at(2), newProps.maskTransform.at(3), newProps.maskTransform.at(4), newProps.maskTransform.at(5)); + } + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x = nil; + _y = nil; + _maskheight = nil; + _maskwidth = nil; + _maskUnits = kRNSVGUnitsObjectBoundingBox; + _maskContentUnits = kRNSVGUnitsObjectBoundingBox; + _maskTransform = CGAffineTransformIdentity; +} +#endif // RN_FABRIC_ENABLED + +- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event +{ + return nil; +} + +- (void)parseReference +{ + self.dirty = false; + [self.svgView defineMask:self maskName:self.name]; +} + +- (void)setX:(RNSVGLength *)x +{ + if ([x isEqualTo:_x]) { + return; + } + + _x = x; + [self invalidate]; +} + +- (void)setY:(RNSVGLength *)y +{ + if ([y isEqualTo:_y]) { + return; + } + + _y = y; + [self invalidate]; +} + +- (void)setMaskwidth:(RNSVGLength *)maskwidth +{ + if ([maskwidth isEqualTo:_maskwidth]) { + return; + } + + _maskwidth = maskwidth; + [self invalidate]; +} + +- (void)setMaskheight:(RNSVGLength *)maskheight +{ + if ([maskheight isEqualTo:_maskheight]) { + return; + } + + _maskheight = maskheight; + [self invalidate]; +} + +- (void)setMaskUnits:(RNSVGUnits)maskUnits +{ + if (maskUnits == _maskUnits) { + return; + } + + _maskUnits = maskUnits; + [self invalidate]; +} + +- (void)setMaskContentUnits:(RNSVGUnits)maskContentUnits +{ + if (maskContentUnits == _maskContentUnits) { + return; + } + + _maskContentUnits = maskContentUnits; + [self invalidate]; +} + +- (void)setMaskTransform:(CGAffineTransform)maskTransform +{ + _maskTransform = maskTransform; + [self invalidate]; +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGMaskCls(void) +{ + return RNSVGMask.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGPath.m b/apple/Elements/RNSVGPath.m deleted file mode 100644 index fc77c23f9..000000000 --- a/apple/Elements/RNSVGPath.m +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RNSVGPath.h" - -@implementation RNSVGPath -{ - CGPathRef _path; -} - -- (void)setD:(RNSVGPathParser *)d -{ - if (d == _d) { - return; - } - - [self invalidate]; - _d = d; - CGPathRelease(_path); - _path = CGPathRetain([d getPath]); -} - -- (CGPathRef)getPath:(CGContextRef)context -{ - return _path; -} - -- (void)dealloc -{ - CGPathRelease(_path); -} - -@end diff --git a/apple/Elements/RNSVGPath.mm b/apple/Elements/RNSVGPath.mm new file mode 100644 index 000000000..666bf030b --- /dev/null +++ b/apple/Elements/RNSVGPath.mm @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNSVGPath.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGPath +{ + CGPathRef _path; +} + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + self.d = [[RNSVGPathParser alloc] initWithPathString: RCTNSStringFromString(newProps.d)]; + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + if (_path) { + CGPathRelease(_path); + } + _path = nil; + _d = nil; +} +#endif // RN_FABRIC_ENABLED + +- (void)setD:(RNSVGPathParser *)d +{ + if (d == _d) { + return; + } + + [self invalidate]; + _d = d; + CGPathRelease(_path); + _path = CGPathRetain([d getPath]); +} + +- (CGPathRef)getPath:(CGContextRef)context +{ + return _path; +} + +- (void)dealloc +{ + CGPathRelease(_path); +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGPathCls(void) +{ + return RNSVGPath.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGPattern.m b/apple/Elements/RNSVGPattern.mm similarity index 50% rename from apple/Elements/RNSVGPattern.m rename to apple/Elements/RNSVGPattern.mm index a35b5aec6..0226ddb98 100644 --- a/apple/Elements/RNSVGPattern.m +++ b/apple/Elements/RNSVGPattern.mm @@ -10,8 +10,88 @@ #import "RNSVGBrushType.h" #import "RNSVGNode.h" +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGPattern +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x)]; + self.y = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y)]; + if (RCTNSStringFromStringNilIfEmpty(newProps.patternheight)) { + self.patternheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.patternheight)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.patternwidth)) { + self.patternwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.patternwidth)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.height)) { + self.patternheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.height)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.width)) { + self.patternwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.width)]; + } + self.patternUnits = newProps.patternUnits == 0 ? kRNSVGUnitsObjectBoundingBox : kRNSVGUnitsUserSpaceOnUse; + self.patternContentUnits = newProps.patternUnits == 0 ? kRNSVGUnitsObjectBoundingBox : kRNSVGUnitsUserSpaceOnUse; + if (newProps.patternTransform.size() == 6) { + self.patternTransform = CGAffineTransformMake(newProps.patternTransform.at(0), newProps.patternTransform.at(1), newProps.patternTransform.at(2), newProps.patternTransform.at(3), newProps.patternTransform.at(4), newProps.patternTransform.at(5)); + } + self.minX = newProps.minX; + self.minY = newProps.minY; + self.vbWidth = newProps.vbWidth; + self.vbHeight = newProps.vbHeight; + self.align = RCTNSStringFromStringNilIfEmpty(newProps.align); + self.meetOrSlice = intToRNSVGVBMOS(newProps.meetOrSlice); + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x = nil; + _y = nil; + _patternheight = nil; + _patternwidth = nil; + _patternUnits = kRNSVGUnitsObjectBoundingBox; + _patternContentUnits = kRNSVGUnitsObjectBoundingBox; + _patternTransform = CGAffineTransformIdentity; + + _minX = 0; + _minY = 0; + _vbWidth = 0; + _vbHeight = 0; + _align = nil; + _meetOrSlice = kRNSVGVBMOSMeet; +} +#endif // RN_FABRIC_ENABLED + - (instancetype)init { if (self = [super init]) { @@ -170,3 +250,9 @@ - (void)setMeetOrSlice:(RNSVGVBMOS)meetOrSlice @end +#ifdef RN_FABRIC_ENABLED +Class RNSVGPatternCls(void) +{ + return RNSVGPattern.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGRadialGradient.m b/apple/Elements/RNSVGRadialGradient.m deleted file mode 100644 index 992e34838..000000000 --- a/apple/Elements/RNSVGRadialGradient.m +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ -#import "RNSVGRadialGradient.h" - -@implementation RNSVGRadialGradient - -- (instancetype)init -{ - if (self = [super init]) { - _gradientTransform = CGAffineTransformIdentity; - } - return self; -} - -- (void)setFx:(RNSVGLength *)fx -{ - if ([fx isEqualTo:_fx]) { - return; - } - - _fx = fx; - [self invalidate]; -} - -- (void)setFy:(RNSVGLength *)fy -{ - if ([fy isEqualTo:_fy]) { - return; - } - - _fy = fy; - [self invalidate]; -} - -- (void)setRx:(RNSVGLength *)rx -{ - if ([rx isEqualTo:_rx]) { - return; - } - - _rx = rx; - [self invalidate]; -} - -- (void)setRy:(RNSVGLength *)ry -{ - if ([ry isEqualTo:_ry]) { - return; - } - - _ry = ry; - [self invalidate]; -} - -- (void)setCx:(RNSVGLength *)cx -{ - if ([cx isEqualTo:_cx]) { - return; - } - - _cx = cx; - [self invalidate]; -} - -- (void)setCy:(RNSVGLength *)cy -{ - if ([cy isEqualTo:_cy]) { - return; - } - - _cy = cy; - [self invalidate]; -} - -- (void)setGradient:(NSArray *)gradient -{ - if (gradient == _gradient) { - return; - } - - _gradient = gradient; - [self invalidate]; -} - -- (void)setGradientUnits:(RNSVGUnits)gradientUnits -{ - if (gradientUnits == _gradientUnits) { - return; - } - - _gradientUnits = gradientUnits; - [self invalidate]; -} - -- (void)setGradientTransform:(CGAffineTransform)gradientTransform -{ - _gradientTransform = gradientTransform; - [self invalidate]; -} - -- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event -{ - return nil; -} - -- (void)parseReference -{ - self.dirty = false; - NSArray *points = @[self.fx, self.fy, self.rx, self.ry, self.cx, self.cy]; - RNSVGPainter *painter = [[RNSVGPainter alloc] initWithPointsArray:points]; - [painter setUnits:self.gradientUnits]; - [painter setTransform:self.gradientTransform]; - [painter setRadialGradientColors:self.gradient]; - - if (self.gradientUnits == kRNSVGUnitsUserSpaceOnUse) { - [painter setUserSpaceBoundingBox:[self.svgView getContextBounds]]; - } - - [self.svgView definePainter:painter painterName:self.name]; -} - -@end - diff --git a/apple/Elements/RNSVGRadialGradient.mm b/apple/Elements/RNSVGRadialGradient.mm new file mode 100644 index 000000000..6fc1b4fe1 --- /dev/null +++ b/apple/Elements/RNSVGRadialGradient.mm @@ -0,0 +1,200 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ +#import "RNSVGRadialGradient.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGRadialGradient + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.fx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.fx)]; + self.fy = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.fy)]; + self.cx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.cx)]; + self.cy = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.cy)]; + self.rx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.rx)]; + self.ry = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.ry)]; + if (newProps.gradient.size() > 0) { + NSMutableArray *gradientArray = [NSMutableArray new]; + for (auto number : newProps.gradient) { + [gradientArray addObject:[NSNumber numberWithDouble:number]]; + } + self.gradient = gradientArray; + } + self.gradientUnits = newProps.gradientUnits == 0 ? kRNSVGUnitsObjectBoundingBox : kRNSVGUnitsUserSpaceOnUse; + if (newProps.gradientTransform.size() == 6) { + self.gradientTransform = CGAffineTransformMake(newProps.gradientTransform.at(0), newProps.gradientTransform.at(1), newProps.gradientTransform.at(2), newProps.gradientTransform.at(3), newProps.gradientTransform.at(4), newProps.gradientTransform.at(5)); + } + + setCommonNodeProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _fx = nil; + _fy = nil; + _cx = nil; + _cy = nil; + _rx = nil; + _ry = nil; + _gradient = nil; + _gradientUnits = kRNSVGUnitsObjectBoundingBox; + _gradientTransform = CGAffineTransformIdentity; +} +#endif // RN_FABRIC_ENABLED +- (instancetype)init +{ + if (self = [super init]) { + _gradientTransform = CGAffineTransformIdentity; + } + return self; +} + +- (void)setFx:(RNSVGLength *)fx +{ + if ([fx isEqualTo:_fx]) { + return; + } + + _fx = fx; + [self invalidate]; +} + +- (void)setFy:(RNSVGLength *)fy +{ + if ([fy isEqualTo:_fy]) { + return; + } + + _fy = fy; + [self invalidate]; +} + +- (void)setRx:(RNSVGLength *)rx +{ + if ([rx isEqualTo:_rx]) { + return; + } + + _rx = rx; + [self invalidate]; +} + +- (void)setRy:(RNSVGLength *)ry +{ + if ([ry isEqualTo:_ry]) { + return; + } + + _ry = ry; + [self invalidate]; +} + +- (void)setCx:(RNSVGLength *)cx +{ + if ([cx isEqualTo:_cx]) { + return; + } + + _cx = cx; + [self invalidate]; +} + +- (void)setCy:(RNSVGLength *)cy +{ + if ([cy isEqualTo:_cy]) { + return; + } + + _cy = cy; + [self invalidate]; +} + +- (void)setGradient:(NSArray *)gradient +{ + if (gradient == _gradient) { + return; + } + + _gradient = gradient; + [self invalidate]; +} + +- (void)setGradientUnits:(RNSVGUnits)gradientUnits +{ + if (gradientUnits == _gradientUnits) { + return; + } + + _gradientUnits = gradientUnits; + [self invalidate]; +} + +- (void)setGradientTransform:(CGAffineTransform)gradientTransform +{ + _gradientTransform = gradientTransform; + [self invalidate]; +} + +- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event +{ + return nil; +} + +- (void)parseReference +{ + self.dirty = false; + NSArray *points = @[self.fx, self.fy, self.rx, self.ry, self.cx, self.cy]; + RNSVGPainter *painter = [[RNSVGPainter alloc] initWithPointsArray:points]; + [painter setUnits:self.gradientUnits]; + [painter setTransform:self.gradientTransform]; + [painter setRadialGradientColors:self.gradient]; + + if (self.gradientUnits == kRNSVGUnitsUserSpaceOnUse) { + [painter setUserSpaceBoundingBox:[self.svgView getContextBounds]]; + } + + [self.svgView definePainter:painter painterName:self.name]; +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGRadialGradientCls(void) +{ + return RNSVGRadialGradient.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGSvgView.h b/apple/Elements/RNSVGSvgView.h index b126a5ff8..e77eb1bee 100644 --- a/apple/Elements/RNSVGSvgView.h +++ b/apple/Elements/RNSVGSvgView.h @@ -12,9 +12,18 @@ #import "RNSVGContainer.h" #import "RNSVGVBMOS.h" +#ifdef RN_FABRIC_ENABLED +#import +#endif // RN_FABRIC_ENABLED + @class RNSVGNode; -@interface RNSVGSvgView : RNSVGView +@interface RNSVGSvgView : +#ifdef RN_FABRIC_ENABLED +RCTViewComponentView +#else +RNSVGView +#endif // RN_FABRIC_ENABLED @property (nonatomic, strong) RNSVGLength *bbWidth; @property (nonatomic, strong) RNSVGLength *bbHeight; @@ -38,7 +47,7 @@ - (RNSVGNode *)getDefinedClipPath:(NSString *)clipPathName; -- (void)defineTemplate:(__kindof RNSVGNode *)template templateName:(NSString *)templateName; +- (void)defineTemplate:(__kindof RNSVGNode *)definedTemplate templateName:(NSString *)templateName; - (RNSVGNode *)getDefinedTemplate:(NSString *)templateName; diff --git a/apple/Elements/RNSVGSvgView.m b/apple/Elements/RNSVGSvgView.mm similarity index 77% rename from apple/Elements/RNSVGSvgView.m rename to apple/Elements/RNSVGSvgView.mm index c44a775c7..0b6b04fa4 100644 --- a/apple/Elements/RNSVGSvgView.m +++ b/apple/Elements/RNSVGSvgView.mm @@ -11,6 +11,14 @@ #import "RNSVGNode.h" #import +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGSvgView { NSMutableDictionary *_clipPaths; @@ -22,6 +30,10 @@ @implementation RNSVGSvgView bool rendered; } +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; +#endif // RN_FABRIC_ENABLED + - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { @@ -29,12 +41,76 @@ - (instancetype)initWithFrame:(CGRect)frame // This is necessary to ensure that [self setNeedsDisplay] actually triggers // a redraw when our parent transitions between hidden and visible. self.contentMode = UIViewContentModeRedraw; -#endif +#endif // TARGET_OS_OSX rendered = false; +#ifdef RN_FABRIC_ENABLED + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + // TODO: think if we can do it better + self.opaque = NO; +#endif // RN_FABRIC_ENABLED } return self; } +#ifdef RN_FABRIC_ENABLED +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.minX = newProps.minX; + self.minY = newProps.minY; + self.vbWidth = newProps.vbWidth; + self.vbHeight = newProps.vbHeight; + self.bbWidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.bbWidth)]; + self.bbHeight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.bbHeight)]; + self.align = RCTNSStringFromStringNilIfEmpty(newProps.align); + self.meetOrSlice = intToRNSVGVBMOS(newProps.meetOrSlice); + if (RCTUIColorFromSharedColor(newProps.tintColor)) { + self.tintColor = RCTUIColorFromSharedColor(newProps.tintColor); + } + if (RCTUIColorFromSharedColor(newProps.color)) { + self.tintColor = RCTUIColorFromSharedColor(newProps.color); + } +} + + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _minX = 0; + _minY = 0; + _vbWidth = 0; + _vbHeight = 0; + _bbWidth = 0; + _bbHeight = 0; + _align = nil; + _meetOrSlice = kRNSVGVBMOSMeet; + + _responsible = NO; + _active = NO; + _boundingBox = CGRectZero; + _initialCTM = CGAffineTransformIdentity; + _invInitialCTM = CGAffineTransformIdentity; + _viewBoxTransform = CGAffineTransformIdentity; + + _clipPaths = nil; + _templates = nil; + _painters = nil; + _markers = nil; + _masks = nil; + _invviewBoxTransform = CGAffineTransformIdentity; + rendered = NO; +} +#endif // RN_FABRIC_ENABLED + - (void)insertReactSubview:(RNSVGView *)subview atIndex:(NSInteger)atIndex { [super insertReactSubview:subview atIndex:atIndex]; @@ -299,12 +375,12 @@ - (RNSVGNode *)getDefinedClipPath:(NSString *)clipPathName return _clipPaths ? [_clipPaths objectForKey:clipPathName] : nil; } -- (void)defineTemplate:(RNSVGNode *)template templateName:(NSString *)templateName +- (void)defineTemplate:(RNSVGNode *)definedTemplate templateName:(NSString *)templateName { if (!_templates) { _templates = [[NSMutableDictionary alloc] init]; } - [_templates setObject:template forKey:templateName]; + [_templates setObject:definedTemplate forKey:templateName]; } - (RNSVGNode *)getDefinedTemplate:(NSString *)templateName @@ -363,3 +439,10 @@ - (CGAffineTransform)getViewBoxTransform } @end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGSvgViewCls(void) +{ + return RNSVGSvgView.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGSymbol.m b/apple/Elements/RNSVGSymbol.mm similarity index 55% rename from apple/Elements/RNSVGSymbol.m rename to apple/Elements/RNSVGSymbol.mm index 615718b65..3064ff2fc 100644 --- a/apple/Elements/RNSVGSymbol.m +++ b/apple/Elements/RNSVGSymbol.mm @@ -8,10 +8,62 @@ #import "RNSVGSymbol.h" #import "RNSVGViewBox.h" -@class RNSVGNode; +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED @implementation RNSVGSymbol +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.minX = newProps.minX; + self.minY = newProps.minY; + self.vbWidth = newProps.vbWidth; + self.vbHeight = newProps.vbHeight; + self.align = RCTNSStringFromStringNilIfEmpty(newProps.align); + self.meetOrSlice = intToRNSVGVBMOS(newProps.meetOrSlice); + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + _minX = 0; + _minY = 0; + _vbWidth = 0; + _vbHeight = 0; + _align = nil; + _meetOrSlice = kRNSVGVBMOSMeet; +} +#endif // RN_FABRIC_ENABLED + - (void)setMinX:(CGFloat)minX { if (minX == _minX) { @@ -95,3 +147,9 @@ - (void)renderSymbolTo:(CGContextRef)context width:(CGFloat)width height:(CGFloa @end +#ifdef RN_FABRIC_ENABLED +Class RNSVGSymbolCls(void) +{ + return RNSVGSymbol.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Elements/RNSVGUse.m b/apple/Elements/RNSVGUse.m deleted file mode 100644 index 4f7a0261f..000000000 --- a/apple/Elements/RNSVGUse.m +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ -#import "RNSVGUse.h" -#import "RNSVGSymbol.h" -#import - -@implementation RNSVGUse - -- (void)setHref:(NSString *)href -{ - if ([href isEqualToString:_href]) { - return; - } - - [self invalidate]; - _href = href; -} - -- (void)setX:(RNSVGLength *)x -{ - if ([x isEqualTo:_x]) { - return; - } - - [self invalidate]; - _x = x; -} - -- (void)setY:(RNSVGLength *)y -{ - if ([y isEqualTo:_y]) { - return; - } - - [self invalidate]; - _y = y; -} - - -- (void)setUsewidth:(RNSVGLength *)usewidth -{ - if ([usewidth isEqualTo:_usewidth]) { - return; - } - - [self invalidate]; - _usewidth = usewidth; -} - -- (void)setUseheight:(RNSVGLength *)useheight -{ - if ([useheight isEqualTo:_useheight]) { - return; - } - - [self invalidate]; - _useheight = useheight; -} - -- (void)renderLayerTo:(CGContextRef)context rect:(CGRect)rect -{ - CGContextTranslateCTM(context, [self relativeOnWidth:self.x], [self relativeOnHeight:self.y]); - RNSVGNode* template = [self.svgView getDefinedTemplate:self.href]; - if (template) { - [self beginTransparencyLayer:context]; - [self clip:context]; - - if ([template isKindOfClass:[RNSVGRenderable class]]) { - [(RNSVGRenderable*)template mergeProperties:self]; - } - - if ([template class] == [RNSVGSymbol class]) { - RNSVGSymbol *symbol = (RNSVGSymbol*)template; - [symbol renderSymbolTo:context width:[self relativeOnWidth:self.usewidth] height:[self relativeOnHeight:self.useheight]]; - } else { - [template renderTo:context rect:rect]; - } - - if ([template isKindOfClass:[RNSVGRenderable class]]) { - [(RNSVGRenderable*)template resetProperties]; - } - - [self endTransparencyLayer:context]; - } else if (self.href) { - // TODO: calling yellow box here - RCTLogWarn(@"`Use` element expected a pre-defined svg template as `href` prop, template named: %@ is not defined.", self.href); - return; - } else { - return; - } - CGRect bounds = template.clientRect; - self.clientRect = bounds; - - CGAffineTransform current = CGContextGetCTM(context); - CGAffineTransform svgToClientTransform = CGAffineTransformConcat(current, self.svgView.invInitialCTM); - - self.ctm = svgToClientTransform; - self.screenCTM = current; - - CGAffineTransform transform = CGAffineTransformConcat(self.matrix, self.transforms); - CGPoint mid = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); - CGPoint center = CGPointApplyAffineTransform(mid, transform); - - self.bounds = bounds; - if (!isnan(center.x) && !isnan(center.y)) { - self.center = center; - } - self.frame = bounds; -} - -- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { - CGPoint transformed = CGPointApplyAffineTransform(point, self.invmatrix); - transformed = CGPointApplyAffineTransform(transformed, self.invTransform); - RNSVGNode const* template = [self.svgView getDefinedTemplate:self.href]; - if (event) { - self.active = NO; - } else if (self.active) { - return self; - } - RNSVGPlatformView const* hitChild = [template hitTest:transformed withEvent:event]; - if (hitChild) { - self.active = YES; - return self; - } - return nil; -} - -- (CGPathRef)getPath: (CGContextRef)context -{ - CGAffineTransform transform = CGAffineTransformMakeTranslation([self relativeOnWidth:self.x], [self relativeOnHeight:self.y]); - RNSVGNode const* template = [self.svgView getDefinedTemplate:self.href]; - if (!template) { - return nil; - } - CGPathRef path = [template getPath:context]; - return CGPathCreateCopyByTransformingPath(path, &transform); -} - -@end - diff --git a/apple/Elements/RNSVGUse.mm b/apple/Elements/RNSVGUse.mm new file mode 100644 index 000000000..a1e21af54 --- /dev/null +++ b/apple/Elements/RNSVGUse.mm @@ -0,0 +1,212 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ +#import "RNSVGUse.h" +#import "RNSVGSymbol.h" +#import + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGUse + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x)]; + self.y = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y)]; + if (RCTNSStringFromStringNilIfEmpty(newProps.useheight)) { + self.useheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.useheight)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.usewidth)) { + self.usewidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.usewidth)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.height)) { + self.useheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.height)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.width)) { + self.usewidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.width)]; + } + self.href = RCTNSStringFromStringNilIfEmpty(newProps.href); + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x = nil; + _y = nil; + _useheight = nil; + _usewidth = nil; + _href = nil; +} +#endif // RN_FABRIC_ENABLED + +- (void)setHref:(NSString *)href +{ + if ([href isEqualToString:_href]) { + return; + } + + [self invalidate]; + _href = href; +} + +- (void)setX:(RNSVGLength *)x +{ + if ([x isEqualTo:_x]) { + return; + } + + [self invalidate]; + _x = x; +} + +- (void)setY:(RNSVGLength *)y +{ + if ([y isEqualTo:_y]) { + return; + } + + [self invalidate]; + _y = y; +} + + +- (void)setUsewidth:(RNSVGLength *)usewidth +{ + if ([usewidth isEqualTo:_usewidth]) { + return; + } + + [self invalidate]; + _usewidth = usewidth; +} + +- (void)setUseheight:(RNSVGLength *)useheight +{ + if ([useheight isEqualTo:_useheight]) { + return; + } + + [self invalidate]; + _useheight = useheight; +} + +- (void)renderLayerTo:(CGContextRef)context rect:(CGRect)rect +{ + CGContextTranslateCTM(context, [self relativeOnWidth:self.x], [self relativeOnHeight:self.y]); + RNSVGNode* definedTemplate = [self.svgView getDefinedTemplate:self.href]; + if (definedTemplate) { + [self beginTransparencyLayer:context]; + [self clip:context]; + + if ([definedTemplate isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)definedTemplate mergeProperties:self]; + } + + if ([definedTemplate class] == [RNSVGSymbol class]) { + RNSVGSymbol *symbol = (RNSVGSymbol*)definedTemplate; + [symbol renderSymbolTo:context width:[self relativeOnWidth:self.usewidth] height:[self relativeOnHeight:self.useheight]]; + } else { + [definedTemplate renderTo:context rect:rect]; + } + + if ([definedTemplate isKindOfClass:[RNSVGRenderable class]]) { + [(RNSVGRenderable*)definedTemplate resetProperties]; + } + + [self endTransparencyLayer:context]; + } else if (self.href) { + // TODO: calling yellow box here + RCTLogWarn(@"`Use` element expected a pre-defined svg template as `href` prop, template named: %@ is not defined.", self.href); + return; + } else { + return; + } + CGRect bounds = definedTemplate.clientRect; + self.clientRect = bounds; + + CGAffineTransform current = CGContextGetCTM(context); + CGAffineTransform svgToClientTransform = CGAffineTransformConcat(current, self.svgView.invInitialCTM); + + self.ctm = svgToClientTransform; + self.screenCTM = current; + + CGAffineTransform transform = CGAffineTransformConcat(self.matrix, self.transforms); + CGPoint mid = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); + CGPoint center = CGPointApplyAffineTransform(mid, transform); + + self.bounds = bounds; + if (!isnan(center.x) && !isnan(center.y)) { + self.center = center; + } + self.frame = bounds; +} + +- (RNSVGPlatformView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + CGPoint transformed = CGPointApplyAffineTransform(point, self.invmatrix); + transformed = CGPointApplyAffineTransform(transformed, self.invTransform); + RNSVGNode const* definedTemplate = [self.svgView getDefinedTemplate:self.href]; + if (event) { + self.active = NO; + } else if (self.active) { + return self; + } + RNSVGPlatformView const* hitChild = [definedTemplate hitTest:transformed withEvent:event]; + if (hitChild) { + self.active = YES; + return self; + } + return nil; +} + +- (CGPathRef)getPath: (CGContextRef)context +{ + CGAffineTransform transform = CGAffineTransformMakeTranslation([self relativeOnWidth:self.x], [self relativeOnHeight:self.y]); + RNSVGNode const* definedTemplate = [self.svgView getDefinedTemplate:self.href]; + if (!definedTemplate) { + return nil; + } + CGPathRef path = [definedTemplate getPath:context]; + return CGPathCreateCopyByTransformingPath(path, &transform); +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGUseCls(void) +{ + return RNSVGUse.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/RNSVGNode.h b/apple/RNSVGNode.h index 340b5b517..17b5bf79e 100644 --- a/apple/RNSVGNode.h +++ b/apple/RNSVGNode.h @@ -6,10 +6,15 @@ * LICENSE file in the root directory of this source tree. */ +#import "RNSVGSvgView.h" #import #import #import "RNSVGCGFCRule.h" -#import "RNSVGSvgView.h" + +#ifdef RN_FABRIC_ENABLED +#import +#endif // RN_FABRIC_ENABLED + @class RNSVGGroup; /** @@ -17,8 +22,12 @@ *interfaces for all non-definition nodes. */ -@interface RNSVGNode : RNSVGView - +@interface RNSVGNode : +#ifdef RN_FABRIC_ENABLED +RCTViewComponentView +#else +RNSVGView +#endif // RN_FABRIC_ENABLED /* N[1/Sqrt[2], 36] The inverse of the square root of 2. @@ -36,6 +45,7 @@ extern CGFloat const RNSVG_DEFAULT_FONT_SIZE; @property (nonatomic, strong) NSString *markerStart; @property (nonatomic, strong) NSString *markerMid; @property (nonatomic, strong) NSString *markerEnd; +@property (nonatomic, strong) RNSVGPlatformView *parentComponentView; /** * Used to control how touch events are processed. diff --git a/apple/RNSVGNode.m b/apple/RNSVGNode.mm similarity index 85% rename from apple/RNSVGNode.m rename to apple/RNSVGNode.mm index 2ec27dfd0..55e792d31 100644 --- a/apple/RNSVGNode.m +++ b/apple/RNSVGNode.mm @@ -69,8 +69,12 @@ - (void)invalidate return; } _dirty = true; - id container = (id)self.superview; - [container invalidate]; + RNSVGView *container = self.superview; + // on Fabric, when the child components are added to hierarchy and their props are set, + // their superview is not set yet. + if ([container conformsToProtocol:@protocol(RNSVGContainer)]){ + [(id)container invalidate]; + } [self clearPath]; canvasWidth = -1; canvasHeight = -1; @@ -173,7 +177,7 @@ - (void)setPointerEvents:(RCTPointerEvents)pointerEvents self.accessibilityModal = NO; #else self.accessibilityViewIsModal = NO; -#endif +#endif // TARGET_OS_OSX } } @@ -221,8 +225,12 @@ - (void)setMatrix:(CGAffineTransform)matrix } _matrix = matrix; _invmatrix = CGAffineTransformInvert(matrix); - id container = (id)self.superview; - [container invalidate]; + RNSVGView *container = self.superview; + // on Fabric, when the child components are added to hierarchy and their props are set, + // their superview is still their componentView, we change it in `mountChildComponentView` method. + if ([container conformsToProtocol:@protocol(RNSVGContainer)]){ + [(id)container invalidate]; + } } - (void)setClientRect:(CGRect)clientRect { @@ -558,7 +566,7 @@ - (void)parseReference { self.dirty = false; if (self.name) { - typeof(self) __weak weakSelf = self; + __typeof__(self) __weak weakSelf = self; [self.svgView defineTemplate:weakSelf templateName:self.name]; } } @@ -579,4 +587,69 @@ - (void)dealloc CGPathRelease(_path); } +#ifdef RN_FABRIC_ENABLED +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + self.opacity = 1; + self.opaque = false; + self.matrix = CGAffineTransformIdentity; + self.transforms = CGAffineTransformIdentity; + self.invTransform = CGAffineTransformIdentity; + _merging = false; + _dirty = false; + + _name = nil; + _display = nil; + _opacity = 0; + _clipRule = kRNSVGCGFCRuleEvenodd; + _clipPath = nil; + _mask = nil; + _markerStart = nil; + _markerMid = nil; + _markerEnd = nil; + _parentComponentView = nil; + + _pointerEvents = RCTPointerEventsUnspecified; + _responsible = NO; + + _ctm = CGAffineTransformIdentity; + _screenCTM = CGAffineTransformIdentity; + _matrix = CGAffineTransformIdentity; + _transforms = CGAffineTransformIdentity; + _invmatrix = CGAffineTransformIdentity; + _invTransform = CGAffineTransformIdentity; + _active = NO; + _skip = NO; + if (_markerPath) { + CGPathRelease(_markerPath); + } + _markerPath = nil; + _clientRect = CGRectZero; + _pathBounds = CGRectZero; + _fillBounds = CGRectZero; + _strokeBounds = CGRectZero; + _markerBounds = CGRectZero; + _onLayout = nil; + + _svgView = nil; + _textRoot = nil; + + + glyphContext = nil; + _transparent = NO; + _clipNode = nil; + canvasWidth = 0; + canvasHeight = 0; + canvasDiagonal = 0; + CGPathRelease(_cachedClipPath); + _cachedClipPath = nil; + CGPathRelease(_strokePath); + _strokePath = nil; + CGPathRelease(_path); + _path = nil; +} +#endif // RN_FABRIC_ENABLED + @end diff --git a/apple/RNSVGRenderable.m b/apple/RNSVGRenderable.mm similarity index 94% rename from apple/RNSVGRenderable.m rename to apple/RNSVGRenderable.mm index b16de3e87..a2bd72b8d 100644 --- a/apple/RNSVGRenderable.m +++ b/apple/RNSVGRenderable.mm @@ -180,6 +180,43 @@ - (void)dealloc _strokeDashArrayData = nil; } +#ifdef RN_FABRIC_ENABLED +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + _fillOpacity = 1; + _strokeOpacity = 1; + _strokeWidth = [RNSVGLength lengthWithNumber:1]; + _fillRule = kRNSVGCGFCRuleNonzero; + + _originProperties = nil; + _lastMergedList = nil; + _attributeList = nil; + _sourceStrokeDashArray = nil; + _strokeDashArrayData = nil; + _srcHitPath = nil; + CGPathRelease(_hitArea); + _hitArea = nil; + _sourceStrokeDashArray = nil; + if (_strokeDashArrayData) { + free(_strokeDashArrayData); + } + _strokeDashArrayData = nil; + + _contextElement = nil; + _fill = nil; + _stroke = nil; + _strokeLinecap = kCGLineCapButt; + _strokeLinejoin = kCGLineJoinMiter; + _strokeMiterlimit = 0; + _strokeDasharray = nil; + _strokeDashoffset = 0; + _vectorEffect = kRNSVGVectorEffectDefault; + _propList = nil; +} +#endif // RN_FABRIC_ENABLED + UInt32 saturate(CGFloat value) { return value <= 0 ? 0 : value >= 255 ? 255 : (UInt32)value; } @@ -206,7 +243,7 @@ - (void)renderTo:(CGContextRef)context rect:(CGRect)rect CGFloat scale = [[NSScreen mainScreen] backingScaleFactor]; #else CGFloat scale = [[UIScreen mainScreen] scale]; -#endif +#endif // TARGET_OS_OSX NSUInteger iheight = (NSUInteger)height; NSUInteger iwidth = (NSUInteger)width; NSUInteger iscale = (NSUInteger)scale; @@ -300,7 +337,7 @@ - (void)renderTo:(CGContextRef)context rect:(CGRect)rect - (void)prepareStrokeDash:(NSUInteger)count strokeDasharray:(NSArray *)strokeDasharray { if (strokeDasharray != _sourceStrokeDashArray) { CGFloat *dash = _strokeDashArrayData; - _strokeDashArrayData = realloc(dash, sizeof(CGFloat) * count); + _strokeDashArrayData = (CGFloat *)realloc(dash, sizeof(CGFloat) * count); if (!_strokeDashArrayData) { free(dash); return; @@ -510,7 +547,7 @@ - (void)setHitArea:(CGPathRef)path if (self.stroke && self.strokeWidth) { // Add stroke to hitArea CGFloat width = [self relativeOnOther:self.strokeWidth]; - self.strokePath = CGPathRetain(CFAutorelease(CGPathCreateCopyByStrokingPath(path, nil, width, self.strokeLinecap, self.strokeLinejoin, self.strokeMiterlimit))); + self.strokePath = CGPathRetain((CGPathRef)CFAutorelease(CGPathCreateCopyByStrokingPath(path, nil, width, self.strokeLinecap, self.strokeLinejoin, self.strokeMiterlimit))); // TODO add dashing // CGPathCreateCopyByDashingPath(CGPathRef _Nullable path, const CGAffineTransform * _Nullable transform, CGFloat phase, const CGFloat * _Nullable lengths, size_t count) } diff --git a/apple/RNSVGUIKit.h b/apple/RNSVGUIKit.h index cf45cdefa..ba6ed65f1 100644 --- a/apple/RNSVGUIKit.h +++ b/apple/RNSVGUIKit.h @@ -12,8 +12,19 @@ #else // TARGET_OS_OSX [ +// Due to name mangling, calling c-style functions from .mm files will fail, therefore we need to wrap them with extern "C" +// so they are handled correctly. We also need to have imports positioned in a correct way, +// so that this extern "C" wrapper is used before the functions from RCTUIKit are used. +#ifdef __cplusplus +extern "C" { +#endif + #import +#ifdef __cplusplus +} +#endif + #define RNSVGColor NSColor #define RNSVGPlatformView NSView #define RNSVGTextView NSTextView diff --git a/apple/RNSVGUIKit.macos.m b/apple/RNSVGUIKit.macos.mm similarity index 100% rename from apple/RNSVGUIKit.macos.m rename to apple/RNSVGUIKit.macos.mm diff --git a/apple/Shapes/RNSVGCircle.m b/apple/Shapes/RNSVGCircle.m deleted file mode 100644 index 33094d24e..000000000 --- a/apple/Shapes/RNSVGCircle.m +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RNSVGCircle.h" -#import - -@implementation RNSVGCircle - -- (void)setCx:(RNSVGLength *)cx -{ - if ([cx isEqualTo:_cx]) { - return; - } - [self invalidate]; - _cx = cx; -} - -- (void)setCy:(RNSVGLength *)cy -{ - if ([cy isEqualTo:_cy]) { - return; - } - [self invalidate]; - _cy = cy; -} - -- (void)setR:(RNSVGLength *)r -{ - if ([r isEqualTo:_r]) { - return; - } - [self invalidate]; - _r = r; -} - -- (CGPathRef)getPath:(CGContextRef)context -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGFloat cx = [self relativeOnWidth:self.cx]; - CGFloat cy = [self relativeOnHeight:self.cy]; - CGFloat r = [self relativeOnOther:self.r]; - CGPathAddArc(path, nil, cx, cy, r, 0, 2 * (CGFloat)M_PI, NO); - return (CGPathRef)CFAutorelease(path); -} - -@end diff --git a/apple/Shapes/RNSVGCircle.mm b/apple/Shapes/RNSVGCircle.mm new file mode 100644 index 000000000..8e8dc2046 --- /dev/null +++ b/apple/Shapes/RNSVGCircle.mm @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNSVGCircle.h" +#import + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGCircle + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.cx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.cx)]; + self.cy = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.cy)]; + self.r = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.r)]; + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _cx = nil; + _cy = nil; + _r = nil; +} +#endif // RN_FABRIC_ENABLED + +- (void)setCx:(RNSVGLength *)cx +{ + if ([cx isEqualTo:_cx]) { + return; + } + [self invalidate]; + _cx = cx; +} + +- (void)setCy:(RNSVGLength *)cy +{ + if ([cy isEqualTo:_cy]) { + return; + } + [self invalidate]; + _cy = cy; +} + +- (void)setR:(RNSVGLength *)r +{ + if ([r isEqualTo:_r]) { + return; + } + [self invalidate]; + _r = r; +} + +- (CGPathRef)getPath:(CGContextRef)context +{ + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat cx = [self relativeOnWidth:self.cx]; + CGFloat cy = [self relativeOnHeight:self.cy]; + CGFloat r = [self relativeOnOther:self.r]; + CGPathAddArc(path, nil, cx, cy, r, 0, 2 * (CGFloat)M_PI, NO); + return (CGPathRef)CFAutorelease(path); +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGCircleCls(void) +{ + return RNSVGCircle.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Shapes/RNSVGEllipse.m b/apple/Shapes/RNSVGEllipse.m deleted file mode 100644 index 1e2fd092f..000000000 --- a/apple/Shapes/RNSVGEllipse.m +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RNSVGEllipse.h" -#import - -@implementation RNSVGEllipse - -- (void)setCx:(RNSVGLength *)cx -{ - if ([cx isEqualTo:_cx]) { - return; - } - [self invalidate]; - _cx = cx; -} - -- (void)setCy:(RNSVGLength *)cy -{ - if ([cy isEqualTo:_cy]) { - return; - } - [self invalidate]; - _cy = cy; -} - -- (void)setRx:(RNSVGLength *)rx -{ - if ([rx isEqualTo:_rx]) { - return; - } - [self invalidate]; - _rx = rx; -} - -- (void)setRy:(RNSVGLength *)ry -{ - if ([ry isEqualTo:_ry]) { - return; - } - [self invalidate]; - _ry = ry; -} - -- (CGPathRef)getPath:(CGContextRef)context -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGFloat cx = [self relativeOnWidth:self.cx]; - CGFloat cy = [self relativeOnHeight:self.cy]; - CGFloat rx = [self relativeOnWidth:self.rx]; - CGFloat ry = [self relativeOnHeight:self.ry]; - CGPathAddEllipseInRect(path, nil, CGRectMake(cx - rx, cy - ry, rx * 2, ry * 2)); - return (CGPathRef)CFAutorelease(path); -} - -@end diff --git a/apple/Shapes/RNSVGEllipse.mm b/apple/Shapes/RNSVGEllipse.mm new file mode 100644 index 000000000..71800a27e --- /dev/null +++ b/apple/Shapes/RNSVGEllipse.mm @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNSVGEllipse.h" +#import + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGEllipse + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.cx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.cx)]; + self.cy = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.cy)]; + self.rx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.rx)]; + self.ry = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.ry)]; + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _cx = nil; + _cy = nil; + _rx = nil; + _ry = nil; +} +#endif // RN_FABRIC_ENABLED + +- (void)setCx:(RNSVGLength *)cx +{ + if ([cx isEqualTo:_cx]) { + return; + } + [self invalidate]; + _cx = cx; +} + +- (void)setCy:(RNSVGLength *)cy +{ + if ([cy isEqualTo:_cy]) { + return; + } + [self invalidate]; + _cy = cy; +} + +- (void)setRx:(RNSVGLength *)rx +{ + if ([rx isEqualTo:_rx]) { + return; + } + [self invalidate]; + _rx = rx; +} + +- (void)setRy:(RNSVGLength *)ry +{ + if ([ry isEqualTo:_ry]) { + return; + } + [self invalidate]; + _ry = ry; +} + +- (CGPathRef)getPath:(CGContextRef)context +{ + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat cx = [self relativeOnWidth:self.cx]; + CGFloat cy = [self relativeOnHeight:self.cy]; + CGFloat rx = [self relativeOnWidth:self.rx]; + CGFloat ry = [self relativeOnHeight:self.ry]; + CGPathAddEllipseInRect(path, nil, CGRectMake(cx - rx, cy - ry, rx * 2, ry * 2)); + return (CGPathRef)CFAutorelease(path); +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGEllipseCls(void) +{ + return RNSVGEllipse.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Shapes/RNSVGLine.m b/apple/Shapes/RNSVGLine.m deleted file mode 100644 index a9a14785e..000000000 --- a/apple/Shapes/RNSVGLine.m +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RNSVGLine.h" -#import - -@implementation RNSVGLine - -- (void)setX1:(RNSVGLength *)x1 -{ - if ([x1 isEqualTo:_x1]) { - return; - } - [self invalidate]; - _x1 = x1; -} - -- (void)setY1:(RNSVGLength *)y1 -{ - if ([y1 isEqualTo:_y1]) { - return; - } - [self invalidate]; - _y1 = y1; -} - -- (void)setX2:(RNSVGLength *)x2 -{ - if ([x2 isEqualTo:_x2]) { - return; - } - [self invalidate]; - _x2 = x2; -} - -- (void)setY2:(RNSVGLength *)y2 -{ - if ([y2 isEqualTo:_y2]) { - return; - } - [self invalidate]; - _y2 = y2; -} - -- (CGPathRef)getPath:(CGContextRef)context -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGFloat x1 = [self relativeOnWidth:self.x1]; - CGFloat y1 = [self relativeOnHeight:self.y1]; - CGFloat x2 = [self relativeOnWidth:self.x2]; - CGFloat y2 = [self relativeOnHeight:self.y2]; - CGPathMoveToPoint(path, nil, x1, y1); - CGPathAddLineToPoint(path, nil, x2, y2); - - return (CGPathRef)CFAutorelease(path); -} - -@end diff --git a/apple/Shapes/RNSVGLine.mm b/apple/Shapes/RNSVGLine.mm new file mode 100644 index 000000000..24ae761f6 --- /dev/null +++ b/apple/Shapes/RNSVGLine.mm @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNSVGLine.h" +#import + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGLine + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x1 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x1)]; + self.y1 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y1)]; + self.x2 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x2)]; + self.y2 = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y2)]; + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + _x1 = nil; + _y1 = nil; + _x2 = nil; + _y2 = nil; +} +#endif // RN_FABRIC_ENABLED + +- (void)setX1:(RNSVGLength *)x1 +{ + if ([x1 isEqualTo:_x1]) { + return; + } + [self invalidate]; + _x1 = x1; +} + +- (void)setY1:(RNSVGLength *)y1 +{ + if ([y1 isEqualTo:_y1]) { + return; + } + [self invalidate]; + _y1 = y1; +} + +- (void)setX2:(RNSVGLength *)x2 +{ + if ([x2 isEqualTo:_x2]) { + return; + } + [self invalidate]; + _x2 = x2; +} + +- (void)setY2:(RNSVGLength *)y2 +{ + if ([y2 isEqualTo:_y2]) { + return; + } + [self invalidate]; + _y2 = y2; +} + +- (CGPathRef)getPath:(CGContextRef)context +{ + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat x1 = [self relativeOnWidth:self.x1]; + CGFloat y1 = [self relativeOnHeight:self.y1]; + CGFloat x2 = [self relativeOnWidth:self.x2]; + CGFloat y2 = [self relativeOnHeight:self.y2]; + CGPathMoveToPoint(path, nil, x1, y1); + CGPathAddLineToPoint(path, nil, x2, y2); + + return (CGPathRef)CFAutorelease(path); +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGLineCls(void) +{ + return RNSVGLine.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Shapes/RNSVGRect.m b/apple/Shapes/RNSVGRect.m deleted file mode 100644 index 3e6ad2021..000000000 --- a/apple/Shapes/RNSVGRect.m +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RNSVGRect.h" -#import - -@implementation RNSVGRect - -- (void)setX:(RNSVGLength *)x -{ - if ([x isEqualTo:_x]) { - return; - } - [self invalidate]; - _x = x; -} - -- (void)setY:(RNSVGLength *)y -{ - if ([y isEqualTo:_y]) { - return; - } - [self invalidate]; - _y = y; -} - -- (void)setRectwidth:(RNSVGLength *)rectwidth -{ - if ([rectwidth isEqualTo:_rectwidth]) { - return; - } - [self invalidate]; - _rectwidth = rectwidth; -} - -- (void)setRectheight:(RNSVGLength *)rectheight -{ - if ([rectheight isEqualTo:_rectheight]) { - return; - } - [self invalidate]; - _rectheight = rectheight; -} - -- (void)setRx:(RNSVGLength *)rx -{ - if ([rx isEqualTo:_rx]) { - return; - } - [self invalidate]; - _rx = rx; -} - -- (void)setRy:(RNSVGLength *)ry -{ - if ([ry isEqualTo:_ry]) { - return; - } - [self invalidate]; - _ry = ry; -} - -- (CGPathRef)getPath:(CGContextRef)context -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGFloat x = [self relativeOnWidth:self.x]; - CGFloat y = [self relativeOnHeight:self.y]; - CGFloat width = [self relativeOnWidth:self.rectwidth]; - CGFloat height = [self relativeOnHeight:self.rectheight]; - - if (self.rx != nil || self.ry != nil) { - CGFloat rx = 0; - CGFloat ry = 0; - if (self.rx == nil) { - ry = [self relativeOnHeight:self.ry]; - rx = ry; - } else if (self.ry == nil) { - rx = [self relativeOnWidth:self.rx]; - ry = rx; - } else { - rx = [self relativeOnWidth:self.rx]; - ry = [self relativeOnHeight:self.ry]; - } - - if (rx > width / 2) { - rx = width / 2; - } - - if (ry > height / 2) { - ry = height / 2; - } - - CGPathAddRoundedRect(path, nil, CGRectMake(x, y, width, height), rx, ry); - } else { - CGPathAddRect(path, nil, CGRectMake(x, y, width, height)); - } - - return (CGPathRef)CFAutorelease(path); -} - -@end diff --git a/apple/Shapes/RNSVGRect.mm b/apple/Shapes/RNSVGRect.mm new file mode 100644 index 000000000..1c0c73516 --- /dev/null +++ b/apple/Shapes/RNSVGRect.mm @@ -0,0 +1,178 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNSVGRect.h" +#import + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGRect + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.x = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.x)]; + self.y = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.y)]; + if (RCTNSStringFromStringNilIfEmpty(newProps.rectheight)) { + self.rectheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.rectheight)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.rectwidth)) { + self.rectwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.rectwidth)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.height)) { + self.rectheight = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.height)]; + } + if (RCTNSStringFromStringNilIfEmpty(newProps.width)) { + self.rectwidth = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.width)]; + } + self.rx = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.rx)]; + self.ry = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.ry)]; + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + _x = nil; + _y = nil; + _rectwidth = nil; + _rectheight = nil; + _rx = nil; + _ry = nil; +} + +#endif // RN_FABRIC_ENABLED + +- (void)setX:(RNSVGLength *)x +{ + if ([x isEqualTo:_x]) { + return; + } + [self invalidate]; + _x = x; +} + +- (void)setY:(RNSVGLength *)y +{ + if ([y isEqualTo:_y]) { + return; + } + [self invalidate]; + _y = y; +} + +- (void)setRectwidth:(RNSVGLength *)rectwidth +{ + if ([rectwidth isEqualTo:_rectwidth]) { + return; + } + [self invalidate]; + _rectwidth = rectwidth; +} + +- (void)setRectheight:(RNSVGLength *)rectheight +{ + if ([rectheight isEqualTo:_rectheight]) { + return; + } + [self invalidate]; + _rectheight = rectheight; +} + +- (void)setRx:(RNSVGLength *)rx +{ + if ([rx isEqualTo:_rx]) { + return; + } + [self invalidate]; + _rx = rx; +} + +- (void)setRy:(RNSVGLength *)ry +{ + if ([ry isEqualTo:_ry]) { + return; + } + [self invalidate]; + _ry = ry; +} + +- (CGPathRef)getPath:(CGContextRef)context +{ + CGMutablePathRef path = CGPathCreateMutable(); + CGFloat x = [self relativeOnWidth:self.x]; + CGFloat y = [self relativeOnHeight:self.y]; + CGFloat width = [self relativeOnWidth:self.rectwidth]; + CGFloat height = [self relativeOnHeight:self.rectheight]; + + if (self.rx != nil || self.ry != nil) { + CGFloat rx = 0; + CGFloat ry = 0; + if (self.rx == nil) { + ry = [self relativeOnHeight:self.ry]; + rx = ry; + } else if (self.ry == nil) { + rx = [self relativeOnWidth:self.rx]; + ry = rx; + } else { + rx = [self relativeOnWidth:self.rx]; + ry = [self relativeOnHeight:self.ry]; + } + + if (rx > width / 2) { + rx = width / 2; + } + + if (ry > height / 2) { + ry = height / 2; + } + + CGPathAddRoundedRect(path, nil, CGRectMake(x, y, width, height), rx, ry); + } else { + CGPathAddRect(path, nil, CGRectMake(x, y, width, height)); + } + + return (CGPathRef)CFAutorelease(path); +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGRectCls(void) +{ + return RNSVGRect.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Text/RNSVGFontData.m b/apple/Text/RNSVGFontData.mm similarity index 98% rename from apple/Text/RNSVGFontData.m rename to apple/Text/RNSVGFontData.mm index 668cefcb1..248d82bf4 100644 --- a/apple/Text/RNSVGFontData.m +++ b/apple/Text/RNSVGFontData.mm @@ -133,7 +133,7 @@ + (instancetype)initWithNSDictionary:(NSDictionary *)font NSString* weight = fontWeight; NSInteger fw = RNSVGFontWeightFromString(weight); if (fw != -1) { - data->absoluteFontWeight = AbsoluteFontWeight(fw, parent); + data->absoluteFontWeight = AbsoluteFontWeight((RNSVGFontWeight)fw, parent); data->fontWeight = nearestFontWeight(data->absoluteFontWeight); } else if ([weight length] != 0) { [data handleNumericWeight:parent weight:[weight doubleValue]]; diff --git a/apple/Text/RNSVGGlyphContext.m b/apple/Text/RNSVGGlyphContext.mm similarity index 100% rename from apple/Text/RNSVGGlyphContext.m rename to apple/Text/RNSVGGlyphContext.mm diff --git a/apple/Text/RNSVGPropHelper.m b/apple/Text/RNSVGPropHelper.mm similarity index 100% rename from apple/Text/RNSVGPropHelper.m rename to apple/Text/RNSVGPropHelper.mm diff --git a/apple/Text/RNSVGTSpan.m b/apple/Text/RNSVGTSpan.mm similarity index 92% rename from apple/Text/RNSVGTSpan.m rename to apple/Text/RNSVGTSpan.mm index 0b7b2d15b..7f31892ca 100644 --- a/apple/Text/RNSVGTSpan.m +++ b/apple/Text/RNSVGTSpan.mm @@ -17,6 +17,14 @@ static NSCharacterSet *RNSVGTSpan_separators = nil; static CGFloat RNSVGTSpan_radToDeg = 180 / (CGFloat)M_PI; +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGTSpan { CGFloat startOffset; @@ -30,6 +38,80 @@ @implementation RNSVGTSpan RNSVGPathMeasure *measure; } +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + // textAnchor is in props of VM but not available on component + self.deltaX = createLengthArrayFromStrings(newProps.dx); + self.deltaY = createLengthArrayFromStrings(newProps.dy); + if (!newProps.positionX.empty()) { + self.positionX = createLengthArrayFromStrings(newProps.positionX); + } + if (!newProps.positionY.empty()) { + self.positionY = createLengthArrayFromStrings(newProps.positionY); + } + if (!newProps.x.empty()) { + self.positionX = createLengthArrayFromStrings(newProps.x); + } + if (!newProps.y.empty()) { + self.positionY = createLengthArrayFromStrings(newProps.y); + } + self.rotate = createLengthArrayFromStrings(newProps.rotate); + self.inlineSize = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.inlineSize)]; + self.textLength = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.textLength)]; + self.baselineShift = RCTNSStringFromStringNilIfEmpty(newProps.baselineShift); + self.lengthAdjust = RCTNSStringFromStringNilIfEmpty(newProps.lengthAdjust); + self.alignmentBaseline = RCTNSStringFromStringNilIfEmpty(newProps.alignmentBaseline); + self.content = RCTNSStringFromStringNilIfEmpty(newProps.content); + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + _content = nil; + + startOffset = 0; + textPath = nil; + cachedAdvance = 0; + // these crash, hopefully it is always released by here +// if (fontRef != nil) { +// CFRelease(fontRef); +// } + fontRef = nil; + firstX = 0; + firstY = 0; + + emoji = [NSMutableArray arrayWithCapacity:0]; + emojiTransform = [NSMutableArray arrayWithCapacity:0]; + measure = [[RNSVGPathMeasure alloc]init]; + RNSVGTSpan_separators = [NSCharacterSet whitespaceCharacterSet]; + +} +#endif // RN_FABRIC_ENABLED + - (id)init { self = [super init]; @@ -129,7 +211,7 @@ - (NSMutableDictionary *)getAttributes:(RNSVGFontData *)fontdata { [attrs setObject:kernAttr forKey:NSKernAttributeName]; } else -#endif +#endif // DTCORETEXT_SUPPORT_NS_ATTRIBUTES { [attrs setObject:kernAttr forKey:(id)kCTKernAttributeName]; } @@ -181,7 +263,7 @@ - (void)drawWrappedText:(CGContextRef)context gc:(RNSVGGlyphContext *)gc rect:(C label.numberOfLines = 0; #if !TARGET_OS_OSX // On macOS, views are transparent by default label.opaque = NO; -#endif +#endif // TARGET_OS_OSX label.font = font; label.textColor = [RNSVGColor colorWithCGColor:color]; @@ -441,7 +523,7 @@ vertical alternates (OpenType feature: vert) must be enabled. [attrs setObject:noAutoKern forKey:NSKernAttributeName]; } else -#endif +#endif // DTCORETEXT_SUPPORT_NS_ATTRIBUTES { [attrs setObject:noAutoKern forKey:(id)kCTKernAttributeName]; } @@ -867,7 +949,7 @@ A negative value is an error (see Error processing). CFArrayRef runs = CTLineGetGlyphRuns(line); CFIndex runEnd = CFArrayGetCount(runs); for (CFIndex ri = 0; ri < runEnd; ri++) { - CTRunRef run = CFArrayGetValueAtIndex(runs, ri); + CTRunRef run = (CTRunRef)CFArrayGetValueAtIndex(runs, ri); CFIndex runGlyphCount = CTRunGetGlyphCount(run); CFIndex indices[runGlyphCount]; CGSize advances[runGlyphCount]; @@ -876,11 +958,11 @@ A negative value is an error (see Error processing). // Grab the glyphs and font CTRunGetGlyphs(run, CFRangeMake(0, 0), glyphs); CTRunGetStringIndices(run, CFRangeMake(0, 0), indices); - CTFontRef runFont = CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName); + CTFontRef runFont = (CTFontRef)CFDictionaryGetValue(CTRunGetAttributes(run), kCTFontAttributeName); CTFontGetAdvancesForGlyphs(runFont, kCTFontOrientationHorizontal, glyphs, advances, runGlyphCount); CFIndex nextOrEndRunIndex = n; if (ri + 1 < runEnd) { - CTRunRef nextRun = CFArrayGetValueAtIndex(runs, ri + 1); + CTRunRef nextRun = (CTRunRef)CFArrayGetValueAtIndex(runs, ri + 1); CFIndex nextRunGlyphCount = CTRunGetGlyphCount(nextRun); CFIndex nextIndices[nextRunGlyphCount]; CTRunGetStringIndices(nextRun, CFRangeMake(0, 0), nextIndices); @@ -993,7 +1075,7 @@ A negative value is an error (see Error processing). #else label.text = currChars; label.opaque = NO; -#endif +#endif // TARGET_OS_OSX label.backgroundColor = RNSVGColor.clearColor; UIFont * customFont = [UIFont systemFontOfSize:fontSize]; @@ -1049,8 +1131,8 @@ - (void)setupTextPath:(CGContextRef)context while (parent) { if ([parent class] == [RNSVGTextPath class]) { textPath = (RNSVGTextPath*) parent; - RNSVGNode *template = [self.svgView getDefinedTemplate:textPath.href]; - path = [template getPath:context]; + RNSVGNode *definedTemplate = [self.svgView getDefinedTemplate:textPath.href]; + path = [definedTemplate getPath:context]; [measure extractPathData:path]; break; } else if (![parent isKindOfClass:[RNSVGText class]]) { @@ -1064,3 +1146,10 @@ - (void)setupTextPath:(CGContextRef)context } @end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGTSpanCls(void) +{ + return RNSVGTSpan.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Text/RNSVGText.m b/apple/Text/RNSVGText.mm similarity index 72% rename from apple/Text/RNSVGText.m rename to apple/Text/RNSVGText.mm index c92fc15a3..7173158df 100644 --- a/apple/Text/RNSVGText.m +++ b/apple/Text/RNSVGText.mm @@ -13,6 +13,14 @@ #import "RNSVGGlyphContext.h" #import "RNSVGTextProperties.h" +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + @implementation RNSVGText { RNSVGGlyphContext *_glyphContext; @@ -21,6 +29,76 @@ @implementation RNSVGText CGFloat cachedAdvance; } +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + // textAnchor is in props of VM but not available on component + self.deltaX = createLengthArrayFromStrings(newProps.dx); + self.deltaY = createLengthArrayFromStrings(newProps.dy); + if (!newProps.positionX.empty()){ + self.positionX = createLengthArrayFromStrings(newProps.positionX); + } + if (!newProps.positionY.empty()){ + self.positionY = createLengthArrayFromStrings(newProps.positionY); + } + if (!newProps.x.empty()){ + self.positionX = createLengthArrayFromStrings(newProps.x); + } + if (!newProps.y.empty()){ + self.positionY = createLengthArrayFromStrings(newProps.y); + } + self.rotate = createLengthArrayFromStrings(newProps.rotate); + self.inlineSize = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.inlineSize)]; + self.textLength = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.textLength)]; + self.baselineShift = RCTNSStringFromStringNilIfEmpty(newProps.baselineShift); + self.lengthAdjust = RCTNSStringFromStringNilIfEmpty(newProps.lengthAdjust); + self.alignmentBaseline = RCTNSStringFromStringNilIfEmpty(newProps.alignmentBaseline); + + setCommonGroupProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + _deltaX = nil; + _deltaY = nil; + _positionX = nil; + _positionY = nil; + _rotate = nil; + _inlineSize = nil; + _textLength = nil; + _baselineShift = nil; + _lengthAdjust = nil; + _alignmentBaseline = nil; + + _glyphContext = nil; + _alignmentBaseline = nil; + _baselineShift = nil; + cachedAdvance = 0; +} +#endif // RN_FABRIC_ENABLED + - (void)invalidate { if (self.dirty || self.merging) { @@ -302,3 +380,10 @@ - (CGFloat)getSubtreeTextChunksTotalAdvance } @end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGTextCls(void) +{ + return RNSVGText.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Text/RNSVGTextPath.m b/apple/Text/RNSVGTextPath.m deleted file mode 100644 index b9d1db477..000000000 --- a/apple/Text/RNSVGTextPath.m +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2015-present, Horcrux. - * All rights reserved. - * - * This source code is licensed under the MIT-style license found in the - * LICENSE file in the root directory of this source tree. - */ - - -#import "RNSVGTextPath.h" - -@implementation RNSVGTextPath - -- (void)setHref:(NSString *)href -{ - if ([href isEqualToString:_href]) { - return; - } - [self invalidate]; - _href = href; -} - -- (void)setSide:(NSString *)side -{ - if ([side isEqualToString:_side]) { - return; - } - [self invalidate]; - _side = side; -} - -- (void)setMethod:(NSString *)method -{ - if ([method isEqualToString:_method]) { - return; - } - [self invalidate]; - _method = method; -} - -- (void)setMidLine:(NSString *)midLine -{ - if ([midLine isEqualToString:_midLine]) { - return; - } - [self invalidate]; - _midLine = midLine; -} - -- (void)setSpacing:(NSString *)spacing -{ - if ([spacing isEqualToString:_spacing]) { - return; - } - [self invalidate]; - _spacing = spacing; -} - -- (void)setStartOffset:(RNSVGLength *)startOffset -{ - if ([startOffset isEqualTo:_startOffset]) { - return; - } - [self invalidate]; - _startOffset = startOffset; -} - -- (void)renderLayerTo:(CGContextRef)context rect:(CGRect)rect -{ - [self renderGroupTo:context rect:rect]; -} - -- (CGPathRef)getPath:(CGContextRef)context -{ - return [self getGroupPath:context]; -} - -- (void)pushGlyphContext -{ - // TextPath do not affect the glyphContext -} - -- (void)popGlyphContext -{ - // TextPath do not affect the glyphContext -} - -@end diff --git a/apple/Text/RNSVGTextPath.mm b/apple/Text/RNSVGTextPath.mm new file mode 100644 index 000000000..dabe1ac7e --- /dev/null +++ b/apple/Text/RNSVGTextPath.mm @@ -0,0 +1,149 @@ +/** + * Copyright (c) 2015-present, Horcrux. + * All rights reserved. + * + * This source code is licensed under the MIT-style license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import "RNSVGTextPath.h" + +#ifdef RN_FABRIC_ENABLED +#import +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" +#import +#import "RNSVGFabricConversions.h" +#endif // RN_FABRIC_ENABLED + +@implementation RNSVGTextPath + +#ifdef RN_FABRIC_ENABLED +using namespace facebook::react; + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + } + return self; +} + +#pragma mark - RCTComponentViewProtocol + ++ (ComponentDescriptorProvider)componentDescriptorProvider +{ + return concreteComponentDescriptorProvider(); +} + +- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps +{ + const auto &newProps = *std::static_pointer_cast(props); + + self.href = RCTNSStringFromStringNilIfEmpty(newProps.href); + self.side = RCTNSStringFromStringNilIfEmpty(newProps.side); + self.method = RCTNSStringFromStringNilIfEmpty(newProps.method); + self.midLine = RCTNSStringFromStringNilIfEmpty(newProps.midLine); + self.spacing = RCTNSStringFromStringNilIfEmpty(newProps.spacing); + self.startOffset = [RNSVGLength lengthWithString:RCTNSStringFromString(newProps.startOffset)]; + + setCommonRenderableProps(newProps, self); +} + +- (void)prepareForRecycle +{ + [super prepareForRecycle]; + + _href = nil; + _side = nil; + _method = nil; + _midLine = nil; + _spacing = nil; + _startOffset = nil; +} +#endif // RN_FABRIC_ENABLED + +- (void)setHref:(NSString *)href +{ + if ([href isEqualToString:_href]) { + return; + } + [self invalidate]; + _href = href; +} + +- (void)setSide:(NSString *)side +{ + if ([side isEqualToString:_side]) { + return; + } + [self invalidate]; + _side = side; +} + +- (void)setMethod:(NSString *)method +{ + if ([method isEqualToString:_method]) { + return; + } + [self invalidate]; + _method = method; +} + +- (void)setMidLine:(NSString *)midLine +{ + if ([midLine isEqualToString:_midLine]) { + return; + } + [self invalidate]; + _midLine = midLine; +} + +- (void)setSpacing:(NSString *)spacing +{ + if ([spacing isEqualToString:_spacing]) { + return; + } + [self invalidate]; + _spacing = spacing; +} + +- (void)setStartOffset:(RNSVGLength *)startOffset +{ + if ([startOffset isEqualTo:_startOffset]) { + return; + } + [self invalidate]; + _startOffset = startOffset; +} + +- (void)renderLayerTo:(CGContextRef)context rect:(CGRect)rect +{ + [self renderGroupTo:context rect:rect]; +} + +- (CGPathRef)getPath:(CGContextRef)context +{ + return [self getGroupPath:context]; +} + +- (void)pushGlyphContext +{ + // TextPath do not affect the glyphContext +} + +- (void)popGlyphContext +{ + // TextPath do not affect the glyphContext +} + +@end + +#ifdef RN_FABRIC_ENABLED +Class RNSVGTextPathCls(void) +{ + return RNSVGTextPath.class; +} +#endif // RN_FABRIC_ENABLED diff --git a/apple/Text/RNSVGTextProperties.h b/apple/Text/RNSVGTextProperties.h index 527ce3fba..c48f70e6f 100644 --- a/apple/Text/RNSVGTextProperties.h +++ b/apple/Text/RNSVGTextProperties.h @@ -124,7 +124,7 @@ static RNSVGFontWeight const RNSVGFontWeights[] = { NSString* RNSVGFontWeightToString( enum RNSVGFontWeight fw ); -enum RNSVGFontWeight RNSVGFontWeightFromString( NSString* s ); +NSInteger RNSVGFontWeightFromString( NSString* s ); typedef NS_ENUM(NSInteger, RNSVGTextAnchor) { RNSVGTextAnchorStart, diff --git a/apple/Text/RNSVGTextProperties.m b/apple/Text/RNSVGTextProperties.mm similarity index 93% rename from apple/Text/RNSVGTextProperties.m rename to apple/Text/RNSVGTextProperties.mm index a812d07fd..02476c6e1 100644 --- a/apple/Text/RNSVGTextProperties.m +++ b/apple/Text/RNSVGTextProperties.mm @@ -15,7 +15,7 @@ enum RNSVGAlignmentBaseline RNSVGAlignmentBaselineFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGAlignmentBaselineStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGAlignmentBaselineStrings[i]]) { - return i; + return (RNSVGAlignmentBaseline)i; } } return RNSVGAlignmentBaselineDEFAULT; @@ -36,7 +36,7 @@ enum RNSVGFontStyle RNSVGFontStyleFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGFontStyleStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGFontStyleStrings[i]]) { - return i; + return (RNSVGFontStyle)i; } } return RNSVGFontStyleDEFAULT; @@ -57,7 +57,7 @@ enum RNSVGFontVariantLigatures RNSVGFontVariantLigaturesFromString( NSString* s const NSUInteger l = sizeof(RNSVGFontVariantLigaturesStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGFontVariantLigaturesStrings[i]]) { - return i; + return (RNSVGFontVariantLigatures)i; } } return RNSVGFontVariantLigaturesDEFAULT; @@ -99,7 +99,7 @@ enum RNSVGTextAnchor RNSVGTextAnchorFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextAnchorStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextAnchorStrings[i]]) { - return i; + return (RNSVGTextAnchor)i; } } return RNSVGTextAnchorDEFAULT; @@ -120,7 +120,7 @@ enum RNSVGTextDecoration RNSVGTextDecorationFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextDecorationStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextDecorationStrings[i]]) { - return i; + return (RNSVGTextDecoration)i; } } return RNSVGTextDecorationDEFAULT; @@ -141,7 +141,7 @@ enum RNSVGTextLengthAdjust RNSVGTextLengthAdjustFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextLengthAdjustStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextLengthAdjustStrings[i]]) { - return i; + return (RNSVGTextLengthAdjust)i; } } return RNSVGTextLengthAdjustDEFAULT; @@ -162,7 +162,7 @@ enum RNSVGTextPathMethod RNSVGTextPathMethodFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextPathMethodStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextPathMethodStrings[i]]) { - return i; + return (RNSVGTextPathMethod)i; } } return RNSVGTextPathMethodDEFAULT; @@ -183,7 +183,7 @@ enum RNSVGTextPathMidLine RNSVGTextPathMidLineFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextPathMidLineStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextPathMidLineStrings[i]]) { - return i; + return (RNSVGTextPathMidLine)i; } } return RNSVGTextPathMidLineDEFAULT; @@ -204,7 +204,7 @@ enum RNSVGTextPathSide RNSVGTextPathSideFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextPathSideStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextPathSideStrings[i]]) { - return i; + return (RNSVGTextPathSide)i; } } return RNSVGTextPathSideDEFAULT; @@ -225,7 +225,7 @@ enum RNSVGTextPathSpacing RNSVGTextPathSpacingFromString( NSString* s ) const NSUInteger l = sizeof(RNSVGTextPathSpacingStrings) / sizeof(NSString*); for (NSUInteger i = 0; i < l; i++) { if ([s isEqualToString:RNSVGTextPathSpacingStrings[i]]) { - return i; + return (RNSVGTextPathSpacing)i; } } return RNSVGTextPathSpacingDEFAULT; diff --git a/apple/Text/RNSVGTopAlignedLabel.ios.m b/apple/Text/RNSVGTopAlignedLabel.ios.mm similarity index 100% rename from apple/Text/RNSVGTopAlignedLabel.ios.m rename to apple/Text/RNSVGTopAlignedLabel.ios.mm diff --git a/apple/Text/RNSVGTopAlignedLabel.macos.m b/apple/Text/RNSVGTopAlignedLabel.macos.mm similarity index 100% rename from apple/Text/RNSVGTopAlignedLabel.macos.m rename to apple/Text/RNSVGTopAlignedLabel.macos.mm diff --git a/apple/Utils/RCTConvert+RNSVG.m b/apple/Utils/RCTConvert+RNSVG.mm similarity index 96% rename from apple/Utils/RCTConvert+RNSVG.m rename to apple/Utils/RCTConvert+RNSVG.mm index ebb5392de..7cbbe5a35 100644 --- a/apple/Utils/RCTConvert+RNSVG.m +++ b/apple/Utils/RCTConvert+RNSVG.mm @@ -57,16 +57,22 @@ + (RNSVGBrush *)RNSVGBrush:(id)json } return [[RNSVGSolidColorBrush alloc] initWithArray:output]; } - NSArray *arr = [self NSArray:json]; - NSUInteger type = [self NSUInteger:arr.firstObject]; + NSDictionary *dict = [self NSDictionary:json]; + int type = [dict[@"type"] intValue]; switch (type) { case 0: // solid color // These are probably expensive allocations since it's often the same value. // We should memoize colors but look ups may be just as expensive. + { + NSArray *arr = @[@(0), dict[@"value"]]; return [[RNSVGSolidColorBrush alloc] initWithArray:arr]; + } case 1: // brush + { + NSArray *arr = @[@(1), dict[@"brushRef"]]; return [[RNSVGPainterBrush alloc] initWithArray:arr]; + } case 2: // currentColor return [[RNSVGBrush alloc] initWithArray:nil]; case 3: // context-fill @@ -77,6 +83,7 @@ + (RNSVGBrush *)RNSVGBrush:(id)json RCTLogError(@"Unknown brush type: %zd", (unsigned long)type); return nil; } + } + (RNSVGPathParser *)RNSVGCGPath:(NSString *)d diff --git a/apple/Utils/RNSVGBezierElement.m b/apple/Utils/RNSVGBezierElement.mm similarity index 100% rename from apple/Utils/RNSVGBezierElement.m rename to apple/Utils/RNSVGBezierElement.mm diff --git a/apple/Utils/RNSVGFabricConversions.h b/apple/Utils/RNSVGFabricConversions.h new file mode 100644 index 000000000..822f2f986 --- /dev/null +++ b/apple/Utils/RNSVGFabricConversions.h @@ -0,0 +1,178 @@ +#import "RNSVGPainterBrush.h" +#import "RNSVGSolidColorBrush.h" +#import "RNSVGContextBrush.h" +#import "RNSVGRenderable.h" +#import "RNSVGLength.h" +#import "RNSVGVBMOS.h" +#import "RNSVGGroup.h" + +#import "RCTFabricComponentsPlugins.h" +#import "RCTConversions.h" + +template +RNSVGBrush *brushFromColorStruct(T fillObject) +{ + int type = fillObject.type; + + switch (type) { + case -1: // empty struct + return nil; + case 0: // solid color + { + // These are probably expensive allocations since it's often the same value. + // We should memoize colors but look ups may be just as expensive. + RNSVGColor *color = RCTUIColorFromSharedColor(fillObject.value) ?: [RNSVGColor clearColor]; + return [[RNSVGSolidColorBrush alloc] initWithColor:color]; + } + case 1: // brush + { + NSArray *arr = @[@(type), RCTNSStringFromString(fillObject.brushRef)]; + return [[RNSVGPainterBrush alloc] initWithArray:arr]; + } + case 2: // currentColor + return [[RNSVGBrush alloc] initWithArray:nil]; + case 3: // context-fill + return [[RNSVGContextBrush alloc] initFill]; + case 4: // context-stroke + return [[RNSVGContextBrush alloc] initStroke]; + default: + RCTLogError(@"Unknown brush type: %d", type); + return nil; + } +} + +template +void setCommonNodeProps(T nodeProps, RNSVGNode *node) +{ + node.name = RCTNSStringFromStringNilIfEmpty(nodeProps.name); + node.opacity = nodeProps.opacity; + if (nodeProps.matrix.size() == 6) { + node.matrix = CGAffineTransformMake(nodeProps.matrix.at(0), nodeProps.matrix.at(1), nodeProps.matrix.at(2), nodeProps.matrix.at(3), nodeProps.matrix.at(4), nodeProps.matrix.at(5)); + } + CATransform3D transform3d = RCTCATransform3DFromTransformMatrix(nodeProps.transform); + CGAffineTransform transform = CATransform3DGetAffineTransform(transform3d); + node.invTransform = CGAffineTransformInvert(transform); + node.transforms = transform; + node.mask = RCTNSStringFromStringNilIfEmpty(nodeProps.mask); + node.markerStart = RCTNSStringFromStringNilIfEmpty(nodeProps.markerStart); + node.markerMid = RCTNSStringFromStringNilIfEmpty(nodeProps.markerMid); + node.markerEnd = RCTNSStringFromStringNilIfEmpty(nodeProps.markerEnd); + node.clipPath = RCTNSStringFromStringNilIfEmpty(nodeProps.clipPath); + node.clipRule = nodeProps.clipRule == 0 ? kRNSVGCGFCRuleEvenodd : kRNSVGCGFCRuleNonzero; + node.responsible = nodeProps.responsible; + // onLayout + node.display = RCTNSStringFromStringNilIfEmpty(nodeProps.display); + switch (nodeProps.pointerEvents) { + case facebook::react::PointerEventsMode::Auto: + node.pointerEvents = RCTPointerEventsUnspecified; + case facebook::react::PointerEventsMode::None: + node.pointerEvents = RCTPointerEventsNone; + case facebook::react::PointerEventsMode::BoxNone: + node.pointerEvents = RCTPointerEventsBoxNone; + case facebook::react::PointerEventsMode::BoxOnly: + node.pointerEvents = RCTPointerEventsBoxOnly; + default: + node.pointerEvents = RCTPointerEventsUnspecified; + } +} + +static NSMutableArray *createLengthArrayFromStrings(std::vector stringArray) { + if (stringArray.empty()) { + return nil; + } + NSMutableArray *lengthArray = [NSMutableArray new]; + for (auto str : stringArray) { + RNSVGLength *lengthFromString = [RNSVGLength lengthWithString:RCTNSStringFromString(str)]; + [lengthArray addObject:lengthFromString]; + } + return lengthArray; +} + +template +void setCommonRenderableProps(T renderableProps, RNSVGRenderable *renderableNode) +{ + setCommonNodeProps(renderableProps, renderableNode); + renderableNode.fill = brushFromColorStruct(renderableProps.fill); + renderableNode.fillOpacity = renderableProps.fillOpacity; + renderableNode.fillRule = renderableProps.fillRule == 0 ? kRNSVGCGFCRuleEvenodd : kRNSVGCGFCRuleNonzero; + renderableNode.stroke = brushFromColorStruct(renderableProps.stroke); + renderableNode.strokeOpacity = renderableProps.strokeOpacity; + renderableNode.strokeWidth = [RNSVGLength lengthWithString:RCTNSStringFromString(renderableProps.strokeWidth)]; + renderableNode.strokeLinecap = renderableProps.strokeLinecap == 0 ? kCGLineCapButt : renderableProps.strokeLinecap == 1 ? kCGLineCapRound : kCGLineCapSquare; + renderableNode.strokeLinejoin = renderableProps.strokeLinejoin == 0 ? kCGLineJoinMiter : renderableProps.strokeLinejoin == 1 ? kCGLineJoinRound : kCGLineJoinBevel; + renderableNode.strokeDasharray = createLengthArrayFromStrings(renderableProps.strokeDasharray); + renderableNode.strokeDashoffset = renderableProps.strokeDashoffset; + renderableNode.strokeMiterlimit = renderableProps.strokeMiterlimit; + renderableNode.vectorEffect = renderableProps.vectorEffect == 0 ? kRNSVGVectorEffectDefault : renderableProps.vectorEffect == 1 ? kRNSVGVectorEffectNonScalingStroke : renderableProps.vectorEffect == 2 ? kRNSVGVectorEffectInherit : kRNSVGVectorEffectUri; + if (renderableProps.propList.size() > 0) { + NSMutableArray *propArray = [NSMutableArray new]; + for (auto str : renderableProps.propList) { + [propArray addObject:RCTNSStringFromString(str)]; + } + renderableNode.propList = propArray; + } +} + +static void addValueToDict(NSMutableDictionary *dict, std::string value, NSString *key) +{ + NSString *valueOrNil = RCTNSStringFromStringNilIfEmpty(value); + if (valueOrNil) { + dict[key] = valueOrNil; + } +} + +template +NSDictionary *parseFontStruct(T fontStruct) +{ + NSMutableDictionary *fontDict = [NSMutableDictionary new]; + + // TODO: do it better maybe + addValueToDict(fontDict, fontStruct.fontStyle, @"fontStyle"); + addValueToDict(fontDict, fontStruct.fontVariant, @"fontVariant"); + addValueToDict(fontDict, fontStruct.fontWeight, @"fontWeight"); + addValueToDict(fontDict, fontStruct.fontStretch, @"fontStretch"); + addValueToDict(fontDict, fontStruct.fontSize, @"fontSize"); + addValueToDict(fontDict, fontStruct.fontFamily, @"fontFamily"); + addValueToDict(fontDict, fontStruct.textAnchor, @"textAnchor"); + addValueToDict(fontDict, fontStruct.textDecoration, @"textDecoration"); + addValueToDict(fontDict, fontStruct.letterSpacing, @"letterSpacing"); + addValueToDict(fontDict, fontStruct.wordSpacing, @"wordSpacing"); + addValueToDict(fontDict, fontStruct.kerning, @"kerning"); + addValueToDict(fontDict, fontStruct.fontFeatureSettings, @"fontFeatureSettings"); + addValueToDict(fontDict, fontStruct.fontVariantLigatures, @"fontVariantLigatures"); + addValueToDict(fontDict, fontStruct.fontVariationSettings, @"fontVariationSettings"); + return [NSDictionary dictionaryWithDictionary:fontDict]; +} + +template +void setCommonGroupProps(T groupProps, RNSVGGroup *groupNode) +{ + setCommonRenderableProps(groupProps, groupNode); + + if (RCTNSStringFromStringNilIfEmpty(groupProps.fontSize)) { + groupNode.font = @{ @"fontSize": RCTNSStringFromString(groupProps.fontSize) }; + } + if (RCTNSStringFromStringNilIfEmpty(groupProps.fontWeight)) { + groupNode.font = @{ @"fontWeight": RCTNSStringFromString(groupProps.fontWeight) }; + } + NSDictionary *fontDict = parseFontStruct(groupProps.font); + if (groupNode.font == nil || fontDict.count > 0) { + // some of text's rendering logic requires that `font` is not nil so we always set it + // even if to an empty dict + groupNode.font = fontDict; + } +} + +static RNSVGVBMOS intToRNSVGVBMOS(int value) +{ + switch (value) { + case 0: + return kRNSVGVBMOSMeet; + case 1: + return kRNSVGVBMOSSlice; + case 2: + return kRNSVGVBMOSNone; + default: + return kRNSVGVBMOSMeet; + } +} diff --git a/apple/Utils/RNSVGLength.m b/apple/Utils/RNSVGLength.mm similarity index 100% rename from apple/Utils/RNSVGLength.m rename to apple/Utils/RNSVGLength.mm diff --git a/apple/Utils/RNSVGMarkerPosition.m b/apple/Utils/RNSVGMarkerPosition.mm similarity index 100% rename from apple/Utils/RNSVGMarkerPosition.m rename to apple/Utils/RNSVGMarkerPosition.mm diff --git a/apple/Utils/RNSVGPathMeasure.m b/apple/Utils/RNSVGPathMeasure.mm similarity index 100% rename from apple/Utils/RNSVGPathMeasure.m rename to apple/Utils/RNSVGPathMeasure.mm diff --git a/apple/Utils/RNSVGPathParser.m b/apple/Utils/RNSVGPathParser.mm similarity index 100% rename from apple/Utils/RNSVGPathParser.m rename to apple/Utils/RNSVGPathParser.mm diff --git a/apple/Utils/RNSVGViewBox.m b/apple/Utils/RNSVGViewBox.mm similarity index 100% rename from apple/Utils/RNSVGViewBox.m rename to apple/Utils/RNSVGViewBox.mm diff --git a/apple/ViewManagers/RNSVGCircleManager.m b/apple/ViewManagers/RNSVGCircleManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGCircleManager.m rename to apple/ViewManagers/RNSVGCircleManager.mm diff --git a/apple/ViewManagers/RNSVGClipPathManager.m b/apple/ViewManagers/RNSVGClipPathManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGClipPathManager.m rename to apple/ViewManagers/RNSVGClipPathManager.mm diff --git a/apple/ViewManagers/RNSVGDefsManager.m b/apple/ViewManagers/RNSVGDefsManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGDefsManager.m rename to apple/ViewManagers/RNSVGDefsManager.mm diff --git a/apple/ViewManagers/RNSVGEllipseManager.m b/apple/ViewManagers/RNSVGEllipseManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGEllipseManager.m rename to apple/ViewManagers/RNSVGEllipseManager.mm diff --git a/apple/ViewManagers/RNSVGForeignObjectManager.m b/apple/ViewManagers/RNSVGForeignObjectManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGForeignObjectManager.m rename to apple/ViewManagers/RNSVGForeignObjectManager.mm diff --git a/apple/ViewManagers/RNSVGGroupManager.m b/apple/ViewManagers/RNSVGGroupManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGGroupManager.m rename to apple/ViewManagers/RNSVGGroupManager.mm diff --git a/apple/ViewManagers/RNSVGImageManager.m b/apple/ViewManagers/RNSVGImageManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGImageManager.m rename to apple/ViewManagers/RNSVGImageManager.mm diff --git a/apple/ViewManagers/RNSVGLineManager.m b/apple/ViewManagers/RNSVGLineManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGLineManager.m rename to apple/ViewManagers/RNSVGLineManager.mm diff --git a/apple/ViewManagers/RNSVGLinearGradientManager.m b/apple/ViewManagers/RNSVGLinearGradientManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGLinearGradientManager.m rename to apple/ViewManagers/RNSVGLinearGradientManager.mm diff --git a/apple/ViewManagers/RNSVGMarkerManager.m b/apple/ViewManagers/RNSVGMarkerManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGMarkerManager.m rename to apple/ViewManagers/RNSVGMarkerManager.mm diff --git a/apple/ViewManagers/RNSVGMaskManager.m b/apple/ViewManagers/RNSVGMaskManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGMaskManager.m rename to apple/ViewManagers/RNSVGMaskManager.mm diff --git a/apple/ViewManagers/RNSVGNodeManager.m b/apple/ViewManagers/RNSVGNodeManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGNodeManager.m rename to apple/ViewManagers/RNSVGNodeManager.mm diff --git a/apple/ViewManagers/RNSVGPathManager.m b/apple/ViewManagers/RNSVGPathManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGPathManager.m rename to apple/ViewManagers/RNSVGPathManager.mm diff --git a/apple/ViewManagers/RNSVGPatternManager.m b/apple/ViewManagers/RNSVGPatternManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGPatternManager.m rename to apple/ViewManagers/RNSVGPatternManager.mm diff --git a/apple/ViewManagers/RNSVGRadialGradientManager.m b/apple/ViewManagers/RNSVGRadialGradientManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGRadialGradientManager.m rename to apple/ViewManagers/RNSVGRadialGradientManager.mm diff --git a/apple/ViewManagers/RNSVGRectManager.m b/apple/ViewManagers/RNSVGRectManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGRectManager.m rename to apple/ViewManagers/RNSVGRectManager.mm diff --git a/apple/ViewManagers/RNSVGRenderableManager.m b/apple/ViewManagers/RNSVGRenderableManager.mm similarity index 88% rename from apple/ViewManagers/RNSVGRenderableManager.m rename to apple/ViewManagers/RNSVGRenderableManager.mm index 0801a2dee..9a11f5267 100644 --- a/apple/ViewManagers/RNSVGRenderableManager.m +++ b/apple/ViewManagers/RNSVGRenderableManager.mm @@ -40,10 +40,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isPointInFill:(nonnull NSNumber *)reactTag options:(NSDictionary *)options) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return [NSNumber numberWithBool:false]; @@ -70,10 +68,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(isPointInStroke:(nonnull NSNumber *)reactTag options:(NSDictionary *)options) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return [NSNumber numberWithBool:false]; @@ -100,10 +96,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getTotalLength:(nonnull NSNumber *)reactTag) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return [NSNumber numberWithDouble:0]; @@ -119,10 +113,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getPointAtLength:(nonnull NSNumber *)reactTag options:(NSDictionary *)options) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return nil; @@ -149,10 +141,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getBBox:(nonnull NSNumber *)reactTag options:(NSDictionary *)options) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return nil; @@ -195,10 +185,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getCTM:(nonnull NSNumber *)reactTag) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return nil; @@ -218,10 +206,8 @@ - (RNSVGRenderable *)node RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getScreenCTM:(nonnull NSNumber *)reactTag) { - __block RNSVGPlatformView *view; - dispatch_sync(dispatch_get_main_queue(), ^{ - view = [self.bridge.uiManager viewForReactTag:reactTag]; - }); + RNSVGPlatformView *view = [self getRenderableView:reactTag]; + if (![view isKindOfClass:[RNSVGRenderable class]]) { RCTLogError(@"Invalid svg returned from registry, expecting RNSVGRenderable, got: %@", view); return nil; @@ -239,6 +225,12 @@ - (RNSVGRenderable *)node }; } -@end - +- (RNSVGPlatformView *)getRenderableView:(NSNumber *)reactTag { + __block RNSVGPlatformView *view; + dispatch_sync(dispatch_get_main_queue(), ^{ + view = [self.bridge.uiManager viewForReactTag:reactTag]; + }); + return view; +} +@end diff --git a/apple/ViewManagers/RNSVGSvgViewManager.m b/apple/ViewManagers/RNSVGSvgViewManager.mm similarity index 93% rename from apple/ViewManagers/RNSVGSvgViewManager.m rename to apple/ViewManagers/RNSVGSvgViewManager.mm index d56adf390..0dda5001c 100644 --- a/apple/ViewManagers/RNSVGSvgViewManager.m +++ b/apple/ViewManagers/RNSVGSvgViewManager.mm @@ -40,8 +40,8 @@ - (RNSVGView *)view - (void)toDataURL:(nonnull NSNumber *)reactTag options:(NSDictionary *)options callback:(RCTResponseSenderBlock)callback attempt:(int)attempt { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { - __kindof RNSVGView *view = viewRegistry[reactTag]; + [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { + __kindof RNSVGPlatformView *view = [uiManager viewForReactTag:reactTag]; NSString * b64; if ([view isKindOfClass:[RNSVGSvgView class]]) { RNSVGSvgView *svg = view; @@ -64,7 +64,7 @@ - (void)toDataURL:(nonnull NSNumber *)reactTag options:(NSDictionary *)options c b64 = [svg getDataURLwithBounds:bounds]; } } else { - RCTLogError(@"Invalid svg returned frin registry, expecting RNSVGSvgView, got: %@", view); + RCTLogError(@"Invalid svg returned from registry, expecting RNSVGSvgView, got: %@", view); return; } if (b64) { diff --git a/apple/ViewManagers/RNSVGSymbolManager.h b/apple/ViewManagers/RNSVGSymbolManager.h index 600134443..0123f18f0 100644 --- a/apple/ViewManagers/RNSVGSymbolManager.h +++ b/apple/ViewManagers/RNSVGSymbolManager.h @@ -6,8 +6,8 @@ * LICENSE file in the root directory of this source tree. */ -#import "RNSVGNodeManager.h" +#import "RNSVGGroupManager.h" -@interface RNSVGSymbolManager : RNSVGNodeManager +@interface RNSVGSymbolManager : RNSVGGroupManager @end diff --git a/apple/ViewManagers/RNSVGSymbolManager.m b/apple/ViewManagers/RNSVGSymbolManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGSymbolManager.m rename to apple/ViewManagers/RNSVGSymbolManager.mm diff --git a/apple/ViewManagers/RNSVGTSpanManager.m b/apple/ViewManagers/RNSVGTSpanManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGTSpanManager.m rename to apple/ViewManagers/RNSVGTSpanManager.mm diff --git a/apple/ViewManagers/RNSVGTextManager.m b/apple/ViewManagers/RNSVGTextManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGTextManager.m rename to apple/ViewManagers/RNSVGTextManager.mm diff --git a/apple/ViewManagers/RNSVGTextPathManager.m b/apple/ViewManagers/RNSVGTextPathManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGTextPathManager.m rename to apple/ViewManagers/RNSVGTextPathManager.mm diff --git a/apple/ViewManagers/RNSVGUseManager.m b/apple/ViewManagers/RNSVGUseManager.mm similarity index 100% rename from apple/ViewManagers/RNSVGUseManager.m rename to apple/ViewManagers/RNSVGUseManager.mm diff --git a/package.json b/package.json index 394ff9169..27dbde721 100644 --- a/package.json +++ b/package.json @@ -96,5 +96,14 @@ "ts-node": "^10.8.0", "typescript": "^4.7.2" }, - "nativePackage": true + "nativePackage": true, + "codegenConfig": { + "libraries": [ + { + "name": "rnsvg", + "type": "components", + "jsSrcsDir": "./src/fabric" + } + ] + } } diff --git a/src/elements/Circle.tsx b/src/elements/Circle.tsx index 64c3ee668..b850e9864 100644 --- a/src/elements/Circle.tsx +++ b/src/elements/Circle.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { extract } from '../lib/extract/extractProps'; +import { extract, stringifyPropsForFabric } from '../lib/extract/extractProps'; import { CommonPathProps, NumberProp } from '../lib/extract/types'; import Shape from './Shape'; import { RNSVGCircle } from './NativeComponents'; @@ -23,7 +23,10 @@ export default class Circle extends Shape { render() { const { props } = this; const { cx, cy, r } = props; - const circleProps = { ...extract(this, props), cx, cy, r }; + const circleProps = { + ...extract(this, props), + ...stringifyPropsForFabric({ cx, cy, r }), + }; return ; } diff --git a/src/elements/Ellipse.tsx b/src/elements/Ellipse.tsx index c278c679a..55c176db7 100644 --- a/src/elements/Ellipse.tsx +++ b/src/elements/Ellipse.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { extract } from '../lib/extract/extractProps'; +import { extract, stringifyPropsForFabric } from '../lib/extract/extractProps'; import { CommonPathProps, NumberProp } from '../lib/extract/types'; import Shape from './Shape'; import { RNSVGEllipse } from './NativeComponents'; @@ -25,7 +25,10 @@ export default class Ellipse extends Shape { render() { const { props } = this; const { cx, cy, rx, ry } = props; - const ellipseProps = { ...extract(this, props), cx, cy, rx, ry }; + const ellipseProps = { + ...extract(this, props), + ...stringifyPropsForFabric({ cx, cy, rx, ry }), + }; return ; } } diff --git a/src/elements/ForeignObject.tsx b/src/elements/ForeignObject.tsx index eb35bd829..fba552651 100644 --- a/src/elements/ForeignObject.tsx +++ b/src/elements/ForeignObject.tsx @@ -1,5 +1,8 @@ import React, { ReactNode } from 'react'; -import { withoutXY } from '../lib/extract/extractProps'; +import { + withoutXY, + stringifyPropsForFabric, +} from '../lib/extract/extractProps'; import { NumberProp } from '../lib/extract/types'; import G from './G'; import { RNSVGForeignObject } from './NativeComponents'; @@ -25,7 +28,7 @@ export default class ForeignObject extends G { render() { const { props } = this; const { x, y, width, height, children } = props; - const foreignObjectProps = { x, y, width, height }; + const foreignObjectProps = stringifyPropsForFabric({ x, y, width, height }); return ( extends Shape { if (matrix) { props.matrix = matrix; } - this.root && this.root.setNativeProps(props); + this.root?.setNativeProps(props); }; render() { diff --git a/src/elements/Image.tsx b/src/elements/Image.tsx index 72806dc2c..bb1b1994e 100644 --- a/src/elements/Image.tsx +++ b/src/elements/Image.tsx @@ -1,7 +1,10 @@ import React from 'react'; import { Image, ImageProps as RNImageProps } from 'react-native'; import { alignEnum, meetOrSliceTypes } from '../lib/extract/extractViewBox'; -import { withoutXY } from '../lib/extract/extractProps'; +import { + stringifyPropsForFabric, + withoutXY, +} from '../lib/extract/extractProps'; import { ClipProps, CommonMaskProps, @@ -61,11 +64,14 @@ export default class SvgImage extends Shape { const align = modes[0]; const meetOrSlice: 'meet' | 'slice' | 'none' | string | undefined = modes[1]; - const imageProps = { + const stringifiedImageProps = stringifyPropsForFabric({ x, y, width, height, + }); + const imageProps = { + ...stringifiedImageProps, meetOrSlice: meetOrSliceTypes[meetOrSlice] || 0, align: alignEnum[align] || 'xMidYMid', src: !href diff --git a/src/elements/Line.tsx b/src/elements/Line.tsx index e9de09157..bb0160cf7 100644 --- a/src/elements/Line.tsx +++ b/src/elements/Line.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { extract } from '../lib/extract/extractProps'; +import { extract, stringifyPropsForFabric } from '../lib/extract/extractProps'; import { CommonPathProps, NumberProp } from '../lib/extract/types'; import Shape from './Shape'; import { RNSVGLine } from './NativeComponents'; @@ -25,7 +25,10 @@ export default class Line extends Shape { render() { const { props } = this; const { x1, y1, x2, y2 } = props; - const lineProps = { ...extract(this, props), x1, y1, x2, y2 }; + const lineProps = { + ...extract(this, props), + ...stringifyPropsForFabric({ x1, y1, x2, y2 }), + }; return ; } } diff --git a/src/elements/LinearGradient.tsx b/src/elements/LinearGradient.tsx index 89fe2eea8..88793138f 100644 --- a/src/elements/LinearGradient.tsx +++ b/src/elements/LinearGradient.tsx @@ -7,6 +7,7 @@ import { } from '../lib/extract/types'; import Shape from './Shape'; import { RNSVGLinearGradient } from './NativeComponents'; +import { stringifyPropsForFabric } from '../lib/extract/extractProps'; export interface LinearGradientProps { children?: ReactElement[]; @@ -32,7 +33,7 @@ export default class LinearGradient extends Shape { render() { const { props } = this; const { x1, y1, x2, y2 } = props; - const linearGradientProps = { x1, y1, x2, y2 }; + const linearGradientProps = stringifyPropsForFabric({ x1, y1, x2, y2 }); return ( { markerHeight, children, } = props; - const markerProps = { + const markerProps = stringifyPropsForFabric({ name: id, refX, refY, @@ -55,7 +56,7 @@ export default class Marker extends Shape { orient: String(orient), markerWidth, markerHeight, - }; + }); return ( { maskContentUnits, children, } = props; - const maskProps = { + const strigifiedMaskProps = stringifyPropsForFabric({ x, y, width, height, + }); + const maskProps = { maskTransform: extractTransform(maskTransform || transform || props), maskUnits: maskUnits !== undefined ? units[maskUnits] : 0, maskContentUnits: @@ -61,6 +66,7 @@ export default class Mask extends Shape { {children} diff --git a/src/elements/Pattern.tsx b/src/elements/Pattern.tsx index 41439ad18..0746cd5f0 100644 --- a/src/elements/Pattern.tsx +++ b/src/elements/Pattern.tsx @@ -10,6 +10,7 @@ import { import units from '../lib/units'; import Shape from './Shape'; import { RNSVGPattern } from './NativeComponents'; +import { stringifyPropsForFabric } from '../lib/extract/extractProps'; export interface PatternProps { children?: ReactNode; @@ -53,12 +54,14 @@ export default class Pattern extends Shape { preserveAspectRatio, } = props; const matrix = extractTransform(patternTransform || transform || props); - const patternProps = { - name: id, + const strigifiedPatternProps = stringifyPropsForFabric({ x, y, width, height, + }); + const patternProps = { + name: id, matrix, patternTransform: matrix, patternUnits: (patternUnits && units[patternUnits]) || 0, @@ -67,6 +70,7 @@ export default class Pattern extends Shape { return ( diff --git a/src/elements/RadialGradient.tsx b/src/elements/RadialGradient.tsx index 841223296..6925bc1ed 100644 --- a/src/elements/RadialGradient.tsx +++ b/src/elements/RadialGradient.tsx @@ -7,6 +7,7 @@ import { } from '../lib/extract/types'; import Shape from './Shape'; import { RNSVGRadialGradient } from './NativeComponents'; +import { stringifyPropsForFabric } from '../lib/extract/extractProps'; export interface RadialGradientProps { children?: ReactElement[]; @@ -34,14 +35,14 @@ export default class RadialGradient extends Shape { render() { const { props } = this; const { rx, ry, r, cx, cy, fx = cx, fy = cy } = props; - const radialGradientProps = { + const radialGradientProps = stringifyPropsForFabric({ fx, fy, rx: rx || r, ry: ry || r, cx, cy, - }; + }); return ( { render() { const { props } = this; const { x, y, width, height, rx, ry } = props; - const rectProps = { x, y, width, height, rx, ry }; + const rectProps = stringifyPropsForFabric({ x, y, width, height, rx, ry }); return ( { ) => { const { width, height } = props; if (width) { - props.bbWidth = width; + props.bbWidth = String(width); } if (height) { - props.bbHeight = height; + props.bbHeight = String(height); } const { root } = this; root && root.setNativeProps(props); @@ -168,10 +168,10 @@ export default class Svg extends Shape { props.style = rootStyles.length > 1 ? rootStyles : defaultStyle; if (width != null) { - props.bbWidth = width; + props.bbWidth = String(width); } if (height != null) { - props.bbHeight = height; + props.bbHeight = String(height); } extractResponder(props, props, this as ResponderInstanceProps); diff --git a/src/elements/TextPath.tsx b/src/elements/TextPath.tsx index 4adfc260b..d5e9ecdf1 100644 --- a/src/elements/TextPath.tsx +++ b/src/elements/TextPath.tsx @@ -70,7 +70,7 @@ export default class TextPath extends Shape { ), { href: match, - startOffset, + startOffset: startOffset === null ? null : String(startOffset), method, spacing, side, diff --git a/src/elements/Use.tsx b/src/elements/Use.tsx index 0517b6760..904f3fced 100644 --- a/src/elements/Use.tsx +++ b/src/elements/Use.tsx @@ -1,5 +1,8 @@ import React, { ReactNode } from 'react'; -import { withoutXY } from '../lib/extract/extractProps'; +import { + stringifyPropsForFabric, + withoutXY, +} from '../lib/extract/extractProps'; import { CommonPathProps, NumberProp } from '../lib/extract/types'; import { idPattern } from '../lib/util'; import Shape from './Shape'; @@ -48,13 +51,13 @@ export default class Use extends Shape { '"', ); } - const useProps = { + const useProps = stringifyPropsForFabric({ href: match, x, y, width, height, - }; + }); return ( {children} diff --git a/src/fabric/CircleNativeComponent.js b/src/fabric/CircleNativeComponent.js new file mode 100644 index 000000000..d93feabf3 --- /dev/null +++ b/src/fabric/CircleNativeComponent.js @@ -0,0 +1,71 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + cx?: string, + cy?: string, + r?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGCircle', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/ClipPathNativeComponent.js b/src/fabric/ClipPathNativeComponent.js new file mode 100644 index 000000000..5b16a46ce --- /dev/null +++ b/src/fabric/ClipPathNativeComponent.js @@ -0,0 +1,44 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGClipPath', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/DefsNativeComponent.js b/src/fabric/DefsNativeComponent.js new file mode 100644 index 000000000..058344840 --- /dev/null +++ b/src/fabric/DefsNativeComponent.js @@ -0,0 +1,16 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; + +type NativeProps = $ReadOnly<{| + ...ViewProps, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGDefs', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/EllipseNativeComponent.js b/src/fabric/EllipseNativeComponent.js new file mode 100644 index 000000000..02aaf906c --- /dev/null +++ b/src/fabric/EllipseNativeComponent.js @@ -0,0 +1,72 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + cx?: string, + cy?: string, + rx?: string, + ry?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGEllipse', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/ForeignObjectNativeComponent.js b/src/fabric/ForeignObjectNativeComponent.js new file mode 100644 index 000000000..2a28d92d9 --- /dev/null +++ b/src/fabric/ForeignObjectNativeComponent.js @@ -0,0 +1,102 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; + +import type { + DirectEventHandler, +} from 'react-native/Libraries/Types/CodegenTypes'; + +// for some reason the parser doesn't allow to put flow types in another file +// import type { SvgNodeCommonProps } from './svgNodeCommonProps'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + x?: string, + y?: string, + foreignObjectheight?: string, + foreignObjectwidth?: string, + height?: string, + width?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGForeignObject', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/GroupNativeComponent.js b/src/fabric/GroupNativeComponent.js new file mode 100644 index 000000000..400058410 --- /dev/null +++ b/src/fabric/GroupNativeComponent.js @@ -0,0 +1,96 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; + +import type { + DirectEventHandler, +} from 'react-native/Libraries/Types/CodegenTypes'; + +// for some reason the parser doesn't allow to put flow types in another file +// import type { SvgNodeCommonProps } from './svgNodeCommonProps'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGGroup', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/ImageNativeComponent.js b/src/fabric/ImageNativeComponent.js new file mode 100644 index 000000000..a48f4a209 --- /dev/null +++ b/src/fabric/ImageNativeComponent.js @@ -0,0 +1,77 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + x?: string; + y?: string; + imagewidth?: string; + imageheight?: string; + width?: string; + height?: string; + src?: ImageSource; + align?: string; + meetOrSlice?: Int32; +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGImage', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/LineNativeComponent.js b/src/fabric/LineNativeComponent.js new file mode 100644 index 000000000..678129c68 --- /dev/null +++ b/src/fabric/LineNativeComponent.js @@ -0,0 +1,72 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + x1?: string, + y1?: string, + x2?: string, + y2?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGLine', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/LinearGradientNativeComponent.js b/src/fabric/LinearGradientNativeComponent.js new file mode 100644 index 000000000..67e47d032 --- /dev/null +++ b/src/fabric/LinearGradientNativeComponent.js @@ -0,0 +1,53 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type Units = 'userSpaceOnUse' | 'objectBoundingBox'; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + x1?: string, + y1?: string, + x2?: string, + y2?: string, + gradient?: $ReadOnlyArray, + gradientUnits?: Int32, + gradientTransform?: $ReadOnlyArray,//CGAffineTransform, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGLinearGradient', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/MarkerNativeComponent.js b/src/fabric/MarkerNativeComponent.js new file mode 100644 index 000000000..9a1fcf567 --- /dev/null +++ b/src/fabric/MarkerNativeComponent.js @@ -0,0 +1,108 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; + +import type { + DirectEventHandler, +} from 'react-native/Libraries/Types/CodegenTypes'; + +// for some reason the parser doesn't allow to put flow types in another file +// import type { SvgNodeCommonProps } from './svgNodeCommonProps'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + refX?: string, + refY?: string, + markerHeight?: string, + markerWidth?: string, + markerUnits?: string, + orient?: string, + minX?: Float, + minY?: Float, + vbWidth?: Float, + vbHeight?: Float, + align?: string, + meetOrSlice?: Int32, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGMarker', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/MaskNativeComponent.js b/src/fabric/MaskNativeComponent.js new file mode 100644 index 000000000..bc0bb649b --- /dev/null +++ b/src/fabric/MaskNativeComponent.js @@ -0,0 +1,106 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; + +import type { + DirectEventHandler, +} from 'react-native/Libraries/Types/CodegenTypes'; + +// for some reason the parser doesn't allow to put flow types in another file +// import type { SvgNodeCommonProps } from './svgNodeCommonProps'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + x?: string, + y?: string, + maskheight?: string, + maskwidth?: string, + height?: string, + width?: string, + maskUnits?: Int32, + maskContentUnits?: Int32, + maskTransform?: $ReadOnlyArray,//CGAffineTransform, + +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGMask', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/PathNativeComponent.js b/src/fabric/PathNativeComponent.js new file mode 100644 index 000000000..773e961b1 --- /dev/null +++ b/src/fabric/PathNativeComponent.js @@ -0,0 +1,69 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + d?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGPath', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/PatternNativeComponent.js b/src/fabric/PatternNativeComponent.js new file mode 100644 index 000000000..cfe4fed29 --- /dev/null +++ b/src/fabric/PatternNativeComponent.js @@ -0,0 +1,111 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; + +import type { + DirectEventHandler, +} from 'react-native/Libraries/Types/CodegenTypes'; + +// for some reason the parser doesn't allow to put flow types in another file +// import type { SvgNodeCommonProps } from './svgNodeCommonProps'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + x?: string, + y?: string, + patternheight?: string, + patternwidth?: string, + height?: string, + width?: string, + patternUnits?: Int32, + patternContentUnits?: Int32, + patternTransform?: $ReadOnlyArray,//CGAffineTransform, + minX?: Float, + minY?: Float, + vbWidth?: Float, + vbHeight?: Float, + align?: string, + meetOrSlice?: Int32, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGPattern', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/RadialGradientNativeComponent.js b/src/fabric/RadialGradientNativeComponent.js new file mode 100644 index 000000000..f800c90e6 --- /dev/null +++ b/src/fabric/RadialGradientNativeComponent.js @@ -0,0 +1,55 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type Units = 'userSpaceOnUse' | 'objectBoundingBox'; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + fx?: string, + fy?: string, + cx?: string, + cy?: string, + rx?: string, + ry?: string, + gradient?: $ReadOnlyArray, + gradientUnits?: Int32, + gradientTransform?: $ReadOnlyArray,//CGAffineTransform, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGRadialGradient', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/RectNativeComponent.js b/src/fabric/RectNativeComponent.js new file mode 100644 index 000000000..69f4cc2fb --- /dev/null +++ b/src/fabric/RectNativeComponent.js @@ -0,0 +1,76 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + x?: string, + y?: string, + rectheight?: string, + rectwidth?: string, + height?: string, + width?: string, + rx?: string, + ry?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGRect', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/SvgViewNativeComponent.js b/src/fabric/SvgViewNativeComponent.js new file mode 100644 index 000000000..b019ad1c8 --- /dev/null +++ b/src/fabric/SvgViewNativeComponent.js @@ -0,0 +1,22 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + bbWidth: string, + bbHeight: string, + minX: Float, + minY: Float, + vbWidth: Float, + vbHeight: Float, + align: string, + meetOrSlice: Int32, + tintColor: ColorValue, + color: ColorValue, +|}>; + +export default (codegenNativeComponent('RNSVGSvgView', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/SymbolNativeComponent.js b/src/fabric/SymbolNativeComponent.js new file mode 100644 index 000000000..aa74f0bd5 --- /dev/null +++ b/src/fabric/SymbolNativeComponent.js @@ -0,0 +1,102 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; + +import type { + DirectEventHandler, +} from 'react-native/Libraries/Types/CodegenTypes'; + +// for some reason the parser doesn't allow to put flow types in another file +// import type { SvgNodeCommonProps } from './svgNodeCommonProps'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + minX?: Float, + minY?: Float, + vbWidth?: Float, + vbHeight?: Float, + align?: string, + meetOrSlice?: Int32, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGSymbol', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/TSpanNativeComponent.js b/src/fabric/TSpanNativeComponent.js new file mode 100644 index 000000000..93837b105 --- /dev/null +++ b/src/fabric/TSpanNativeComponent.js @@ -0,0 +1,105 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + textAnchor?: string, + dx?: $ReadOnlyArray, + dy?: $ReadOnlyArray, + positionX?: $ReadOnlyArray, + positionY?: $ReadOnlyArray, + x?: $ReadOnlyArray, + y?: $ReadOnlyArray, + rotate?: $ReadOnlyArray, + inlineSize?: string, + textLength?: string, + baselineShift?: string, + lengthAdjust?: string, + alignmentBaseline?: string, + content?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGTSpan', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/TextNativeComponent.js b/src/fabric/TextNativeComponent.js new file mode 100644 index 000000000..2c6d25236 --- /dev/null +++ b/src/fabric/TextNativeComponent.js @@ -0,0 +1,104 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + +type FontObject = $ReadOnly<{| + fontStyle?: string; + fontVariant?: string; + fontWeight?: string; + fontStretch?: string; + fontSize?: string; + fontFamily?: string; + textAnchor?: string; + textDecoration?: string; + letterSpacing?: string; + wordSpacing?: string; + kerning?: string; + fontFeatureSettings?: string; + fontVariantLigatures?: string; + fontVariationSettings?: string; +|}>; + +type SvgGroupCommonProps = $ReadOnly<{| + fontSize?: string, + fontWeight?: string, + font?: FontObject, +|}>; + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + ...SvgGroupCommonProps, + textAnchor?: string, + dx?: $ReadOnlyArray, + dy?: $ReadOnlyArray, + positionX?: $ReadOnlyArray, + positionY?: $ReadOnlyArray, + x?: $ReadOnlyArray, + y?: $ReadOnlyArray, + rotate?: $ReadOnlyArray, + inlineSize?: string, + textLength?: string, + baselineShift?: string, + lengthAdjust?: string, + alignmentBaseline?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGText', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/TextPathNativeComponent.js b/src/fabric/TextPathNativeComponent.js new file mode 100644 index 000000000..fdc79433c --- /dev/null +++ b/src/fabric/TextPathNativeComponent.js @@ -0,0 +1,74 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + href?: string, + side?: string, + method?: string, + midLine?: string, + spacing?: string, + startOffset?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGTextPath', {}): ComponentType); \ No newline at end of file diff --git a/src/fabric/UseNativeComponent.js b/src/fabric/UseNativeComponent.js new file mode 100644 index 000000000..2d12c11b1 --- /dev/null +++ b/src/fabric/UseNativeComponent.js @@ -0,0 +1,75 @@ +/** + * @flow strict-local + * @format + */ +/* eslint-disable */ +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; +import type { ViewProps } from 'react-native/Libraries/Components/View/ViewPropTypes'; +import type { HostComponent } from 'react-native/Libraries/Renderer/shims/ReactNativeTypes'; +import { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet'; +import type { Int32, Double } from 'react-native/Libraries/Types/CodegenTypes'; + +type LayoutEvent = $ReadOnly<{| + layout: $ReadOnly<{| + x: Float, + y: Float, + width: Float, + height: Float, + |}>, +|}>; + +type SvgNodeCommonProps = $ReadOnly<{| + name?: string, + opacity?: WithDefault, + matrix?: $ReadOnlyArray,//CGAffineTransform, + // transform?: ____TransformStyle_Internal, // CATransform3D, custom handling + mask?: string, + markerStart?: string, + markerMid?: string, + markerEnd?: string, + clipPath?: string, + clipRule?: WithDefault, + responsible?: boolean, + onLayout?: ?DirectEventHandler, // not working for now + display?: string, +|}>; + +type ColorStruct = $ReadOnly<{| + type?: WithDefault, + value?: ColorValue, + brushRef?: string, +|}>; + +type SvgRenderableCommonProps = $ReadOnly<{| + fill?: ColorStruct, + fillOpacity?: WithDefault, + fillRule?: WithDefault, + stroke?: ColorStruct, + strokeOpacity?: WithDefault, + strokeWidth?: WithDefault, + strokeLinecap?: WithDefault, + strokeLinejoin?: WithDefault, + strokeDasharray?: $ReadOnlyArray, + strokeDashoffset?: Float, + strokeMiterlimit?: Float, + vectorEffect?: WithDefault, + propList?: $ReadOnlyArray, +|}>; + + +type NativeProps = $ReadOnly<{| + ...ViewProps, + ...SvgNodeCommonProps, + ...SvgRenderableCommonProps, + href?: string, + x?: string, + y?: string, + useheight?: string, + usewidth?: string, + height?: string, + width?: string, +|}>; + +type ComponentType = HostComponent; + +export default (codegenNativeComponent('RNSVGUse', {}): ComponentType); \ No newline at end of file diff --git a/src/lib/extract/extractBrush.ts b/src/lib/extract/extractBrush.ts index de59172c4..299ef0346 100644 --- a/src/lib/extract/extractBrush.ts +++ b/src/lib/extract/extractBrush.ts @@ -2,9 +2,9 @@ import { ColorValue, processColor } from 'react-native'; const urlIdPattern = /^url\(#(.+)\)$/; -const currentColorBrush = [2]; -const contextFillBrush = [3]; -const contextStrokeBrush = [4]; +const currentColorBrush = { type: 2 }; +const contextFillBrush = { type: 3 }; +const contextStrokeBrush = { type: 4 }; export default function extractBrush(color?: ColorValue) { if (!color || color === 'none') { @@ -25,19 +25,19 @@ export default function extractBrush(color?: ColorValue) { const brush = typeof color === 'string' && color.match(urlIdPattern); if (brush) { - return [1, brush[1]]; + return { type: 1, brushRef: brush[1] }; } const processedColor = processColor(color); if (typeof processedColor === 'number') { - return processedColor; + return { type: 0, value: processedColor }; } if (typeof processedColor === 'object' && processedColor !== null) { // if we got an object, it should be `PlatformColor` or `DynamicColorIOS`, - // so we pass it as an array with `0` value as first item, which is interpreted + // so we pass it as an object with `0` value as first item, which is interpreted // on the native side as color to be managed by `RCTConvert`. - return [0, processedColor]; + return { type: 0, value: processedColor }; } console.warn(`"${String(color)}" is not a valid color or brush`); diff --git a/src/lib/extract/extractLengthList.ts b/src/lib/extract/extractLengthList.ts index 444750e0e..0b7183a9c 100644 --- a/src/lib/extract/extractLengthList.ts +++ b/src/lib/extract/extractLengthList.ts @@ -5,11 +5,11 @@ const commaReg = /,/g; export default function extractLengthList( lengthList?: readonly NumberProp[] | NumberProp, -): readonly NumberProp[] { +): string[] { if (Array.isArray(lengthList)) { - return lengthList as NumberProp[]; + return lengthList.map((el) => String(el)); } else if (typeof lengthList === 'number') { - return [lengthList]; + return [String(lengthList)]; } else if (typeof lengthList === 'string') { return lengthList.trim().replace(commaReg, ' ').split(spaceReg); } else { diff --git a/src/lib/extract/extractProps.ts b/src/lib/extract/extractProps.ts index 8c0c49c2b..41c703b82 100644 --- a/src/lib/extract/extractProps.ts +++ b/src/lib/extract/extractProps.ts @@ -151,6 +151,19 @@ export function extract(instance: Object, props: Object & { style?: [] | {} }) { return extractProps(propsAndStyles(props), instance); } +export function stringifyPropsForFabric(props: { + [key: string]: NumberProp | undefined | null; +}): { [key: string]: string } { + const extracted: { [key: string]: string } = {}; + Object.keys(props).forEach((k) => { + if (props[k] !== undefined && props[k] !== null) { + extracted[k] = String(props[k]); + } + }); + + return extracted; +} + export function withoutXY( instance: Object, props: Object & { style?: [] | {} }, diff --git a/src/lib/extract/extractStroke.ts b/src/lib/extract/extractStroke.ts index 5f56e1a68..059ff9ba1 100644 --- a/src/lib/extract/extractStroke.ts +++ b/src/lib/extract/extractStroke.ts @@ -47,7 +47,7 @@ export default function extractStroke( } if (strokeWidth != null) { inherited.push('strokeWidth'); - o.strokeWidth = strokeWidth; + o.strokeWidth = String(strokeWidth); } if (strokeOpacity != null) { inherited.push('strokeOpacity'); diff --git a/src/lib/extract/extractText.tsx b/src/lib/extract/extractText.tsx index 4045c916d..1606079ed 100644 --- a/src/lib/extract/extractText.tsx +++ b/src/lib/extract/extractText.tsx @@ -2,6 +2,7 @@ import React, { Children, ComponentType } from 'react'; import extractLengthList from './extractLengthList'; import { pickNotNil } from '../util'; import { NumberArray, NumberProp } from './types'; +import { stringifyPropsForFabric } from './extractProps'; const fontRegExp = /^\s*((?:(?:normal|bold|italic)\s+)*)(?:(\d+(?:\.\d+)?(?:%|px|em|pt|pc|mm|cm|in]))*(?:\s*\/.*?)?\s+)?\s*"?([^"]*)/i; @@ -109,7 +110,18 @@ export function extractFont(props: fontProps) { const baseFont = typeof font === 'string' ? parseFontString(font) : font; - return { ...baseFont, ...ownedFont }; + const fontProps: { [prop: string]: string | number | null } = { + ...baseFont, + ...ownedFont, + }; + const stringifiedFontProps: { [prop: string]: string | null } = {}; + Object.keys(fontProps).map( + (k) => + (stringifiedFontProps[k] = + fontProps[k] === null ? null : String(fontProps[k])), + ); + + return stringifiedFontProps; } let TSpan: ComponentType>; @@ -168,12 +180,16 @@ export default function extractText(props: TextProps, container: boolean) { children ); - return { - content: textChildren === null ? String(children) : null, - children: textChildren, + const stringifiedTextProps = stringifyPropsForFabric({ inlineSize, baselineShift, verticalAlign, + }); + + return { + content: textChildren === null ? String(children) : null, + children: textChildren, + ...stringifiedTextProps, alignmentBaseline, font: extractFont(props), x: extractLengthList(x),