diff --git a/.gitignore b/.gitignore index 5b87151cb994ba20836466f4fbf0313ff97ba28d..da685985e3e892ecef5d7d5e0f9d3a7b9acdfee5 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,4 @@ android/app/libs android/keystores/debug.keystore pods .vscode +.github \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 17b69ac76c5241878cbe390c10ba4df352e0010b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at pusic007@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 0000000000000000000000000000000000000000..cfe6605baf51447335a7009d6c9aed4aae5fdf4c --- /dev/null +++ b/OAT.xml @@ -0,0 +1,75 @@ + + + + LICENSE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.OpenSource b/README.OpenSource new file mode 100644 index 0000000000000000000000000000000000000000..146bcef9a90df9bd731aba9ab02d401ef5e2bfe1 --- /dev/null +++ b/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "react-native-image-crop-picker", + "License": "MIT License", + "License File": "https://github.com/ivpusic/react-native-image-crop-picker/blob/master/LICENSE", + "Version Number": "0.40.3", + "Owner" : "xiafeng@huawei.com", + "Upstream URL": "https://github.com/ivpusic/react-native-image-crop-picker", + "Description": "Select single or multiple images, with cropping option" + } +] \ No newline at end of file diff --git a/README.md b/README.md index 651e1104eb98272039e2540326d3d109cfe8042e..e73c5a290a2d17075e6c77aafd8d113aaf3d5c86 100644 --- a/README.md +++ b/README.md @@ -1,324 +1,13 @@ -# react-native-image-crop-picker +# @react-native-ohos/react-native-image-crop-picker -[![Backers on Open Collective](https://opencollective.com/react-native-image-crop-picker/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/react-native-image-crop-picker/sponsors/badge.svg)](#sponsors) +This project is based on [react-native-image-crop-picker](https://github.com/ivpusic/react-native-image-crop-picker) - - -iOS/Android image picker with support for camera, video, configurable compression, multiple images and cropping - -## Result - -

- - - - -

- -## Important notes - -1. If you are using react-native >= 0.60 use react-native-image-crop-picker version >= 0.25.0. Otherwise use version < 0.25.0. -2. If you want to use react-native-image-crop-picker version >= 0.39.0 you have to set your android compileSdkVersion to 33 or greater. Otherwise use react-native-image-crop-picker version < 0.39.0 - -## Usage - -Import library - -```javascript -import ImagePicker from 'react-native-image-crop-picker'; -``` - -### Select from gallery - -Call single image picker with cropping -```javascript -ImagePicker.openPicker({ - width: 300, - height: 400, - cropping: true -}).then(image => { - console.log(image); -}); -``` - -Call multiple image picker - -```javascript -ImagePicker.openPicker({ - multiple: true -}).then(images => { - console.log(images); -}); -``` - -Select video only from gallery - -```javascript -ImagePicker.openPicker({ - mediaType: "video", -}).then((video) => { - console.log(video); -}); -``` - -**Android: The prop 'cropping' has been known to cause videos not to be displayed in the gallery on Android. Please do not set cropping to true when selecting videos.** - - -### Select from camera - -#### Image - -```javascript -ImagePicker.openCamera({ - width: 300, - height: 400, - cropping: true, -}).then(image => { - console.log(image); -}); -``` - -#### Video - -```javascript -ImagePicker.openCamera({ - mediaType: 'video', -}).then(image => { - console.log(image); -}); -``` - -### Crop picture - -```javascript -ImagePicker.openCropper({ - path: 'my-file-path.jpg', - width: 300, - height: 400 -}).then(image => { - console.log(image); -}); -``` - -### Optional cleanup - -Module is creating tmp images which are going to be cleaned up automatically somewhere in the future. If you want to force cleanup, you can use `clean` to clean all tmp files, or `cleanSingle(path)` to clean single tmp file. - -```javascript -ImagePicker.clean().then(() => { - console.log('removed all tmp images from tmp directory'); -}).catch(e => { - alert(e); -}); -``` - -### Request Object - -| Property | Type | Description | -| --------------------------------------- | :--------------------------------------: | :--------------------------------------- | -| cropping | bool (default false) | Enable or disable cropping | -| width | number | Width of result image when used with `cropping` option | -| height | number | Height of result image when used with `cropping` option | -| multiple | bool (default false) | Enable or disable multiple image selection | -| writeTempFile (ios only) | bool (default true) | When set to false, does not write temporary files for the selected images. This is useful to improve performance when you are retrieving file contents with the `includeBase64` option and don't need to read files from disk. | -| includeBase64 | bool (default false) | When set to true, the image file content will be available as a base64-encoded string in the `data` property. Hint: To use this string as an image source, use it like: ```` | -| includeExif | bool (default false) | Include image exif data in the response | -| avoidEmptySpaceAroundImage (ios only) | bool (default true) | When set to true, the image will always fill the mask space. | -| cropperActiveWidgetColor (android only) | string (default `"#424242"`) | When cropping image, determines ActiveWidget color. | -| cropperStatusBarColor (android only) | string (default `#424242`) | When cropping image, determines the color of StatusBar. | -| cropperToolbarColor (android only) | string (default `#424242`) | When cropping image, determines the color of Toolbar. | -| cropperToolbarWidgetColor (android only) | string (default `darker orange`) | When cropping image, determines the color of Toolbar text and buttons. | -| freeStyleCropEnabled | bool (default false) | Enables user to apply custom rectangle area for cropping | -| cropperToolbarTitle | string (default `Edit Photo`) | When cropping image, determines the title of Toolbar. | -| cropperCircleOverlay | bool (default false) | Enable or disable circular cropping mask. | -| disableCropperColorSetters (android only)| bool (default false) | When cropping image, disables the color setters for cropping library. | -| minFiles (ios only) | number (default 1) | Min number of files to select when using `multiple` option | -| maxFiles (ios only) | number (default 5) | Max number of files to select when using `multiple` option | -| waitAnimationEnd (ios only) | bool (default true) | Promise will resolve/reject once ViewController `completion` block is called | -| smartAlbums (ios only) | array ([supported values](https://github.com/ivpusic/react-native-image-crop-picker/blob/master/README.md#smart-album-types-ios)) (default ['UserLibrary', 'PhotoStream', 'Panoramas', 'Videos', 'Bursts']) | List of smart albums to choose from | -| useFrontCamera | bool (default false) | Whether to default to the front/'selfie' camera when opened. Please note that not all Android devices handle this parameter, see [issue #1058](https://github.com/ivpusic/react-native-image-crop-picker/issues/1058)| -| compressVideoPreset (ios only) | string (default MediumQuality) | Choose which preset will be used for video compression | -| compressImageMaxWidth | number (default none) | Compress image with maximum width | -| compressImageMaxHeight | number (default none) | Compress image with maximum height | -| compressImageQuality | number (default 1 (Android)/0.8 (iOS)) | Compress image with quality (from 0 to 1, where 1 is best quality). On iOS, values larger than 0.8 don't produce a noticeable quality increase in most images, while a value of 0.8 will reduce the file size by about half or less compared to a value of 1. | -| loadingLabelText (ios only) | string (default "Processing assets...") | Text displayed while photo is loading in picker | -| mediaType | string (default any) | Accepted mediaType for image selection, can be one of: 'photo', 'video', or 'any' | -| showsSelectedCount (ios only) | bool (default true) | Whether to show the number of selected assets | -| sortOrder (ios only) | string (default 'none', supported values: 'asc', 'desc', 'none') | Applies a sort order on the creation date on how media is displayed within the albums/detail photo views when opening the image picker | -| forceJpg (ios only) | bool (default false) | Whether to convert photos to JPG. This will also convert any Live Photo into its JPG representation | -| showCropGuidelines (android only) | bool (default true) | Whether to show the 3x3 grid on top of the image during cropping | -| showCropFrame (android only) | bool (default true) | Whether to show crop frame during cropping | -| hideBottomControls (android only) | bool (default false) | Whether to display bottom controls | -| enableRotationGesture (android only) | bool (default false) | Whether to enable rotating the image by hand gesture | -| cropperChooseText (ios only)  |           string (default choose)        | Choose button text | -| cropperChooseColor (ios only) | string (default `#FFCC00`) | HEX format color for the Choose button. [Default color is controlled by TOCropViewController](https://github.com/TimOliver/TOCropViewController/blob/a942414508012b13102f776eb65dac655f31cabb/Objective-C/TOCropViewController/Views/TOCropToolbar.m#L444). | -| cropperCancelText (ios only) | string (default Cancel) | Cancel button text | -| cropperCancelColor (ios only) | string (default tint `iOS` color ) | HEX format color for the Cancel button. Default value is the default tint iOS color [controlled by TOCropViewController](https://github.com/TimOliver/TOCropViewController/blob/a942414508012b13102f776eb65dac655f31cabb/Objective-C/TOCropViewController/Views/TOCropToolbar.m#L433) | -| cropperRotateButtonsHidden (ios only)  |           bool (default false)        | Enable or disable cropper rotate buttons | - - -#### Smart Album Types (ios) - -NOTE: Some of these types may not be available on all iOS versions. Be sure to check this to avoid issues. -``` -['PhotoStream', 'Generic', 'Panoramas', 'Videos', 'Favorites', 'Timelapses', 'AllHidden', 'RecentlyAdded', 'Bursts', 'SlomoVideos', 'UserLibrary', 'SelfPortraits', 'Screenshots', 'DepthEffect', 'LivePhotos', 'Animated', 'LongExposure'] -``` - -### Response Object - -| Property | Type | Description | -| ------------------------- | :----: | :--------------------------------------- | -| path | string | Selected image location. This is null when the `writeTempFile` option is set to false. | -| localIdentifier(ios only) | string | Selected images' localidentifier, used for PHAsset searching | -| sourceURL(ios only) | string | Selected images' source path, do not have write access | -| filename(ios only) | string | Selected images' filename | -| width | number | Selected image width | -| height | number | Selected image height | -| mime | string | Selected image MIME type (image/jpeg, image/png) | -| size | number | Selected image size in bytes | -| duration | number | Video duration time in milliseconds | -| data | base64 | Optional base64 selected file representation | -| exif | object | Extracted exif data from image. Response format is platform specific | -| cropRect | object | Cropped image rectangle (width, height, x, y) | -| creationDate (ios only) | string | UNIX timestamp when image was created | -| modificationDate | string | UNIX timestamp when image was last modified | - -# Install - -## Step 1 - -```bash -npm i react-native-image-crop-picker --save -``` - -## Step 2 - -### iOS - -```bash -cd ios -pod install -``` - -## Step 3 - -### iOS - -#### Step 1 - -In Xcode open Info.plist and add string key `NSPhotoLibraryUsageDescription` with value that describes why you need access to user photos. More info here https://forums.developer.apple.com/thread/62229. Depending on what features you use, you also may need `NSCameraUsageDescription` and `NSMicrophoneUsageDescription` keys. - -#### (Optional) Step 2 - To localize the camera / gallery / cropper text buttons - -- Open your Xcode project -- Go to your project settings by opening the project name on the Navigation (left side) -- Select your project in the project list -- Should be into the Info tab and add in Localizations the language your app was missing throughout the + -- Rebuild and you should now have your app camera and gallery with the classic ios text in the language you added. - -### Android - -- **VERY IMPORTANT** Add the following to your `build.gradle`'s repositories section and change Android SDK version to 33. (android/build.gradle) - -```gradle -buildscript { - ext { - buildToolsVersion = "31.0.0" - minSdkVersion = 21 - compileSdkVersion = 33 - targetSdkVersion = 33 - ... - } -} - -allprojects { - repositories { - mavenLocal() - jcenter() - maven { url "$rootDir/../node_modules/react-native/android" } - - // ADD THIS - maven { url 'https://maven.google.com' } - - // ADD THIS - maven { url "https://www.jitpack.io" } - } -} -``` - -- Add `useSupportLibrary` (android/app/build.gradle) - -```gradle -android { - ... - - defaultConfig { - ... - vectorDrawables.useSupportLibrary = true - ... - } - ... -} -``` - -- Minimum Gradle version if you are using react-native-image-crop-picker >= 0.35.0 - -``` -3.3.3 -3.4.3 -3.5.4 -3.6.4 -4.0.1 -``` - -Reference for more details https://github.com/ivpusic/react-native-image-crop-picker/issues/1406 - -- If you use SDK version >= 33, add following to `app/src/main/AndroidManifest.xml` - - `` - -- [Optional] If you want to use camera picker in your project, add following to `app/src/main/AndroidManifest.xml` - - `` - -- [Optional] If you want to use front camera, also add following to `app/src/main/ -AndroidManifest.xml` - - `` - - `` - -## TO DO - -- [ ] [Android] Standardize multiple select -- [ ] [Android] Video compression - - -## Contributors - -This project exists thanks to all the people who contribute. [[Contribute]](CONTRIBUTING.md). - - - -## Backers - -Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/react-native-image-crop-picker#backer)] - - - - -## Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/react-native-image-crop-picker#sponsor)] - - - - - - - - - - - +## Documentation +[中文](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/react-native-image-crop-picker.md) +[English](https://gitee.com/react-native-oh-library/usage-docs/blob/master/en/react-native-image-crop-picker.md) ## License -*MIT* + +This library is licensed under The [MIT License (MIT)](https://github.com/ivpusic/react-native-image-crop-picker/blob/master/LICENSE) diff --git a/RNImageCropPicker.podspec b/RNImageCropPicker.podspec deleted file mode 100644 index 9cbd856841f41a60915d569c4490c7b2ce4451ff..0000000000000000000000000000000000000000 --- a/RNImageCropPicker.podspec +++ /dev/null @@ -1,26 +0,0 @@ -package = JSON.parse(File.read(File.join(__dir__, "package.json"))) - -Pod::Spec.new do |s| - s.name = "RNImageCropPicker" - s.version = package['version'] - s.summary = package["description"] - s.requires_arc = true - s.license = 'MIT' - s.homepage = 'n/a' - s.authors = { "ivpusic" => "" } - s.source = { :git => "https://github.com/ivpusic/react-native-image-crop-picker", :tag => "v#{s.version}"} - s.source_files = 'ios/src/*.{h,m}' - s.platform = :ios, "8.0" - s.dependency 'React-Core' - s.dependency 'React-RCTImage' - s.dependency 'TOCropViewController' - - s.subspec 'QBImagePickerController' do |qb| - qb.name = "QBImagePickerController" - qb.source_files = "ios/QBImagePicker/QBImagePicker/*.{h,m}" - qb.exclude_files = "ios/QBImagePicker/QBImagePicker/QBImagePicker.h" - qb.resource_bundles = { "QBImagePicker" => "ios/QBImagePicker/QBImagePicker/*.{lproj,storyboard}" } - qb.requires_arc = true - qb.frameworks = "Photos", "PhotosUI" - end -end diff --git a/android/android.iml b/android/android.iml deleted file mode 100644 index 23d1ef8d1ddbb0dd28d1aacb094da4f32144d853..0000000000000000000000000000000000000000 --- a/android/android.iml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 48443cca5779e96f5e36a204c79f11a3cbf351f0..0000000000000000000000000000000000000000 --- a/android/build.gradle +++ /dev/null @@ -1,26 +0,0 @@ -apply plugin: 'com.android.library' - -def DEFAULT_COMPILE_SDK_VERSION = 30 -def DEFAULT_BUILD_TOOLS_VERSION = "29.0.3" -def DEFAULT_TARGET_SDK_VERSION = 30 -def DEFAULT_MIN_SDK_VERSION = 16 - -android { - compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION - buildToolsVersion rootProject.hasProperty('buildToolsVersion') ? rootProject.buildToolsVersion : DEFAULT_BUILD_TOOLS_VERSION - - defaultConfig { - minSdkVersion rootProject.hasProperty('minSdkVersion') ? rootProject.minSdkVersion : DEFAULT_MIN_SDK_VERSION - targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION - versionCode 1 - } - lintOptions { - abortOnError false - } -} - -dependencies { - implementation 'com.facebook.react:react-native:+' - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'com.github.yalantis:ucrop:2.2.6-native' -} diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13372aef5e24af05341d49695ee84e5f9b594659..0000000000000000000000000000000000000000 Binary files a/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 0f5c93fa2d92cdc8efb2330a32564ad16aea94cd..0000000000000000000000000000000000000000 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue May 17 14:28:43 CEST 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/android/gradlew b/android/gradlew deleted file mode 100644 index 9d82f78915133e1c35a6ea51252590fb38efac2f..0000000000000000000000000000000000000000 --- a/android/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat deleted file mode 100644 index aec99730b4e8fcd90b57a0e8e01544fea7c31a89..0000000000000000000000000000000000000000 --- a/android/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml deleted file mode 100644 index c356fde1147b9f952abacb20e9c5bb9bbceea3ac..0000000000000000000000000000000000000000 --- a/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/Compression.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/Compression.java deleted file mode 100644 index 5ea266c56523affba8870b7f9be3dd2f726a63db..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/Compression.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import android.app.Activity; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.media.ExifInterface; -import android.os.Environment; -import android.util.Log; -import android.util.Pair; - -import com.facebook.react.bridge.Promise; -import com.facebook.react.bridge.ReadableMap; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -/** - * Created by ipusic on 12/27/16. - */ - -class Compression { - - File resize( - Context context, - String originalImagePath, - int originalWidth, - int originalHeight, - int maxWidth, - int maxHeight, - int quality - ) throws IOException { - Pair targetDimensions = - this.calculateTargetDimensions(originalWidth, originalHeight, maxWidth, maxHeight); - - int targetWidth = targetDimensions.first; - int targetHeight = targetDimensions.second; - - Bitmap bitmap = null; - if (originalWidth <= maxWidth && originalHeight <= maxHeight) { - bitmap = BitmapFactory.decodeFile(originalImagePath); - } else { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = calculateInSampleSize(originalWidth, originalHeight, targetWidth, targetHeight); - bitmap = BitmapFactory.decodeFile(originalImagePath, options); - } - - // Use original image exif orientation data to preserve image orientation for the resized bitmap - ExifInterface originalExif = new ExifInterface(originalImagePath); - String originalOrientation = originalExif.getAttribute(ExifInterface.TAG_ORIENTATION); - - bitmap = Bitmap.createScaledBitmap(bitmap, targetWidth, targetHeight, true); - - File imageDirectory = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); - - if (!imageDirectory.exists()) { - Log.d("image-crop-picker", "Pictures Directory is not existing. Will create this directory."); - imageDirectory.mkdirs(); - } - - File resizeImageFile = new File(imageDirectory, UUID.randomUUID() + ".jpg"); - - OutputStream os = new BufferedOutputStream(new FileOutputStream(resizeImageFile)); - bitmap.compress(Bitmap.CompressFormat.JPEG, quality, os); - - // Don't set unnecessary exif attribute - if (shouldSetOrientation(originalOrientation)) { - ExifInterface exif = new ExifInterface(resizeImageFile.getAbsolutePath()); - exif.setAttribute(ExifInterface.TAG_ORIENTATION, originalOrientation); - exif.saveAttributes(); - } - - os.close(); - bitmap.recycle(); - - return resizeImageFile; - } - - private int calculateInSampleSize(int originalWidth, int originalHeight, int requestedWidth, int requestedHeight) { - int inSampleSize = 1; - - if (originalWidth > requestedWidth || originalHeight > requestedHeight) { - final int halfWidth = originalWidth / 2; - final int halfHeight = originalHeight / 2; - - // Calculate the largest inSampleSize value that is a power of 2 and keeps both - // height and width larger than the requested height and width. - while ((halfWidth / inSampleSize) >= requestedWidth - && (halfHeight / inSampleSize) >= requestedHeight) { - inSampleSize *= 2; - } - } - - return inSampleSize; - } - - private boolean shouldSetOrientation(String orientation) { - return !orientation.equals(String.valueOf(ExifInterface.ORIENTATION_NORMAL)) - && !orientation.equals(String.valueOf(ExifInterface.ORIENTATION_UNDEFINED)); - } - - File compressImage(final Context context, final ReadableMap options, final String originalImagePath, final BitmapFactory.Options bitmapOptions) throws IOException { - Integer maxWidth = options.hasKey("compressImageMaxWidth") ? options.getInt("compressImageMaxWidth") : null; - Integer maxHeight = options.hasKey("compressImageMaxHeight") ? options.getInt("compressImageMaxHeight") : null; - Double quality = options.hasKey("compressImageQuality") ? options.getDouble("compressImageQuality") : null; - - boolean isLossLess = (quality == null || quality == 1.0); - boolean useOriginalWidth = (maxWidth == null || maxWidth >= bitmapOptions.outWidth); - boolean useOriginalHeight = (maxHeight == null || maxHeight >= bitmapOptions.outHeight); - - List knownMimes = Arrays.asList("image/jpeg", "image/jpg", "image/png", "image/gif", "image/tiff"); - boolean isKnownMimeType = (bitmapOptions.outMimeType != null && knownMimes.contains(bitmapOptions.outMimeType.toLowerCase())); - - if (isLossLess && useOriginalWidth && useOriginalHeight && isKnownMimeType) { - Log.d("image-crop-picker", "Skipping image compression"); - return new File(originalImagePath); - } - - Log.d("image-crop-picker", "Image compression activated"); - - // compression quality - int targetQuality = quality != null ? (int) (quality * 100) : 100; - Log.d("image-crop-picker", "Compressing image with quality " + targetQuality); - - if (maxWidth == null) maxWidth = bitmapOptions.outWidth; - if (maxHeight == null) maxHeight = bitmapOptions.outHeight; - - return resize(context, originalImagePath, bitmapOptions.outWidth, bitmapOptions.outHeight, maxWidth, maxHeight, targetQuality); - } - - private Pair calculateTargetDimensions(int currentWidth, int currentHeight, int maxWidth, int maxHeight) { - int width = currentWidth; - int height = currentHeight; - - if (width > maxWidth) { - float ratio = ((float) maxWidth / width); - height = (int) (height * ratio); - width = maxWidth; - } - - if (height > maxHeight) { - float ratio = ((float) maxHeight / height); - width = (int) (width * ratio); - height = maxHeight; - } - - return Pair.create(width, height); - } - - synchronized void compressVideo(final Activity activity, final ReadableMap options, final String originalVideo, final String compressedVideo, final Promise promise) { - // todo: video compression - // failed attempt 1: ffmpeg => slow and licensing issues - promise.resolve(originalVideo); - } -} diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/ExifExtractor.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/ExifExtractor.java deleted file mode 100644 index ab303e93b76f12f80ebe5088b299facdcb756be9..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/ExifExtractor.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import android.media.ExifInterface; -import android.os.Build; - -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.bridge.WritableNativeMap; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static android.media.ExifInterface.*; - -class ExifExtractor { - - static WritableMap extract(String path) throws IOException { - WritableMap exifData = new WritableNativeMap(); - - List attributes = getBasicAttributes(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - attributes.addAll(getLevel23Attributes()); - } - - ExifInterface exif = new ExifInterface(path); - - try { - GeoDegree geoDegree = new GeoDegree(exif); - if (geoDegree.getLatitude() != null && geoDegree.getLongitude() != null) { - exifData.putDouble("Latitude", geoDegree.getLatitude()); - exifData.putDouble("Longitude", geoDegree.getLongitude()); - } - } catch (Exception e) { - e.printStackTrace(); - } - - for (String attribute : attributes) { - String value = exif.getAttribute(attribute); - exifData.putString(attribute, value); - } - - return exifData; - } - - private static List getBasicAttributes() { - return new ArrayList<>(Arrays.asList( - TAG_APERTURE, - TAG_DATETIME, - TAG_EXPOSURE_TIME, - TAG_FLASH, - TAG_FOCAL_LENGTH, - TAG_GPS_ALTITUDE, - TAG_GPS_ALTITUDE_REF, - TAG_GPS_DATESTAMP, - TAG_GPS_LATITUDE, - TAG_GPS_LATITUDE_REF, - TAG_GPS_LONGITUDE, - TAG_GPS_LONGITUDE_REF, - TAG_GPS_PROCESSING_METHOD, - TAG_GPS_TIMESTAMP, - TAG_IMAGE_LENGTH, - TAG_IMAGE_WIDTH, - TAG_ISO, - TAG_MAKE, - TAG_MODEL, - TAG_ORIENTATION, - TAG_WHITE_BALANCE - )); - } - - private static List getLevel23Attributes() { - return new ArrayList<>(Arrays.asList( - TAG_DATETIME_DIGITIZED, - TAG_SUBSEC_TIME, - TAG_SUBSEC_TIME_DIG, - TAG_SUBSEC_TIME_ORIG - )); - } -} \ No newline at end of file diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/GeoDegree.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/GeoDegree.java deleted file mode 100644 index 6250c16cd0ee932d04adb235f0ad09e55e264c04..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/GeoDegree.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import android.media.ExifInterface; - -public class GeoDegree { - Float latitude; - Float longitude; - - public GeoDegree(ExifInterface exif) { - String attrLATITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE); - String attrLATITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF); - String attrLONGITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE); - String attrLONGITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF); - - if ((attrLATITUDE != null) - && (attrLATITUDE_REF != null) - && (attrLONGITUDE != null) - && (attrLONGITUDE_REF != null)) { - - if (attrLATITUDE_REF.equals("N")) { - latitude = convertToDegree(attrLATITUDE); - } else { - latitude = 0 - convertToDegree(attrLATITUDE); - } - - if (attrLONGITUDE_REF.equals("E")) { - longitude = convertToDegree(attrLONGITUDE); - } else { - longitude = 0 - convertToDegree(attrLONGITUDE); - } - } - } - - private Float convertToDegree(String stringDMS) { - Float result = null; - String[] DMS = stringDMS.split(",", 3); - - String[] stringD = DMS[0].split("/", 2); - Double D0 = Double.valueOf(stringD[0]); - Double D1 = Double.valueOf(stringD[1]); - double FloatD = D0 / D1; - - String[] stringM = DMS[1].split("/", 2); - Double M0 = Double.valueOf(stringM[0]); - Double M1 = Double.valueOf(stringM[1]); - double FloatM = M0 / M1; - - String[] stringS = DMS[2].split("/", 2); - Double S0 = Double.valueOf(stringS[0]); - Double S1 = Double.valueOf(stringS[1]); - double FloatS = S0 / S1; - - result = (float) (FloatD + (FloatM / 60) + (FloatS / 3600)); - - return result; - } - - public Float getLatitude() { - return latitude; - } - - public Float getLongitude() { - return longitude; - } -} diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/IvpusicImagePickerFileProvider.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/IvpusicImagePickerFileProvider.java deleted file mode 100644 index ca3bcf10a5d9cf4a4a513837f97d1b37cf3fdcc8..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/IvpusicImagePickerFileProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import androidx.core.content.FileProvider; - -/** - * A custom {@code FileProvider} prevents manifest {@code } name collisions. - */ -public class IvpusicImagePickerFileProvider extends FileProvider { -} \ No newline at end of file diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java deleted file mode 100644 index 5de0845b26203a1d8014580ac69db334046d53f2..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerModule.java +++ /dev/null @@ -1,941 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import android.Manifest; -import android.app.Activity; -import android.content.ClipData; -import android.content.Context; -import android.content.ContentResolver; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.media.MediaMetadataRetriever; -import android.net.Uri; -import android.os.Build; -import android.os.Environment; -import android.provider.MediaStore; -import android.util.Base64; -import android.util.Log; -import android.webkit.MimeTypeMap; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.FileProvider; - -import com.facebook.react.bridge.ActivityEventListener; -import com.facebook.react.bridge.Callback; -import com.facebook.react.bridge.Promise; -import com.facebook.react.bridge.PromiseImpl; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.bridge.WritableNativeMap; -import com.facebook.react.modules.core.PermissionAwareActivity; -import com.facebook.react.modules.core.PermissionListener; -import com.yalantis.ucrop.UCrop; -import com.yalantis.ucrop.UCropActivity; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.Callable; - - - -class PickerModule extends ReactContextBaseJavaModule implements ActivityEventListener { - - private static final int IMAGE_PICKER_REQUEST = 61110; - private static final int CAMERA_PICKER_REQUEST = 61111; - private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST"; - - private static final String E_PICKER_CANCELLED_KEY = "E_PICKER_CANCELLED"; - private static final String E_PICKER_CANCELLED_MSG = "User cancelled image selection"; - - private static final String E_CALLBACK_ERROR = "E_CALLBACK_ERROR"; - private static final String E_FAILED_TO_SHOW_PICKER = "E_FAILED_TO_SHOW_PICKER"; - private static final String E_FAILED_TO_OPEN_CAMERA = "E_FAILED_TO_OPEN_CAMERA"; - private static final String E_NO_IMAGE_DATA_FOUND = "E_NO_IMAGE_DATA_FOUND"; - private static final String E_CAMERA_IS_NOT_AVAILABLE = "E_CAMERA_IS_NOT_AVAILABLE"; - private static final String E_CANNOT_LAUNCH_CAMERA = "E_CANNOT_LAUNCH_CAMERA"; - private static final String E_ERROR_WHILE_CLEANING_FILES = "E_ERROR_WHILE_CLEANING_FILES"; - - private static final String E_NO_LIBRARY_PERMISSION_KEY = "E_NO_LIBRARY_PERMISSION"; - private static final String E_NO_LIBRARY_PERMISSION_MSG = "User did not grant library permission."; - private static final String E_NO_CAMERA_PERMISSION_KEY = "E_NO_CAMERA_PERMISSION"; - private static final String E_NO_CAMERA_PERMISSION_MSG = "User did not grant camera permission."; - - private String mediaType = "any"; - private boolean multiple = false; - private boolean includeBase64 = false; - private boolean includeExif = false; - private boolean cropping = false; - private boolean cropperCircleOverlay = false; - private boolean freeStyleCropEnabled = false; - private boolean showCropGuidelines = true; - private boolean showCropFrame = true; - private boolean hideBottomControls = false; - private boolean enableRotationGesture = false; - private boolean disableCropperColorSetters = false; - private boolean useFrontCamera = false; - private ReadableMap options; - - private String cropperActiveWidgetColor = null; - private String cropperStatusBarColor = null; - private String cropperToolbarColor = null; - private String cropperToolbarTitle = null; - private String cropperToolbarWidgetColor = null; - - private int width = 0; - private int height = 0; - - private Uri mCameraCaptureURI; - private String mCurrentMediaPath; - private ResultCollector resultCollector = new ResultCollector(); - private Compression compression = new Compression(); - private ReactApplicationContext reactContext; - - PickerModule(ReactApplicationContext reactContext) { - super(reactContext); - reactContext.addActivityEventListener(this); - this.reactContext = reactContext; - } - - private String getTmpDir(Activity activity) { - String tmpDir = activity.getCacheDir() + "/react-native-image-crop-picker"; - new File(tmpDir).mkdir(); - - return tmpDir; - } - - @Override - public String getName() { - return "ImageCropPicker"; - } - - private void setConfiguration(final ReadableMap options) { - mediaType = options.hasKey("mediaType") ? options.getString("mediaType") : "any"; - multiple = options.hasKey("multiple") && options.getBoolean("multiple"); - includeBase64 = options.hasKey("includeBase64") && options.getBoolean("includeBase64"); - includeExif = options.hasKey("includeExif") && options.getBoolean("includeExif"); - width = options.hasKey("width") ? options.getInt("width") : 0; - height = options.hasKey("height") ? options.getInt("height") : 0; - cropping = options.hasKey("cropping") && options.getBoolean("cropping"); - cropperActiveWidgetColor = options.hasKey("cropperActiveWidgetColor") ? options.getString("cropperActiveWidgetColor") : null; - cropperStatusBarColor = options.hasKey("cropperStatusBarColor") ? options.getString("cropperStatusBarColor") : null; - cropperToolbarColor = options.hasKey("cropperToolbarColor") ? options.getString("cropperToolbarColor") : null; - cropperToolbarTitle = options.hasKey("cropperToolbarTitle") ? options.getString("cropperToolbarTitle") : null; - cropperToolbarWidgetColor = options.hasKey("cropperToolbarWidgetColor") ? options.getString("cropperToolbarWidgetColor") : null; - cropperCircleOverlay = options.hasKey("cropperCircleOverlay") && options.getBoolean("cropperCircleOverlay"); - freeStyleCropEnabled = options.hasKey("freeStyleCropEnabled") && options.getBoolean("freeStyleCropEnabled"); - showCropGuidelines = !options.hasKey("showCropGuidelines") || options.getBoolean("showCropGuidelines"); - showCropFrame = !options.hasKey("showCropFrame") || options.getBoolean("showCropFrame"); - hideBottomControls = options.hasKey("hideBottomControls") && options.getBoolean("hideBottomControls"); - enableRotationGesture = options.hasKey("enableRotationGesture") && options.getBoolean("enableRotationGesture"); - disableCropperColorSetters = options.hasKey("disableCropperColorSetters") && options.getBoolean("disableCropperColorSetters"); - useFrontCamera = options.hasKey("useFrontCamera") && options.getBoolean("useFrontCamera"); - this.options = options; - } - - private void deleteRecursive(File fileOrDirectory) { - if (fileOrDirectory.isDirectory()) { - for (File child : fileOrDirectory.listFiles()) { - deleteRecursive(child); - } - } - - fileOrDirectory.delete(); - } - - @ReactMethod - public void clean(final Promise promise) { - - final Activity activity = getCurrentActivity(); - final PickerModule module = this; - - if (activity == null) { - promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist"); - return; - } - - permissionsCheck(activity, promise, Collections.singletonList(Manifest.permission.WRITE_EXTERNAL_STORAGE), new Callable() { - @Override - public Void call() { - try { - File file = new File(module.getTmpDir(activity)); - if (!file.exists()) throw new Exception("File does not exist"); - - module.deleteRecursive(file); - promise.resolve(null); - } catch (Exception ex) { - ex.printStackTrace(); - promise.reject(E_ERROR_WHILE_CLEANING_FILES, ex.getMessage()); - } - - return null; - } - }); - } - - @ReactMethod - public void cleanSingle(final String pathToDelete, final Promise promise) { - if (pathToDelete == null) { - promise.reject(E_ERROR_WHILE_CLEANING_FILES, "Cannot cleanup empty path"); - return; - } - - final Activity activity = getCurrentActivity(); - final PickerModule module = this; - - if (activity == null) { - promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist"); - return; - } - - permissionsCheck(activity, promise, Collections.singletonList(Manifest.permission.WRITE_EXTERNAL_STORAGE), new Callable() { - @Override - public Void call() throws Exception { - try { - String path = pathToDelete; - final String filePrefix = "file://"; - if (path.startsWith(filePrefix)) { - path = path.substring(filePrefix.length()); - } - - File file = new File(path); - if (!file.exists()) throw new Exception("File does not exist. Path: " + path); - - module.deleteRecursive(file); - promise.resolve(null); - } catch (Exception ex) { - ex.printStackTrace(); - promise.reject(E_ERROR_WHILE_CLEANING_FILES, ex.getMessage()); - } - - return null; - } - }); - } - - private void permissionsCheck(final Activity activity, final Promise promise, final List requiredPermissions, final Callable callback) { - - List missingPermissions = new ArrayList<>(); - List supportedPermissions = new ArrayList<>(requiredPermissions); - - // android 11 introduced scoped storage, and WRITE_EXTERNAL_STORAGE no longer works there - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { - supportedPermissions.remove(Manifest.permission.WRITE_EXTERNAL_STORAGE); - } - - for (String permission : supportedPermissions) { - int status = ActivityCompat.checkSelfPermission(activity, permission); - if (status != PackageManager.PERMISSION_GRANTED) { - missingPermissions.add(permission); - } - } - - if (!missingPermissions.isEmpty()) { - - ((PermissionAwareActivity) activity).requestPermissions(missingPermissions.toArray(new String[missingPermissions.size()]), 1, new PermissionListener() { - - @Override - public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - if (requestCode == 1) { - - for (int permissionIndex = 0; permissionIndex < permissions.length; permissionIndex++) { - String permission = permissions[permissionIndex]; - int grantResult = grantResults[permissionIndex]; - - if (grantResult == PackageManager.PERMISSION_DENIED) { - if (permission.equals(Manifest.permission.CAMERA)) { - promise.reject(E_NO_CAMERA_PERMISSION_KEY, E_NO_CAMERA_PERMISSION_MSG); - } else if (permission.equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - promise.reject(E_NO_LIBRARY_PERMISSION_KEY, E_NO_LIBRARY_PERMISSION_MSG); - } else { - // should not happen, we fallback on E_NO_LIBRARY_PERMISSION_KEY rejection for minimal consistency - promise.reject(E_NO_LIBRARY_PERMISSION_KEY, "Required permission missing"); - } - return true; - } - } - - try { - callback.call(); - } catch (Exception e) { - promise.reject(E_CALLBACK_ERROR, "Unknown error", e); - } - } - - return true; - } - }); - - return; - } - - // all permissions granted - try { - callback.call(); - } catch (Exception e) { - promise.reject(E_CALLBACK_ERROR, "Unknown error", e); - } - } - - @ReactMethod - public void openCamera(final ReadableMap options, final Promise promise) { - final Activity activity = getCurrentActivity(); - - if (activity == null) { - promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist"); - return; - } - - if (!isCameraAvailable(activity)) { - promise.reject(E_CAMERA_IS_NOT_AVAILABLE, "Camera not available"); - return; - } - - setConfiguration(options); - resultCollector.setup(promise, false); - - permissionsCheck(activity, promise, Arrays.asList(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE), new Callable() { - @Override - public Void call() { - initiateCamera(activity); - return null; - } - }); - } - - private void initiateCamera(Activity activity) { - - try { - String intent; - File dataFile; - - if (mediaType.equals("video")) { - intent = MediaStore.ACTION_VIDEO_CAPTURE; - dataFile = createVideoFile(); - } else { - intent = MediaStore.ACTION_IMAGE_CAPTURE; - dataFile = createImageFile(); - } - - Intent cameraIntent = new Intent(intent); - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - mCameraCaptureURI = Uri.fromFile(dataFile); - } else { - mCameraCaptureURI = FileProvider.getUriForFile(activity, - activity.getApplicationContext().getPackageName() + ".provider", - dataFile); - } - - cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraCaptureURI); - - if (this.useFrontCamera) { - cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1); - cameraIntent.putExtra("android.intent.extras.LENS_FACING_FRONT", 1); - cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true); - } - - if (cameraIntent.resolveActivity(activity.getPackageManager()) == null) { - resultCollector.notifyProblem(E_CANNOT_LAUNCH_CAMERA, "Cannot launch camera"); - return; - } - - activity.startActivityForResult(cameraIntent, CAMERA_PICKER_REQUEST); - } catch (Exception e) { - resultCollector.notifyProblem(E_FAILED_TO_OPEN_CAMERA, e); - } - - } - - private void initiatePicker(final Activity activity) { - try { - final Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); - - if (cropping || mediaType.equals("photo")) { - galleryIntent.setType("image/*"); - if (cropping) { - String[] mimetypes = {"image/jpeg", "image/png"}; - galleryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); - } - } else if (mediaType.equals("video")) { - galleryIntent.setType("video/*"); - } else { - galleryIntent.setType("*/*"); - String[] mimetypes = {"image/*", "video/*"}; - galleryIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); - } - - galleryIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - galleryIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, multiple); - galleryIntent.addCategory(Intent.CATEGORY_OPENABLE); - - final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image"); - activity.startActivityForResult(chooserIntent, IMAGE_PICKER_REQUEST); - } catch (Exception e) { - resultCollector.notifyProblem(E_FAILED_TO_SHOW_PICKER, e); - } - } - - @ReactMethod - public void openPicker(final ReadableMap options, final Promise promise) { - final Activity activity = getCurrentActivity(); - - if (activity == null) { - promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist"); - return; - } - - setConfiguration(options); - resultCollector.setup(promise, multiple); - - permissionsCheck(activity, promise, Collections.singletonList(Manifest.permission.WRITE_EXTERNAL_STORAGE), new Callable() { - @Override - public Void call() { - initiatePicker(activity); - return null; - } - }); - } - - @ReactMethod - public void openCropper(final ReadableMap options, final Promise promise) { - final Activity activity = getCurrentActivity(); - - if (activity == null) { - promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist"); - return; - } - - setConfiguration(options); - resultCollector.setup(promise, false); - - final Uri uri = Uri.parse(options.getString("path")); - permissionsCheck(activity, promise, Collections.singletonList(Manifest.permission.WRITE_EXTERNAL_STORAGE), new Callable() { - @Override - public Void call() { - startCropping(activity, uri); - return null; - } - }); - } - - private String getBase64StringFromFile(String absoluteFilePath) { - InputStream inputStream; - - try { - inputStream = new FileInputStream(new File(absoluteFilePath)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; - } - - byte[] bytes; - byte[] buffer = new byte[8192]; - int bytesRead; - ByteArrayOutputStream output = new ByteArrayOutputStream(); - - try { - while ((bytesRead = inputStream.read(buffer)) != -1) { - output.write(buffer, 0, bytesRead); - } - } catch (IOException e) { - e.printStackTrace(); - } - - bytes = output.toByteArray(); - return Base64.encodeToString(bytes, Base64.NO_WRAP); - } - - private String getMimeType(String url) { - String mimeType = null; - Uri uri = Uri.fromFile(new File(url)); - if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { - ContentResolver cr = this.reactContext.getContentResolver(); - mimeType = cr.getType(uri); - } else { - String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri - .toString()); - if (fileExtension != null) { - mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase()); - } - } - return mimeType; - } - - private WritableMap getSelection(Activity activity, Uri uri, boolean isCamera) throws Exception { - String path = resolveRealPath(activity, uri, isCamera); - if (path == null || path.isEmpty()) { - throw new Exception("Cannot resolve asset path."); - } - - String mime = getMimeType(path); - if (mime != null && mime.startsWith("video/")) { - getVideo(activity, path, mime); - return null; - } - - return getImage(activity, path); - } - - private void getAsyncSelection(final Activity activity, Uri uri, boolean isCamera) throws Exception { - String path = resolveRealPath(activity, uri, isCamera); - if (path == null || path.isEmpty()) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, "Cannot resolve asset path."); - return; - } - - String mime = getMimeType(path); - if (mime != null && mime.startsWith("video/")) { - getVideo(activity, path, mime); - return; - } - - resultCollector.notifySuccess(getImage(activity, path)); - } - - private Bitmap validateVideo(String path) throws Exception { - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(path); - Bitmap bmp = retriever.getFrameAtTime(); - - if (bmp == null) { - throw new Exception("Cannot retrieve video data"); - } - - return bmp; - } - - private static Long getVideoDuration(String path) { - try { - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(path); - - return Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); - } - catch(Exception e) { - return -1L; - } - } - - private void getVideo(final Activity activity, final String path, final String mime) throws Exception { - validateVideo(path); - final String compressedVideoPath = getTmpDir(activity) + "/" + UUID.randomUUID().toString() + ".mp4"; - - new Thread(new Runnable() { - @Override - public void run() { - compression.compressVideo(activity, options, path, compressedVideoPath, new PromiseImpl(new Callback() { - @Override - public void invoke(Object... args) { - String videoPath = (String) args[0]; - - try { - Bitmap bmp = validateVideo(videoPath); - long modificationDate = new File(videoPath).lastModified(); - long duration = getVideoDuration(videoPath); - - WritableMap video = new WritableNativeMap(); - video.putInt("width", bmp.getWidth()); - video.putInt("height", bmp.getHeight()); - video.putString("mime", mime); - video.putInt("size", (int) new File(videoPath).length()); - video.putInt("duration", (int) duration); - video.putString("path", "file://" + videoPath); - video.putString("modificationDate", String.valueOf(modificationDate)); - - resultCollector.notifySuccess(video); - } catch (Exception e) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, e); - } - } - }, new Callback() { - @Override - public void invoke(Object... args) { - WritableNativeMap ex = (WritableNativeMap) args[0]; - resultCollector.notifyProblem(ex.getString("code"), ex.getString("message")); - } - })); - } - }).run(); - } - - private String resolveRealPath(Activity activity, Uri uri, boolean isCamera) throws IOException { - String path; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - path = RealPathUtil.getRealPathFromURI(activity, uri); - } else { - if (isCamera) { - Uri mediaUri = Uri.parse(mCurrentMediaPath); - path = mediaUri.getPath(); - } else { - path = RealPathUtil.getRealPathFromURI(activity, uri); - } - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - - String externalCacheDirPath = Uri.fromFile(activity.getExternalCacheDir()).getPath(); - String externalFilesDirPath = Uri.fromFile(activity.getExternalFilesDir(null)).getPath(); - String cacheDirPath = Uri.fromFile(activity.getCacheDir()).getPath(); - String FilesDirPath = Uri.fromFile(activity.getFilesDir()).getPath(); - - if (!path.startsWith(externalCacheDirPath) - && !path.startsWith(externalFilesDirPath) - && !path.startsWith(cacheDirPath) - && !path.startsWith(FilesDirPath)) { - File copiedFile = this.createExternalStoragePrivateFile(activity, uri); - path = RealPathUtil.getRealPathFromURI(activity, Uri.fromFile(copiedFile)); - } - } - - return path; - } - - private File createExternalStoragePrivateFile(Context context, Uri uri) throws FileNotFoundException { - InputStream inputStream = context.getContentResolver().openInputStream(uri); - - String extension = this.getExtension(context, uri); - File file = new File(context.getExternalCacheDir(), "/temp/" + System.currentTimeMillis() + "." + extension); - File parentFile = file.getParentFile(); - if (parentFile != null) { - parentFile.mkdirs(); - } - - try { - // Very simple code to copy a picture from the application's - // resource into the external file. Note that this code does - // no error checking, and assumes the picture is small (does not - // try to copy it in chunks). Note that if external storage is - // not currently mounted this will silently fail. - OutputStream outputStream = new FileOutputStream(file); - byte[] data = new byte[inputStream.available()]; - inputStream.read(data); - outputStream.write(data); - inputStream.close(); - outputStream.close(); - } catch (IOException e) { - // Unable to create file, likely because external storage is - // not currently mounted. - Log.w("image-crop-picker", "Error writing " + file, e); - } - - return file; - } - - public String getExtension(Context context, Uri uri) { - String extension; - - //Check uri format to avoid null - if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { - //If scheme is a content - final MimeTypeMap mime = MimeTypeMap.getSingleton(); - extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri)); - } else { - //If scheme is a File - //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters. - extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString()); - - } - - return extension; - } - - private BitmapFactory.Options validateImage(String path) throws Exception { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inJustDecodeBounds = true; - options.inPreferredConfig = Bitmap.Config.RGB_565; - options.inDither = true; - - BitmapFactory.decodeFile(path, options); - - if (options.outMimeType == null || options.outWidth == 0 || options.outHeight == 0) { - throw new Exception("Invalid image selected"); - } - - return options; - } - - private WritableMap getImage(final Activity activity, String path) throws Exception { - WritableMap image = new WritableNativeMap(); - - if (path.startsWith("http://") || path.startsWith("https://")) { - throw new Exception("Cannot select remote files"); - } - BitmapFactory.Options original = validateImage(path); - - // if compression options are provided image will be compressed. If none options is provided, - // then original image will be returned - File compressedImage = compression.compressImage(this.reactContext, options, path, original); - String compressedImagePath = compressedImage.getPath(); - BitmapFactory.Options options = validateImage(compressedImagePath); - long modificationDate = new File(path).lastModified(); - - image.putString("path", "file://" + compressedImagePath); - image.putInt("width", options.outWidth); - image.putInt("height", options.outHeight); - image.putString("mime", options.outMimeType); - image.putInt("size", (int) new File(compressedImagePath).length()); - image.putString("modificationDate", String.valueOf(modificationDate)); - - if (includeBase64) { - image.putString("data", getBase64StringFromFile(compressedImagePath)); - } - - if (includeExif) { - try { - WritableMap exif = ExifExtractor.extract(path); - image.putMap("exif", exif); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - return image; - } - - private void configureCropperColors(UCrop.Options options) { - if (cropperActiveWidgetColor != null) { - options.setActiveControlsWidgetColor(Color.parseColor(cropperActiveWidgetColor)); - } - - if (cropperToolbarColor != null) { - options.setToolbarColor(Color.parseColor(cropperToolbarColor)); - } - - if (cropperStatusBarColor != null) { - options.setStatusBarColor(Color.parseColor(cropperStatusBarColor)); - } - - if (cropperToolbarWidgetColor != null) { - options.setToolbarWidgetColor(Color.parseColor(cropperToolbarWidgetColor)); - } - } - - private void startCropping(final Activity activity, final Uri uri) { - UCrop.Options options = new UCrop.Options(); - options.setCompressionFormat(Bitmap.CompressFormat.JPEG); - options.setCompressionQuality(100); - options.setCircleDimmedLayer(cropperCircleOverlay); - options.setFreeStyleCropEnabled(freeStyleCropEnabled); - options.setShowCropGrid(showCropGuidelines); - options.setShowCropFrame(showCropFrame); - options.setHideBottomControls(hideBottomControls); - - if (cropperToolbarTitle != null) { - options.setToolbarTitle(cropperToolbarTitle); - } - - if (enableRotationGesture) { - // UCropActivity.ALL = enable both rotation & scaling - options.setAllowedGestures( - UCropActivity.ALL, // When 'scale'-tab active - UCropActivity.ALL, // When 'rotate'-tab active - UCropActivity.ALL // When 'aspect ratio'-tab active - ); - } - - if (!disableCropperColorSetters) { - configureCropperColors(options); - } - - UCrop uCrop = UCrop - .of(uri, Uri.fromFile(new File(this.getTmpDir(activity), UUID.randomUUID().toString() + ".jpg"))) - .withOptions(options); - - if (width > 0 && height > 0) { - uCrop.withAspectRatio(width, height); - } - - uCrop.start(activity); - } - - private void imagePickerResult(Activity activity, final int requestCode, final int resultCode, final Intent data) { - if (resultCode == Activity.RESULT_CANCELED) { - resultCollector.notifyProblem(E_PICKER_CANCELLED_KEY, E_PICKER_CANCELLED_MSG); - } else if (resultCode == Activity.RESULT_OK) { - if (multiple) { - ClipData clipData = data.getClipData(); - - try { - // only one image selected - if (clipData == null) { - resultCollector.setWaitCount(1); - getAsyncSelection(activity, data.getData(), false); - } else { - resultCollector.setWaitCount(clipData.getItemCount()); - for (int i = 0; i < clipData.getItemCount(); i++) { - getAsyncSelection(activity, clipData.getItemAt(i).getUri(), false); - } - } - } catch (Exception ex) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, ex.getMessage()); - } - - } else { - Uri uri = data.getData(); - - if (uri == null) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, "Cannot resolve image url"); - return; - } - - if (cropping) { - startCropping(activity, uri); - } else { - try { - getAsyncSelection(activity, uri, false); - } catch (Exception ex) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, ex.getMessage()); - } - } - } - } - } - - private void cameraPickerResult(Activity activity, final int requestCode, final int resultCode, final Intent data) { - if (resultCode == Activity.RESULT_CANCELED) { - resultCollector.notifyProblem(E_PICKER_CANCELLED_KEY, E_PICKER_CANCELLED_MSG); - } else if (resultCode == Activity.RESULT_OK) { - Uri uri = mCameraCaptureURI; - - if (uri == null) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, "Cannot resolve image url"); - return; - } - - if (cropping) { - UCrop.Options options = new UCrop.Options(); - options.setCompressionFormat(Bitmap.CompressFormat.JPEG); - startCropping(activity, uri); - } else { - try { - resultCollector.setWaitCount(1); - WritableMap result = getSelection(activity, uri, true); - - // If recording a video getSelection handles resultCollector part itself and returns null - if (result != null) { - resultCollector.notifySuccess(result); - } - } catch (Exception ex) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, ex.getMessage()); - } - } - } - } - - private void croppingResult(Activity activity, final int requestCode, final int resultCode, final Intent data) { - if (data != null) { - Uri resultUri = UCrop.getOutput(data); - - if (resultUri != null) { - try { - if (width > 0 && height > 0) { - File resized = compression.resize(this.reactContext, resultUri.getPath(), width, height, width, height, 100); - resultUri = Uri.fromFile(resized); - } - - WritableMap result = getSelection(activity, resultUri, false); - - if (result != null) { - result.putMap("cropRect", PickerModule.getCroppedRectMap(data)); - - resultCollector.setWaitCount(1); - resultCollector.notifySuccess(result); - } else { - throw new Exception("Cannot crop video files"); - } - } catch (Exception ex) { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, ex.getMessage()); - } - } else { - resultCollector.notifyProblem(E_NO_IMAGE_DATA_FOUND, "Cannot find image data"); - } - } else { - resultCollector.notifyProblem(E_PICKER_CANCELLED_KEY, E_PICKER_CANCELLED_MSG); - } - } - - @Override - public void onActivityResult(Activity activity, final int requestCode, final int resultCode, final Intent data) { - if (requestCode == IMAGE_PICKER_REQUEST) { - imagePickerResult(activity, requestCode, resultCode, data); - } else if (requestCode == CAMERA_PICKER_REQUEST) { - cameraPickerResult(activity, requestCode, resultCode, data); - } else if (requestCode == UCrop.REQUEST_CROP) { - croppingResult(activity, requestCode, resultCode, data); - } - } - - @Override - public void onNewIntent(Intent intent) { - } - - private boolean isCameraAvailable(Activity activity) { - return activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA) - || activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY); - } - - private File createImageFile() throws IOException { - - String imageFileName = "image-" + UUID.randomUUID().toString(); - File path = this.reactContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES); - - if (!path.exists() && !path.isDirectory()) { - path.mkdirs(); - } - - File image = File.createTempFile(imageFileName, ".jpg", path); - - // Save a file: path for use with ACTION_VIEW intents - mCurrentMediaPath = "file:" + image.getAbsolutePath(); - - return image; - - } - - private File createVideoFile() throws IOException { - - String videoFileName = "video-" + UUID.randomUUID().toString(); - File path = this.reactContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES); - - if (!path.exists() && !path.isDirectory()) { - path.mkdirs(); - } - - File video = File.createTempFile(videoFileName, ".mp4", path); - - // Save a file: path for use with ACTION_VIEW intents - mCurrentMediaPath = "file:" + video.getAbsolutePath(); - - return video; - - } - - private static WritableMap getCroppedRectMap(Intent data) { - final int DEFAULT_VALUE = -1; - final WritableMap map = new WritableNativeMap(); - - map.putInt("x", data.getIntExtra(UCrop.EXTRA_OUTPUT_OFFSET_X, DEFAULT_VALUE)); - map.putInt("y", data.getIntExtra(UCrop.EXTRA_OUTPUT_OFFSET_Y, DEFAULT_VALUE)); - map.putInt("width", data.getIntExtra(UCrop.EXTRA_OUTPUT_IMAGE_WIDTH, DEFAULT_VALUE)); - map.putInt("height", data.getIntExtra(UCrop.EXTRA_OUTPUT_IMAGE_HEIGHT, DEFAULT_VALUE)); - - return map; - } -} diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerPackage.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerPackage.java deleted file mode 100644 index 092ed9bbc035b41d708d062c752c3532c738ac86..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/PickerPackage.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import com.facebook.react.ReactPackage; -import com.facebook.react.bridge.JavaScriptModule; -import com.facebook.react.bridge.NativeModule; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.uimanager.ViewManager; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Created by ipusic on 5/16/16. - */ -public class PickerPackage implements ReactPackage { - - // Deprecated RN 0.47 - public List> createJSModules() { - return Collections.emptyList(); - } - - @Override - public List createViewManagers(ReactApplicationContext reactContext) { - return Collections.emptyList(); - } - - @Override - public List createNativeModules(ReactApplicationContext reactContext) { - List modules = new ArrayList<>(); - modules.add(new PickerModule(reactContext)); - - return modules; - } -} diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java deleted file mode 100644 index bcc5dd693c7c845c50622491dfc3a9dcc1d60e0a..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/RealPathUtil.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import android.annotation.TargetApi; -import android.content.ContentUris; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build; -import android.os.Environment; -import android.provider.DocumentsContract; -import android.provider.MediaStore; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; - -class RealPathUtil { - @TargetApi(Build.VERSION_CODES.KITKAT) - static String getRealPathFromURI(final Context context, final Uri uri) throws IOException { - - final boolean isKitKat = Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT; - - // DocumentProvider - if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { - // ExternalStorageProvider - if (isExternalStorageDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - if ("primary".equalsIgnoreCase(type)) { - return Environment.getExternalStorageDirectory() + "/" + split[1]; - } else { - final int splitIndex = docId.indexOf(':', 1); - final String tag = docId.substring(0, splitIndex); - final String path = docId.substring(splitIndex + 1); - - String nonPrimaryVolume = getPathToNonPrimaryVolume(context, tag); - if (nonPrimaryVolume != null) { - String result = nonPrimaryVolume + "/" + path; - File file = new File(result); - if (file.exists() && file.canRead()) { - return result; - } - return null; - } - } - } - // DownloadsProvider - else if (isDownloadsDocument(uri)) { - final String id = DocumentsContract.getDocumentId(uri); - final Uri contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); - - return getDataColumn(context, contentUri, null, null); - } - // MediaProvider - else if (isMediaDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - Uri contentUri = null; - if ("image".equals(type)) { - contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } else if ("video".equals(type)) { - contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } else if ("audio".equals(type)) { - contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } - - final String selection = "_id=?"; - final String[] selectionArgs = new String[] { - split[1] - }; - - return getDataColumn(context, contentUri, selection, selectionArgs); - } - } - // MediaStore (and general) - else if ("content".equalsIgnoreCase(uri.getScheme())) { - // Return the remote address - if (isGooglePhotosUri(uri)) - return uri.getLastPathSegment(); - return getDataColumn(context, uri, null, null); - } - // File - else if ("file".equalsIgnoreCase(uri.getScheme())) { - return uri.getPath(); - } - - return null; - } - - /** - * If an image/video has been selected from a cloud storage, this method - * should be call to download the file in the cache folder. - * - * @param context The context - * @param fileName donwloaded file's name - * @param uri file's URI - * @return file that has been written - */ - private static File writeToFile(Context context, String fileName, Uri uri) { - String tmpDir = context.getCacheDir() + "/react-native-image-crop-picker"; - Boolean created = new File(tmpDir).mkdir(); - fileName = fileName.substring(fileName.lastIndexOf('/') + 1); - File path = new File(tmpDir); - File file = new File(path, fileName); - try { - FileOutputStream oos = new FileOutputStream(file); - byte[] buf = new byte[8192]; - InputStream is = context.getContentResolver().openInputStream(uri); - int c = 0; - while ((c = is.read(buf, 0, buf.length)) > 0) { - oos.write(buf, 0, c); - oos.flush(); - } - oos.close(); - is.close(); - } catch (Exception e) { - e.printStackTrace(); - } - return file; - } - - /** - * Get the value of the data column for this Uri. This is useful for - * MediaStore Uris, and other file-based ContentProviders. - * - * @param context The context. - * @param uri The Uri to query. - * @param selection (Optional) Filter used in the query. - * @param selectionArgs (Optional) Selection arguments used in the query. - * @return The value of the _data column, which is typically a file path. - */ - private static String getDataColumn(Context context, Uri uri, String selection, - String[] selectionArgs) { - - Cursor cursor = null; - final String[] projection = { - MediaStore.MediaColumns.DATA, - MediaStore.MediaColumns.DISPLAY_NAME, - }; - - try { - cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, - null); - if (cursor != null && cursor.moveToFirst()) { - // Fall back to writing to file if _data column does not exist - final int index = cursor.getColumnIndex(MediaStore.MediaColumns.DATA); - String path = index > -1 ? cursor.getString(index) : null; - if (path != null) { - return cursor.getString(index); - } else { - final int indexDisplayName = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME); - String fileName = cursor.getString(indexDisplayName); - File fileWritten = writeToFile(context, fileName, uri); - return fileWritten.getAbsolutePath(); - } - } - } finally { - if (cursor != null) - cursor.close(); - } - return null; - } - - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is ExternalStorageProvider. - */ - private static boolean isExternalStorageDocument(Uri uri) { - return "com.android.externalstorage.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is DownloadsProvider. - */ - private static boolean isDownloadsDocument(Uri uri) { - return "com.android.providers.downloads.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is MediaProvider. - */ - private static boolean isMediaDocument(Uri uri) { - return "com.android.providers.media.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is Google Photos. - */ - private static boolean isGooglePhotosUri(Uri uri) { - return "com.google.android.apps.photos.content".equals(uri.getAuthority()); - } - - @TargetApi(Build.VERSION_CODES.KITKAT) - private static String getPathToNonPrimaryVolume(Context context, String tag) { - File[] volumes = context.getExternalCacheDirs(); - if (volumes != null) { - for (File volume : volumes) { - if (volume != null) { - String path = volume.getAbsolutePath(); - if (path != null) { - int index = path.indexOf(tag); - if (index != -1) { - return path.substring(0, index) + tag; - } - } - } - } - } - return null; - } - -} diff --git a/android/src/main/java/com/reactnative/ivpusic/imagepicker/ResultCollector.java b/android/src/main/java/com/reactnative/ivpusic/imagepicker/ResultCollector.java deleted file mode 100644 index 8bd1b604ffa30a319533b6f7bf774ff0609812c6..0000000000000000000000000000000000000000 --- a/android/src/main/java/com/reactnative/ivpusic/imagepicker/ResultCollector.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.reactnative.ivpusic.imagepicker; - -import android.util.Log; - -import com.facebook.react.bridge.Promise; -import com.facebook.react.bridge.WritableArray; -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.bridge.WritableNativeArray; - -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Created by ipusic on 12/28/16. - */ - -class ResultCollector { - private Promise promise; - private int waitCount; - private boolean multiple; - private AtomicInteger waitCounter; - private WritableArray arrayResult; - private boolean resultSent; - - synchronized void setup(Promise promise, boolean multiple) { - this.promise = promise; - this.multiple = multiple; - - this.resultSent = false; - this.waitCount = 0; - this.waitCounter = new AtomicInteger(0); - - if (multiple) { - this.arrayResult = new WritableNativeArray(); - } - } - - // if user has provided "multiple" option, we will wait for X number of result to come, - // and also return result as an array - synchronized void setWaitCount(int waitCount) { - this.waitCount = waitCount; - this.waitCounter = new AtomicInteger(0); - } - - synchronized private boolean isRequestValid() { - if (resultSent) { - Log.w("image-crop-picker", "Skipping result, already sent..."); - return false; - } - - if (promise == null) { - Log.w("image-crop-picker", "Trying to notify success but promise is not set"); - return false; - } - - return true; - } - - synchronized void notifySuccess(WritableMap result) { - if (!isRequestValid()) { - return; - } - - if (multiple) { - arrayResult.pushMap(result); - int currentCount = waitCounter.addAndGet(1); - - if (currentCount == waitCount) { - promise.resolve(arrayResult); - resultSent = true; - } - } else { - promise.resolve(result); - resultSent = true; - } - } - - synchronized void notifyProblem(String code, String message) { - if (!isRequestValid()) { - return; - } - - Log.e("image-crop-picker", "Promise rejected. " + message); - promise.reject(code, message); - resultSent = true; - } - - synchronized void notifyProblem(String code, Throwable throwable) { - if (!isRequestValid()) { - return; - } - - Log.e("image-crop-picker", "Promise rejected. " + throwable.getMessage()); - promise.reject(code, throwable); - resultSent = true; - } -} diff --git a/android/src/main/res/xml/ivpusic_imagepicker_provider_paths.xml b/android/src/main/res/xml/ivpusic_imagepicker_provider_paths.xml deleted file mode 100644 index ffa74ab5621d088e0a3b7e0fc94e0f0a7455a434..0000000000000000000000000000000000000000 --- a/android/src/main/res/xml/ivpusic_imagepicker_provider_paths.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/android/src/test/test.iml b/android/src/test/test.iml deleted file mode 100644 index a0e49a3baa857bd26e0ea60708320d9c304b9aa8..0000000000000000000000000000000000000000 --- a/android/src/test/test.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/example/.buckconfig b/example/.buckconfig deleted file mode 100644 index 934256cb29d4a3616c740861c6af35ff6a165917..0000000000000000000000000000000000000000 --- a/example/.buckconfig +++ /dev/null @@ -1,6 +0,0 @@ - -[android] - target = Google Inc.:Google APIs:23 - -[maven_repositories] - central = https://repo1.maven.org/maven2 diff --git a/example/.flowconfig b/example/.flowconfig deleted file mode 100644 index 3b261e22da8485120bbcc80dd4903007563d8ee8..0000000000000000000000000000000000000000 --- a/example/.flowconfig +++ /dev/null @@ -1,58 +0,0 @@ -[ignore] - -# We fork some components by platform. -.*/*[.]android.js - -# Ignore templates with `@flow` in header -.*/local-cli/generator.* - -# Ignore malformed json -.*/node_modules/y18n/test/.*\.json - -# Ignore the website subdir -/website/.* - -# Ignore BUCK generated dirs -/\.buckd/ - -# Ignore unexpected extra @providesModule -.*/node_modules/commoner/test/source/widget/share.js - -# Ignore duplicate module providers -# For RN Apps installed via npm, "Libraries" folder is inside node_modules/react-native but in the source repo it is in the root -.*/Libraries/react-native/React.js -.*/Libraries/react-native/ReactNative.js -.*/node_modules/jest-runtime/build/__tests__/.* - -[include] - -[libs] -node_modules/react-native/Libraries/react-native/react-native-interface.js -node_modules/react-native/flow -flow/ - -[options] -module.system=haste - -esproposal.class_static_fields=enable -esproposal.class_instance_fields=enable - -experimental.strict_type_args=true - -munge_underscores=true - -module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' -module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' - -suppress_type=$FlowIssue -suppress_type=$FlowFixMe -suppress_type=$FixMe - -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-3]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-3]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ -suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy - -unsafe.enable_getters_and_setters=true - -[version] -^0.33.0 diff --git a/example/.gitignore b/example/.gitignore deleted file mode 100644 index eb1535e41e3df728de37aa551c2c387f8bbc31e0..0000000000000000000000000000000000000000 --- a/example/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android/IJ -# -*.iml -.idea -.gradle -local.properties - -# node.js -# -node_modules/ -npm-debug.log - -# BUCK -buck-out/ -\.buckd/ -android/app/libs -android/keystores/debug.keystore diff --git a/example/.watchmanconfig b/example/.watchmanconfig deleted file mode 100644 index 9e26dfeeb6e641a33dae4961196235bdb965b21b..0000000000000000000000000000000000000000 --- a/example/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/example/README.md b/example/README.md deleted file mode 100644 index bf13df74fd0ce13219bf3393b0f00612edc0958c..0000000000000000000000000000000000000000 --- a/example/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Example project - -## Install deps - -```bash -cd example -yarn install -``` - -## Running (ios) - -```bash -cd example -yarn ios -``` - -## Running (android) - -```bash -cd example -yarn android -``` \ No newline at end of file diff --git a/example/android/app/BUCK b/example/android/app/BUCK deleted file mode 100644 index 2ebdb984b076011f5fe2459442da5e9eee930e6d..0000000000000000000000000000000000000000 --- a/example/android/app/BUCK +++ /dev/null @@ -1,66 +0,0 @@ -import re - -# 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 -# - -lib_deps = [] -for jarfile in glob(['libs/*.jar']): - name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile) - lib_deps.append(':' + name) - prebuilt_jar( - name = name, - binary_jar = jarfile, - ) - -for aarfile in glob(['libs/*.aar']): - name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile) - lib_deps.append(':' + name) - android_prebuilt_aar( - name = name, - aar = aarfile, - ) - -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.example', -) - -android_resource( - name = 'res', - res = 'src/main/res', - package = 'com.example', -) - -android_binary( - name = 'app', - package_type = 'debug', - manifest = 'src/main/AndroidManifest.xml', - keystore = '//android/keystores:debug', - deps = [ - ':app-code', - ], -) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle deleted file mode 100644 index 8b1ef31f0c158acc0cf6d1d1a71c39074dc92902..0000000000000000000000000000000000000000 --- a/example/android/app/build.gradle +++ /dev/null @@ -1,204 +0,0 @@ -apply plugin: "com.android.application" - -import com.android.build.OutputFile - -/** - * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets - * and bundleReleaseJsAndAssets). - * These basically call `react-native bundle` with the correct arguments during the Android build - * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the - * bundle directly from the development server. Below you can see all the possible configurations - * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "../../node_modules/react-native/react.gradle"` line. - * - * project.ext.react = [ - * // the name of the generated asset file containing your JS bundle - * bundleAssetName: "index.android.bundle", - * - * // the entry file for bundle generation - * entryFile: "index.android.js", - * - * // https://facebook.github.io/react-native/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 = [ - entryFile : "index.js", - 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 mirrored 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) - -android { - compileSdkVersion rootProject.ext.compileSdkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - defaultConfig { - applicationId "com.example" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - - ndk { - abiFilters 'armeabi-v7a', 'x86' - } - } - splits { - abi { - reset() - enable enableSeparateBuildPerCPUArchitecture - universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" - } - } - buildTypes { - debug { - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://facebook.github.io/react-native/docs/signed-apk-android. - 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 - 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 = - versionCodes.get(abi) * 1048576 + defaultConfig.versionCode - } - - } - } - - packagingOptions { - pickFirst '**/armeabi-v7a/libc++_shared.so' - pickFirst '**/x86/libc++_shared.so' - pickFirst '**/arm64-v8a/libc++_shared.so' - pickFirst '**/x86_64/libc++_shared.so' - pickFirst '**/x86/libjsc.so' - pickFirst '**/armeabi-v7a/libjsc.so' - } -} - -dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation "com.facebook.react:react-native:+" // From node_modules - - if (enableHermes) { - def hermesPath = "../../node_modules/hermesvm/android/"; - debugImplementation files(hermesPath + "hermes-debug.aar") - releaseImplementation files(hermesPath + "hermes-release.aar") - } else { - implementation jscFlavor - } -} - -// Run this once to be able to run the application with BUCK -// puts all compile dependencies into folder libs for BUCK to use -task copyDownloadableDepsToLibs(type: Copy) { - from configurations.compile - into 'libs' -} - -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/example/android/app/proguard-rules.pro b/example/android/app/proguard-rules.pro deleted file mode 100644 index 48361a9015dc506ec9a8dd97336d5450246366e0..0000000000000000000000000000000000000000 --- a/example/android/app/proguard-rules.pro +++ /dev/null @@ -1,66 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Disabling obfuscation is useful if you collect stack traces from production crashes -# (unless you are using a system that supports de-obfuscate the stack traces). --dontobfuscate - -# React Native - -# Keep our interfaces so they can be used by other ProGuard rules. -# See http://sourceforge.net/p/proguard/bugs/466/ --keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip --keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters --keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip - -# Do not strip any method/class that is annotated with @DoNotStrip --keep @com.facebook.proguard.annotations.DoNotStrip class * --keep @com.facebook.common.internal.DoNotStrip class * --keepclassmembers class * { - @com.facebook.proguard.annotations.DoNotStrip *; - @com.facebook.common.internal.DoNotStrip *; -} - --keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { - void set*(***); - *** get*(); -} - --keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } --keep class * extends com.facebook.react.bridge.NativeModule { *; } --keepclassmembers,includedescriptorclasses class * { native ; } --keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } --keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } --keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } - --dontwarn com.facebook.react.** - -# okhttp - --keepattributes Signature --keepattributes *Annotation* --keep class okhttp3.** { *; } --keep interface okhttp3.** { *; } --dontwarn okhttp3.** - -# okio - --keep class sun.misc.Unsafe { *; } --dontwarn java.nio.file.* --dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement --dontwarn okio.** diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index c741c4f9ab444678975001e48625fa3a438e98af..0000000000000000000000000000000000000000 --- a/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/example/android/app/src/main/java/com/example/MainActivity.java b/example/android/app/src/main/java/com/example/MainActivity.java deleted file mode 100644 index 877a3363d7895c0a789ab1ab0f6b11bdadd66a61..0000000000000000000000000000000000000000 --- a/example/android/app/src/main/java/com/example/MainActivity.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example; - -import android.os.Bundle; - -import com.facebook.react.ReactActivity; -import com.facebook.soloader.SoLoader; - -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 "example"; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - SoLoader.init(this, /* native exopackage */ false); - super.onCreate(savedInstanceState); - } -} diff --git a/example/android/app/src/main/java/com/example/MainApplication.java b/example/android/app/src/main/java/com/example/MainApplication.java deleted file mode 100644 index 0bf210e14e7c632fc810db22130fa480f3164445..0000000000000000000000000000000000000000 --- a/example/android/app/src/main/java/com/example/MainApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.example; - -import android.app.Application; - -import com.facebook.react.PackageList; -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; - -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 - public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; - } -} diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 3f7c244b16e79fd01fd7ef7e1af206e601120427..0000000000000000000000000000000000000000 Binary files a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 5a6ea37e2069175c5ec305b160002dfc7dae3dc2..0000000000000000000000000000000000000000 Binary files a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 424e38916af24744e05f3f76a8fbef88fb903eb6..0000000000000000000000000000000000000000 Binary files a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index efc21941d03f206fb5b79b784bdd8377a93d29a6..0000000000000000000000000000000000000000 Binary files a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/example/android/app/src/main/res/values/strings.xml b/example/android/app/src/main/res/values/strings.xml deleted file mode 100644 index d941c0598377090227f86ccb922625b4151a379b..0000000000000000000000000000000000000000 --- a/example/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - example - diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 319eb0ca100b5aae62b669a5f375ec234aabe351..0000000000000000000000000000000000000000 --- a/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/example/android/build.gradle b/example/android/build.gradle deleted file mode 100644 index acde5569b6859e7b4a7f520b08c90ef14d6a617e..0000000000000000000000000000000000000000 --- a/example/android/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - buildToolsVersion = "29.0.3" - minSdkVersion = 21 - compileSdkVersion = 30 - targetSdkVersion = 30 - supportLibVersion = "28.0.0" - } - repositories { - jcenter() - maven { - url 'https://maven.google.com/' - name 'Google' - } - google() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - mavenLocal() - jcenter() - maven { url "$rootDir/../node_modules/react-native/android" } - maven { - // Android JSC is installed from npm - url("$rootDir/../node_modules/jsc-android/dist") - } - maven { url 'https://maven.google.com' } - maven { url "https://jitpack.io" } - maven { - url 'https://maven.google.com/' - name 'Google' - } - } -} diff --git a/example/android/gradle.properties b/example/android/gradle.properties deleted file mode 100644 index 812ac84eb3e7998866242a02a0fdefaad69dbd55..0000000000000000000000000000000000000000 --- a/example/android/gradle.properties +++ /dev/null @@ -1,23 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -android.useDeprecatedNdk=true - -android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index b5166dad4d90021f6a0b45268c0755719f1d5cd4..0000000000000000000000000000000000000000 Binary files a/example/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index cc29d22dcfffe0de0447f418c06457b44815198d..0000000000000000000000000000000000000000 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue Jun 09 15:29:41 CEST 2020 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/example/android/gradlew b/example/android/gradlew deleted file mode 100755 index 91a7e269e19dfc62e27137a0b57ef3e430cee4fd..0000000000000000000000000000000000000000 --- a/example/android/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat deleted file mode 100644 index aec99730b4e8fcd90b57a0e8e01544fea7c31a89..0000000000000000000000000000000000000000 --- a/example/android/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/example/android/keystores/BUCK b/example/android/keystores/BUCK deleted file mode 100644 index 15da20e6b92c3f1d08cb9ea6bfbb56138d7bec86..0000000000000000000000000000000000000000 --- a/example/android/keystores/BUCK +++ /dev/null @@ -1,8 +0,0 @@ -keystore( - name = 'debug', - store = 'debug.keystore', - properties = 'debug.keystore.properties', - visibility = [ - 'PUBLIC', - ], -) diff --git a/example/android/keystores/debug.keystore.properties b/example/android/keystores/debug.keystore.properties deleted file mode 100644 index 121bfb49f0dfda7b85011c9d1442c9b9f940c9bb..0000000000000000000000000000000000000000 --- a/example/android/keystores/debug.keystore.properties +++ /dev/null @@ -1,4 +0,0 @@ -key.store=debug.keystore -key.alias=androiddebugkey -key.store.password=android -key.alias.password=android diff --git a/example/android/settings.gradle b/example/android/settings.gradle deleted file mode 100644 index ab26400bc38e3da72d4cec260d78dc667d3ecc56..0000000000000000000000000000000000000000 --- a/example/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -rootProject.name = 'example' - -apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) - -include ':app' \ No newline at end of file diff --git a/example/app.js b/example/app.js deleted file mode 100644 index 14ca9c0e42a22e545db2bf14f9f8f6b700ba5973..0000000000000000000000000000000000000000 --- a/example/app.js +++ /dev/null @@ -1,318 +0,0 @@ -import React, { Component } from 'react'; -import { Alert, Image, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; -import ImagePicker from 'react-native-image-crop-picker'; -import Video from 'react-native-video'; - -const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - button: { - backgroundColor: 'blue', - marginBottom: 10, - }, - text: { - color: 'white', - fontSize: 20, - textAlign: 'center', - }, -}); - -export default class App extends Component { - constructor() { - super(); - this.state = { - image: null, - images: null, - }; - } - - pickSingleWithCamera(cropping, mediaType = 'photo') { - ImagePicker.openCamera({ - cropping: cropping, - width: 500, - height: 500, - includeExif: true, - mediaType, - }) - .then((image) => { - console.log('received image', image); - this.setState({ - image: { - uri: image.path, - width: image.width, - height: image.height, - mime: image.mime, - }, - images: null, - }); - }) - .catch((e) => alert(e)); - } - - pickSingleBase64(cropit) { - ImagePicker.openPicker({ - width: 300, - height: 300, - cropping: cropit, - includeBase64: true, - includeExif: true, - }) - .then((image) => { - console.log('received base64 image'); - this.setState({ - image: { - uri: `data:${image.mime};base64,` + image.data, - width: image.width, - height: image.height, - }, - images: null, - }); - }) - .catch((e) => alert(e)); - } - - cleanupImages() { - ImagePicker.clean() - .then(() => { - console.log('removed tmp images from tmp directory'); - }) - .catch((e) => { - alert(e); - }); - } - - cleanupSingleImage() { - let image = - this.state.image || - (this.state.images && this.state.images.length - ? this.state.images[0] - : null); - console.log('will cleanup image', image); - - ImagePicker.cleanSingle(image ? image.uri : null) - .then(() => { - console.log(`removed tmp image ${image.uri} from tmp directory`); - }) - .catch((e) => { - alert(e); - }); - } - - cropLast() { - if (!this.state.image) { - return Alert.alert( - 'No image', - 'Before open cropping only, please select image' - ); - } - - ImagePicker.openCropper({ - path: this.state.image.uri, - width: 200, - height: 200, - }) - .then((image) => { - console.log('received cropped image', image); - this.setState({ - image: { - uri: image.path, - width: image.width, - height: image.height, - mime: image.mime, - }, - images: null, - }); - }) - .catch((e) => { - console.log(e); - Alert.alert(e.message ? e.message : e); - }); - } - - pickSingle(cropit, circular = false, mediaType) { - ImagePicker.openPicker({ - width: 500, - height: 500, - cropping: cropit, - cropperCircleOverlay: circular, - sortOrder: 'none', - compressImageMaxWidth: 1000, - compressImageMaxHeight: 1000, - compressImageQuality: 1, - compressVideoPreset: 'MediumQuality', - includeExif: true, - cropperStatusBarColor: 'white', - cropperToolbarColor: 'white', - cropperActiveWidgetColor: 'white', - cropperToolbarWidgetColor: '#3498DB', - }) - .then((image) => { - console.log('received image', image); - this.setState({ - image: { - uri: image.path, - width: image.width, - height: image.height, - mime: image.mime, - }, - images: null, - }); - }) - .catch((e) => { - console.log(e); - Alert.alert(e.message ? e.message : e); - }); - } - - pickMultiple() { - ImagePicker.openPicker({ - multiple: true, - waitAnimationEnd: false, - sortOrder: 'desc', - includeExif: true, - forceJpg: true, - }) - .then((images) => { - this.setState({ - image: null, - images: images.map((i) => { - console.log('received image', i); - return { - uri: i.path, - width: i.width, - height: i.height, - mime: i.mime, - }; - }), - }); - }) - .catch((e) => alert(e)); - } - - scaledHeight(oldW, oldH, newW) { - return (oldH / oldW) * newW; - } - - renderVideo(video) { - console.log('rendering video'); - return ( - - - ); - } - - renderImage(image) { - return ( - - ); - } - - renderAsset(image) { - if (image.mime && image.mime.toLowerCase().indexOf('video/') !== -1) { - return this.renderVideo(image); - } - - return this.renderImage(image); - } - - render() { - return ( - - - {this.state.image ? this.renderAsset(this.state.image) : null} - {this.state.images - ? this.state.images.map((i) => ( - {this.renderAsset(i)} - )) - : null} - - - this.pickSingleWithCamera(false)} - style={styles.button} - > - Select Single Image With Camera - - - this.pickSingleWithCamera(false, (mediaType = 'video')) - } - style={styles.button} - > - Select Single Video With Camera - - this.pickSingleWithCamera(true)} - style={styles.button} - > - - Select Single With Camera With Cropping - - - this.pickSingle(false)} - style={styles.button} - > - Select Single - - this.cropLast()} style={styles.button}> - Crop Last Selected Image - - this.pickSingleBase64(false)} - style={styles.button} - > - Select Single Returning Base64 - - this.pickSingle(true)} - style={styles.button} - > - Select Single With Cropping - - this.pickSingle(true, true)} - style={styles.button} - > - Select Single With Circular Cropping - - - Select Multiple - - - Cleanup All Images - - - Cleanup Single Image - - - ); - } -} diff --git a/example/index.android.js b/example/index.android.js deleted file mode 100644 index d274f6176a10fb63172a14a710948fa864d13b88..0000000000000000000000000000000000000000 --- a/example/index.android.js +++ /dev/null @@ -1,5 +0,0 @@ - -import {AppRegistry} from 'react-native'; -import App from './app'; - -AppRegistry.registerComponent('example', () => App); diff --git a/example/index.ios.js b/example/index.ios.js deleted file mode 100644 index d274f6176a10fb63172a14a710948fa864d13b88..0000000000000000000000000000000000000000 --- a/example/index.ios.js +++ /dev/null @@ -1,5 +0,0 @@ - -import {AppRegistry} from 'react-native'; -import App from './app'; - -AppRegistry.registerComponent('example', () => App); diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePicker.h b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePicker.h deleted file mode 100644 index 54ccdce326ac54d8d8125c6b6ef623a6be4c5ae7..0000000000000000000000000000000000000000 --- a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePicker.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// QBImagePicker.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -//! Project version number for QBImagePicker. -FOUNDATION_EXPORT double QBImagePickerVersionNumber; - -//! Project version string for QBImagePicker. -FOUNDATION_EXPORT const unsigned char QBImagePickerVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import -#import diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePickerController.h b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePickerController.h deleted file mode 100644 index e7547e59761f57cd52464bae4e651039dba43499..0000000000000000000000000000000000000000 --- a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePickerController.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// QBImagePickerController.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import -#import - -@class QBImagePickerController; - -@protocol QBImagePickerControllerDelegate - -@optional -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets; -- (void)qb_imagePickerControllerDidCancel:(QBImagePickerController *)imagePickerController; - -- (BOOL)qb_imagePickerController:(QBImagePickerController *)imagePickerController shouldSelectAsset:(PHAsset *)asset; -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didSelectAsset:(PHAsset *)asset; -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didDeselectAsset:(PHAsset *)asset; - -@end - -typedef NS_ENUM(NSUInteger, QBImagePickerMediaType) { - QBImagePickerMediaTypeAny = 0, - QBImagePickerMediaTypeImage, - QBImagePickerMediaTypeVideo -}; - -@interface QBImagePickerController : UIViewController - -@property (nonatomic, weak) id delegate; - -@property (nonatomic, strong, readonly) NSMutableOrderedSet *selectedAssets; - -@property (nonatomic, copy) NSArray *assetCollectionSubtypes; -@property (nonatomic, assign) QBImagePickerMediaType mediaType; - -@property (nonatomic, assign) BOOL allowsMultipleSelection; -@property (nonatomic, assign) NSUInteger minimumNumberOfSelection; -@property (nonatomic, assign) NSUInteger maximumNumberOfSelection; - -@property (nonatomic, copy) NSString *prompt; -@property (nonatomic, assign) BOOL showsNumberOfSelectedAssets; - -@property (nonatomic, assign) NSUInteger numberOfColumnsInPortrait; -@property (nonatomic, assign) NSUInteger numberOfColumnsInLandscape; - -@end diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Info.plist b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Info.plist deleted file mode 100644 index eae83061a08df64f24a3b0b2b7dc27cda6446204..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Info.plist and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Modules/module.modulemap b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Modules/module.modulemap deleted file mode 100644 index b6519afa7f2c93dc5c3081dd4b7674a8e5ee8704..0000000000000000000000000000000000000000 --- a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module QBImagePicker { - umbrella header "QBImagePicker.h" - - export * - module * { export * } -} diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker deleted file mode 100755 index 774ba900360d10392c4ea19024042598391adba7..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/Info.plist b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/Info.plist deleted file mode 100644 index 7f1a41b67f5973ada759a942f8b80431ebccfca6..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/Info.plist and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsNavigationController.nib b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsNavigationController.nib deleted file mode 100644 index aaf475738c3bf205859b68c0052eca9dad8d9181..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsNavigationController.nib and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsViewController.nib b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsViewController.nib deleted file mode 100644 index 98ef93b019605e5f4807befce09a563be0d8d1fb..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsViewController.nib and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAssetsViewController.nib b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAssetsViewController.nib deleted file mode 100644 index 4858c86c610c94938e1885bf6b3a779ef53819b2..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAssetsViewController.nib and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib deleted file mode 100644 index a05c0e1c520509023dae69fd24a02ccd7595bcd5..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib deleted file mode 100644 index 0b3925208b661882bb8dbd73d6dec9919e4dc6d4..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/_CodeSignature/CodeResources b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/_CodeSignature/CodeResources deleted file mode 100644 index dc71fb2267ccb72fb0f9c91d191658685b8da197..0000000000000000000000000000000000000000 --- a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,378 +0,0 @@ - - - - - files - - Headers/QBImagePicker.h - - wIb/otiZ7bd2vyPJQF6JEeoqhqo= - - Headers/QBImagePickerController.h - - Pj/03SZs3R39/KDJC/Sw28hOcV4= - - Info.plist - - IcCz/8UZ07kkFONGwju3BBUrdSA= - - Modules/module.modulemap - - b8XazA/6z0jSXdJ08gOuLFgiplM= - - QBImagePicker.storyboardc/Info.plist - - iwZHbHPu3m3FYRI+FCDLbHeFs44= - - QBImagePicker.storyboardc/QBAlbumsNavigationController.nib - - 5MCnX6u0y0SAVdmtiddUomh9GyY= - - QBImagePicker.storyboardc/QBAlbumsViewController.nib - - pY80pANgQzeIQuYM9GWFeoXUSxQ= - - QBImagePicker.storyboardc/QBAssetsViewController.nib - - 7+OaszKW0bhc6RotWxC0o0SijKw= - - QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib - - 0xNFW/713RpJkWqwnLEP8bUWcuI= - - QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib - - Fj2aIfr+Es6yrxOSQzP/3Uhvvvs= - - de.lproj/QBImagePicker.strings - - hash - - aEwah75TRZyK1k7zsKbitGOHsEE= - - optional - - - en.lproj/QBImagePicker.strings - - hash - - /bN8mAXwM04zgDQj19s7yTHxKQs= - - optional - - - es.lproj/QBImagePicker.strings - - hash - - 3E8xykBQDKx9XRx4cigrfFeoUwo= - - optional - - - ja.lproj/QBImagePicker.strings - - hash - - 7j4cVfYmTo9Yfo4fA9g4AvzTLhw= - - optional - - - pl.lproj/QBImagePicker.strings - - hash - - LfadkhKMCL8TGzZnnEP7Pbsb0I4= - - optional - - - zh-Hans.lproj/QBImagePicker.strings - - hash - - 0F5a3/dLVWvW3skcaXrrOpnhPv0= - - optional - - - - files2 - - Headers/QBImagePicker.h - - hash - - wIb/otiZ7bd2vyPJQF6JEeoqhqo= - - hash2 - - Fh9fdGZCY2P54hZbKvAZwwcML6IHufU9QAmHXrcmAMI= - - - Headers/QBImagePickerController.h - - hash - - Pj/03SZs3R39/KDJC/Sw28hOcV4= - - hash2 - - WcCD5/uhcGaZMLBPYHrRY/JkiB7BPQZqn5rkufhmY8c= - - - Modules/module.modulemap - - hash - - b8XazA/6z0jSXdJ08gOuLFgiplM= - - hash2 - - t0ZEP5nTTzs177dyaKMwGF/sZUJu1h9MPbMCcGQ7acw= - - - QBImagePicker.storyboardc/Info.plist - - hash - - iwZHbHPu3m3FYRI+FCDLbHeFs44= - - hash2 - - gyFhkTx7M92K1jKJpSG0Yl9R+mQfrd/YtnmTaP54ukY= - - - QBImagePicker.storyboardc/QBAlbumsNavigationController.nib - - hash - - 5MCnX6u0y0SAVdmtiddUomh9GyY= - - hash2 - - SLNRGZnuwERXFNcJLu1791ZVDMDsNnnk49Xb01ZjoZo= - - - QBImagePicker.storyboardc/QBAlbumsViewController.nib - - hash - - pY80pANgQzeIQuYM9GWFeoXUSxQ= - - hash2 - - KiZiF6NMbTf2YFOEQs4U1Yef9CSUk8GUiApZAjwtnOM= - - - QBImagePicker.storyboardc/QBAssetsViewController.nib - - hash - - 7+OaszKW0bhc6RotWxC0o0SijKw= - - hash2 - - PLJdoPEFJT4ItZgiMWCnK0GDoCTxbI/2wAwBBb8l3wM= - - - QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib - - hash - - 0xNFW/713RpJkWqwnLEP8bUWcuI= - - hash2 - - ey42W/ZWm6W0Eea8Q4i9o79eTvpujgSK8HU9PTkbS/4= - - - QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib - - hash - - Fj2aIfr+Es6yrxOSQzP/3Uhvvvs= - - hash2 - - 0iH5b4oLNN+sXyFq/BdGICtJzSnj4ll873t0puG4aqM= - - - de.lproj/QBImagePicker.strings - - hash - - aEwah75TRZyK1k7zsKbitGOHsEE= - - hash2 - - 5NH6glXlP7txoHgxKL83/BqWApGAb0poqKByJ1yo+9c= - - optional - - - en.lproj/QBImagePicker.strings - - hash - - /bN8mAXwM04zgDQj19s7yTHxKQs= - - hash2 - - xZGH0lOWeKlYEMMZNToG0j+vQVTgUTNoydCOJBG+Kjs= - - optional - - - es.lproj/QBImagePicker.strings - - hash - - 3E8xykBQDKx9XRx4cigrfFeoUwo= - - hash2 - - T0LWvjKc9Wmuxznj7gCFXRNeGYuFiF92kDcjOVI/WPo= - - optional - - - ja.lproj/QBImagePicker.strings - - hash - - 7j4cVfYmTo9Yfo4fA9g4AvzTLhw= - - hash2 - - jxfNgX8MVlO7C53RGOjJwPc1dcSj9DxTyWW8N37BkaE= - - optional - - - pl.lproj/QBImagePicker.strings - - hash - - LfadkhKMCL8TGzZnnEP7Pbsb0I4= - - hash2 - - BQCDVBKWaLio8bCJuurR2oc3ENu7K8c6N9ECEh98owU= - - optional - - - zh-Hans.lproj/QBImagePicker.strings - - hash - - 0F5a3/dLVWvW3skcaXrrOpnhPv0= - - hash2 - - smMz2/UyQzPo54Zq6lLJj+H42kPbfO4Bfy0iP1jCyf8= - - optional - - - - rules - - ^ - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^ - - weight - 20 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ - - nested - - weight - 10 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^[^/]+$ - - nested - - weight - 10 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/de.lproj/QBImagePicker.strings b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/de.lproj/QBImagePicker.strings deleted file mode 100644 index 7a95e4205a9de89fd146b061faa57a8547795dcc..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/de.lproj/QBImagePicker.strings and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/en.lproj/QBImagePicker.strings b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/en.lproj/QBImagePicker.strings deleted file mode 100644 index 709b47e57d3ee946b487b6326892fd0c91cf0e34..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/en.lproj/QBImagePicker.strings and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/es.lproj/QBImagePicker.strings b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/es.lproj/QBImagePicker.strings deleted file mode 100644 index 79380f2abda5cd7171de3eb83d6affbe91104070..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/es.lproj/QBImagePicker.strings and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/ja.lproj/QBImagePicker.strings b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/ja.lproj/QBImagePicker.strings deleted file mode 100644 index 30dd0df3fe97b6cc8606ff667d2816da4844d7ff..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/ja.lproj/QBImagePicker.strings and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/pl.lproj/QBImagePicker.strings b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/pl.lproj/QBImagePicker.strings deleted file mode 100644 index c4ef883788fc3ebebe302b459307870f3d330f4b..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/pl.lproj/QBImagePicker.strings and /dev/null differ diff --git a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/zh-Hans.lproj/QBImagePicker.strings b/example/ios/ImageCropPickerSDK/QBImagePicker.framework/zh-Hans.lproj/QBImagePicker.strings deleted file mode 100644 index a0de43a922938db9bf9796cf320d7934973c5b82..0000000000000000000000000000000000000000 Binary files a/example/ios/ImageCropPickerSDK/QBImagePicker.framework/zh-Hans.lproj/QBImagePicker.strings and /dev/null differ diff --git a/example/ios/Podfile b/example/ios/Podfile deleted file mode 100644 index 7dc75bf51f306c9095463d52527f5138e886ed48..0000000000000000000000000000000000000000 --- a/example/ios/Podfile +++ /dev/null @@ -1,26 +0,0 @@ -require_relative '../node_modules/react-native/scripts/react_native_pods' -require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' - -platform :ios, '10.0' - -target 'example' do - config = use_native_modules! - - pod 'RNImageCropPicker', :path => '../node_modules/react-native-image-crop-picker' - - use_react_native!( - :path => config[:reactNativePath], - # to enable hermes on iOS, change `false` to `true` and then install pods - :hermes_enabled => false - ) - - # 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) - end -end \ No newline at end of file diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock deleted file mode 100644 index 80666329d19dbc20bcb6208063bb904bf39b2a33..0000000000000000000000000000000000000000 --- a/example/ios/Podfile.lock +++ /dev/null @@ -1,424 +0,0 @@ -PODS: - - boost-for-react-native (1.63.0) - - DoubleConversion (1.1.6) - - FBLazyVector (0.64.2) - - FBReactNativeSpec (0.64.2): - - RCT-Folly (= 2020.01.13.00) - - RCTRequired (= 0.64.2) - - RCTTypeSafety (= 0.64.2) - - React-Core (= 0.64.2) - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - glog (0.3.5) - - RCT-Folly (2020.01.13.00): - - boost-for-react-native - - DoubleConversion - - glog - - RCT-Folly/Default (= 2020.01.13.00) - - RCT-Folly/Default (2020.01.13.00): - - boost-for-react-native - - DoubleConversion - - glog - - RCTRequired (0.64.2) - - RCTTypeSafety (0.64.2): - - FBLazyVector (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - RCTRequired (= 0.64.2) - - React-Core (= 0.64.2) - - React (0.64.2): - - React-Core (= 0.64.2) - - React-Core/DevSupport (= 0.64.2) - - React-Core/RCTWebSocket (= 0.64.2) - - React-RCTActionSheet (= 0.64.2) - - React-RCTAnimation (= 0.64.2) - - React-RCTBlob (= 0.64.2) - - React-RCTImage (= 0.64.2) - - React-RCTLinking (= 0.64.2) - - React-RCTNetwork (= 0.64.2) - - React-RCTSettings (= 0.64.2) - - React-RCTText (= 0.64.2) - - React-RCTVibration (= 0.64.2) - - React-callinvoker (0.64.2) - - React-Core (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default (= 0.64.2) - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/CoreModulesHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/Default (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/DevSupport (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default (= 0.64.2) - - React-Core/RCTWebSocket (= 0.64.2) - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-jsinspector (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTActionSheetHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTAnimationHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTBlobHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTImageHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTLinkingHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTNetworkHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTSettingsHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTTextHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTVibrationHeaders (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-Core/RCTWebSocket (0.64.2): - - glog - - RCT-Folly (= 2020.01.13.00) - - React-Core/Default (= 0.64.2) - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsiexecutor (= 0.64.2) - - React-perflogger (= 0.64.2) - - Yoga - - React-CoreModules (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.2) - - React-Core/CoreModulesHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - React-RCTImage (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-cxxreact (0.64.2): - - boost-for-react-native (= 1.63.0) - - DoubleConversion - - glog - - RCT-Folly (= 2020.01.13.00) - - React-callinvoker (= 0.64.2) - - React-jsi (= 0.64.2) - - React-jsinspector (= 0.64.2) - - React-perflogger (= 0.64.2) - - React-runtimeexecutor (= 0.64.2) - - React-jsi (0.64.2): - - boost-for-react-native (= 1.63.0) - - DoubleConversion - - glog - - RCT-Folly (= 2020.01.13.00) - - React-jsi/Default (= 0.64.2) - - React-jsi/Default (0.64.2): - - boost-for-react-native (= 1.63.0) - - DoubleConversion - - glog - - RCT-Folly (= 2020.01.13.00) - - React-jsiexecutor (0.64.2): - - DoubleConversion - - glog - - RCT-Folly (= 2020.01.13.00) - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-perflogger (= 0.64.2) - - React-jsinspector (0.64.2) - - react-native-video (5.1.1): - - React-Core - - react-native-video/Video (= 5.1.1) - - react-native-video/Video (5.1.1): - - React-Core - - React-perflogger (0.64.2) - - React-RCTActionSheet (0.64.2): - - React-Core/RCTActionSheetHeaders (= 0.64.2) - - React-RCTAnimation (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.2) - - React-Core/RCTAnimationHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-RCTBlob (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.64.2) - - React-Core/RCTWebSocket (= 0.64.2) - - React-jsi (= 0.64.2) - - React-RCTNetwork (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-RCTImage (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.2) - - React-Core/RCTImageHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - React-RCTNetwork (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-RCTLinking (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - React-Core/RCTLinkingHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-RCTNetwork (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.2) - - React-Core/RCTNetworkHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-RCTSettings (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.64.2) - - React-Core/RCTSettingsHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-RCTText (0.64.2): - - React-Core/RCTTextHeaders (= 0.64.2) - - React-RCTVibration (0.64.2): - - FBReactNativeSpec (= 0.64.2) - - RCT-Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.64.2) - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (= 0.64.2) - - React-runtimeexecutor (0.64.2): - - React-jsi (= 0.64.2) - - ReactCommon/turbomodule/core (0.64.2): - - DoubleConversion - - glog - - RCT-Folly (= 2020.01.13.00) - - React-callinvoker (= 0.64.2) - - React-Core (= 0.64.2) - - React-cxxreact (= 0.64.2) - - React-jsi (= 0.64.2) - - React-perflogger (= 0.64.2) - - RNImageCropPicker (0.36.2): - - React-Core - - React-RCTImage - - RNImageCropPicker/QBImagePickerController (= 0.36.2) - - TOCropViewController - - RNImageCropPicker/QBImagePickerController (0.36.2): - - React-Core - - React-RCTImage - - TOCropViewController - - TOCropViewController (2.6.0) - - Yoga (1.14.0) - -DEPENDENCIES: - - 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`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - RCT-Folly (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-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-jsi (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-native-video (from `../node_modules/react-native-video`) - - 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-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-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - RNImageCropPicker (from `../node_modules/react-native-image-crop-picker`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - boost-for-react-native - - TOCropViewController - -EXTERNAL SOURCES: - 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-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-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-native-video: - :path: "../node_modules/react-native-video" - 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-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-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - ReactCommon: - :path: "../node_modules/react-native/ReactCommon" - RNImageCropPicker: - :path: "../node_modules/react-native-image-crop-picker" - Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c - DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de - FBLazyVector: e686045572151edef46010a6f819ade377dfeb4b - FBReactNativeSpec: a8165441d9eaa0b136713c6ad21685d6c1e1eae9 - glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 - RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c - RCTRequired: 6d3e854f0e7260a648badd0d44fc364bc9da9728 - RCTTypeSafety: c1f31d19349c6b53085766359caac425926fafaa - React: bda6b6d7ae912de97d7a61aa5c160db24aa2ad69 - React-callinvoker: 9840ea7e8e88ed73d438edb725574820b29b5baa - React-Core: b5e385da7ce5f16a220fc60fd0749eae2c6120f0 - React-CoreModules: 17071a4e2c5239b01585f4aa8070141168ab298f - React-cxxreact: 9be7b6340ed9f7c53e53deca7779f07cd66525ba - React-jsi: 67747b9722f6dab2ffe15b011bcf6b3f2c3f1427 - React-jsiexecutor: 80c46bd381fd06e418e0d4f53672dc1d1945c4c3 - React-jsinspector: cc614ec18a9ca96fd275100c16d74d62ee11f0ae - react-native-video: 0bb76b6d6b77da3009611586c7dbf817b947f30e - React-perflogger: 25373e382fed75ce768a443822f07098a15ab737 - React-RCTActionSheet: af7796ba49ffe4ca92e7277a5d992d37203f7da5 - React-RCTAnimation: 6a2e76ab50c6f25b428d81b76a5a45351c4d77aa - React-RCTBlob: 02a2887023e0eed99391b6445b2e23a2a6f9226d - React-RCTImage: ce5bf8e7438f2286d9b646a05d6ab11f38b0323d - React-RCTLinking: ccd20742de14e020cb5f99d5c7e0bf0383aefbd9 - React-RCTNetwork: dfb9d089ab0753e5e5f55fc4b1210858f7245647 - React-RCTSettings: b14aef2d83699e48b410fb7c3ba5b66cd3291ae2 - React-RCTText: 41a2e952dd9adc5caf6fb68ed46b275194d5da5f - React-RCTVibration: 24600e3b1aaa77126989bc58b6747509a1ba14f3 - React-runtimeexecutor: a9904c6d0218fb9f8b19d6dd88607225927668f9 - ReactCommon: 149906e01aa51142707a10665185db879898e966 - RNImageCropPicker: 35a3ceb837446fa11547704709bb22b5fac6d584 - TOCropViewController: 3105367e808b7d3d886a74ff59bf4804e7d3ab38 - Yoga: 575c581c63e0d35c9a83f4b46d01d63abc1100ac - -PODFILE CHECKSUM: 8b00fb132adc4568214973ba628debaeb77681d0 - -COCOAPODS: 1.10.1 diff --git a/example/ios/example.xcodeproj/project.pbxproj b/example/ios/example.xcodeproj/project.pbxproj deleted file mode 100644 index fcde00bdcb94f86651690ed77f71714882afa11d..0000000000000000000000000000000000000000 --- a/example/ios/example.xcodeproj/project.pbxproj +++ /dev/null @@ -1,467 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 0BEAEB9C9085E265682ECE17 /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8617F59F4B274D55749C296B /* libPods-example.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* exampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = exampleTests.m; sourceTree = ""; }; - 038E3B40AAC8B9602A0C72CB /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Pods/Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = ""; }; - 34A9DDB81D7F43220012B1F5 /* QBImagePicker.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = QBImagePicker.framework; sourceTree = ""; }; - 5B590311A8214ACA88447B83 /* libRCTVideo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTVideo.a; sourceTree = ""; }; - 5B98ADA044EF4A42F2813B5F /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = ""; }; - 8617F59F4B274D55749C296B /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0BEAEB9C9085E265682ECE17 /* libPods-example.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* exampleTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* exampleTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = exampleTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 05142F2C788EC6F36DABEFD9 /* Pods */ = { - isa = PBXGroup; - children = ( - 5B98ADA044EF4A42F2813B5F /* Pods-example.debug.xcconfig */, - 038E3B40AAC8B9602A0C72CB /* Pods-example.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* example */ = { - isa = PBXGroup; - children = ( - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = example; - sourceTree = ""; - }; - 3468219D1F7BAED90093F7F5 /* Recovered References */ = { - isa = PBXGroup; - children = ( - 5B590311A8214ACA88447B83 /* libRCTVideo.a */, - ); - name = "Recovered References"; - sourceTree = ""; - }; - 34A9DDB71D7F43220012B1F5 /* ImageCropPickerSDK */ = { - isa = PBXGroup; - children = ( - 34A9DDB81D7F43220012B1F5 /* QBImagePicker.framework */, - ); - path = ImageCropPickerSDK; - sourceTree = ""; - }; - 3EB888A3E4C0A2B8E812B4B1 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8617F59F4B274D55749C296B /* libPods-example.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 34A9DDB71D7F43220012B1F5 /* ImageCropPickerSDK */, - 13B07FAE1A68108700A75B9A /* example */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* exampleTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 3468219D1F7BAED90093F7F5 /* Recovered References */, - 05142F2C788EC6F36DABEFD9 /* Pods */, - 3EB888A3E4C0A2B8E812B4B1 /* Frameworks */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* example.app */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 13B07F861A680F5B00A75B9A /* example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */; - buildPhases = ( - DAF711D8831E8B798A174A11 /* [CP] Check Pods Manifest.lock */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - D0E9AC6B3F69B52776B184B5 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = example; - productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* example.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 730; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 13B07F861A680F5B00A75B9A = { - DevelopmentTeam = 5WFBC66J2G; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - English, - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* example */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; - }; - D0E9AC6B3F69B52776B184B5 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-example/Pods-example-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - DAF711D8831E8B798A174A11 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-example-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; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = example; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5B98ADA044EF4A42F2813B5F /* Pods-example.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 5WFBC66J2G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/ImageCropPickerSDK", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native-video", - "$(SRCROOT)/../node_modules/react-native-video/ios", - ); - INFOPLIST_FILE = example/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = ivpusic.react.native.imagecroppicker; - PRODUCT_NAME = example; - PROVISIONING_PROFILE = ""; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 038E3B40AAC8B9602A0C72CB /* Pods-example.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 5WFBC66J2G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/ImageCropPickerSDK", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native-video", - "$(SRCROOT)/../node_modules/react-native-video/ios", - ); - INFOPLIST_FILE = example/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = ivpusic.react.native.imagecroppicker; - PRODUCT_NAME = example; - PROVISIONING_PROFILE = ""; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 "; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/../node_modules/react-native-video", - "$(SRCROOT)/../node_modules/react-native-video/ios", - ); - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "arm64 "; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(SRCROOT)/../node_modules/react-native-video", - "$(SRCROOT)/../node_modules/react-native-video/ios", - ); - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme b/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme deleted file mode 100644 index 0dade57d1c06c6e32d2833eceddd1e611ecd9c8d..0000000000000000000000000000000000000000 --- a/example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ios/example.xcworkspace/contents.xcworkspacedata b/example/ios/example.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 7f5c3aab58be4217f68e0a9f51ae7e16a90b4c82..0000000000000000000000000000000000000000 --- a/example/ios/example.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d68d0546c4804ac2ff47dd97c6e7921..0000000000000000000000000000000000000000 --- a/example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/example/ios/example/AppDelegate.h b/example/ios/example/AppDelegate.h deleted file mode 100644 index a9654d5e01b18c52fc334bdec2a796ce7e055dbf..0000000000000000000000000000000000000000 --- a/example/ios/example/AppDelegate.h +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface AppDelegate : UIResponder - -@property (nonatomic, strong) UIWindow *window; - -@end diff --git a/example/ios/example/AppDelegate.m b/example/ios/example/AppDelegate.m deleted file mode 100644 index 0f5c06b3863912f1f9dafca68667621ae6b45d8c..0000000000000000000000000000000000000000 --- a/example/ios/example/AppDelegate.m +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "AppDelegate.h" - -#import -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - NSURL *jsCodeLocation; - - jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; - - RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation - moduleName:@"example" - initialProperties:nil - launchOptions:launchOptions]; - rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIViewController *rootViewController = [UIViewController new]; - rootViewController.view = rootView; - self.window.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; - return YES; -} - -@end diff --git a/example/ios/example/Base.lproj/LaunchScreen.xib b/example/ios/example/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 9e04807a83b283f0a7ad8fc11620ef34b2b97395..0000000000000000000000000000000000000000 --- a/example/ios/example/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 118c98f7461bf98b2bc7e061150d8021121ad277..0000000000000000000000000000000000000000 --- a/example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/example/ios/example/Info.plist b/example/ios/example/Info.plist deleted file mode 100644 index ec972f68f1a6293c967ce31ea7db11bd5a55a650..0000000000000000000000000000000000000000 --- a/example/ios/example/Info.plist +++ /dev/null @@ -1,59 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - localhost - - NSTemporaryExceptionAllowsInsecureHTTPLoads - - - - - NSCameraUsageDescription - Testing purposes - NSMicrophoneUsageDescription - Testing purposes - NSLocationWhenInUseUsageDescription - - NSPhotoLibraryUsageDescription - Testing purposes - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/example/ios/example/main.m b/example/ios/example/main.m deleted file mode 100644 index 3d767fcbb9fced39e810debe402ff7f1ed523d34..0000000000000000000000000000000000000000 --- a/example/ios/example/main.m +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/example/ios/exampleTests/Info.plist b/example/ios/exampleTests/Info.plist deleted file mode 100644 index ba72822e8728ef2951005e49b6c27a2f1da6572d..0000000000000000000000000000000000000000 --- a/example/ios/exampleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/example/ios/exampleTests/exampleTests.m b/example/ios/exampleTests/exampleTests.m deleted file mode 100644 index 3fab38dfbf51868bb9114536c517040c4dea5825..0000000000000000000000000000000000000000 --- a/example/ios/exampleTests/exampleTests.m +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" - -@interface exampleTests : XCTestCase - -@end - -@implementation exampleTests - -- (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 = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; - RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - - RCTSetLogFunction(RCTDefaultLogFunction); - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - - -@end diff --git a/example/jsconfig.json b/example/jsconfig.json deleted file mode 100644 index a78a3ab00c98dec3ae030c764406c2cf205e3b3c..0000000000000000000000000000000000000000 --- a/example/jsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "allowJs": true, - "allowSyntheticDefaultImports": true - }, - "exclude": [ - "node_modules" - ] -} diff --git a/example/package.json b/example/package.json deleted file mode 100644 index abbf4ac18ec057b5dc9a4aba13a791ac61e54f09..0000000000000000000000000000000000000000 --- a/example/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "example", - "version": "0.0.1", - "private": true, - "scripts": { - "start": "node node_modules/react-native/local-cli/cli.js start", - "ios": "node node_modules/react-native/local-cli/cli.js run-ios", - "android": "node node_modules/react-native/local-cli/cli.js run-android" - }, - "dependencies": { - "react": "17.0.2", - "react-native": "0.64.2", - "react-native-image-crop-picker": "../", - "react-native-video": "5.1.1" - }, - "devDependencies": { - "@react-native-community/cli": "5.0.1" - } -} diff --git a/example/yarn.lock b/example/yarn.lock deleted file mode 100644 index f12db345336d1e0506747ecbf18c60dcc69fbda0..0000000000000000000000000000000000000000 --- a/example/yarn.lock +++ /dev/null @@ -1,4435 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== - dependencies: - "@babel/highlight" "^7.8.3" - -"@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/compat-data@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" - integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== - -"@babel/core@^7.0.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" - integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.6" - "@babel/parser" "^7.9.6" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.1.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab" - integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.6" - "@babel/parser" "^7.14.6" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" - integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== - dependencies: - "@babel/types" "^7.14.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.5.0", "@babel/generator@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" - integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== - dependencies: - "@babel/types" "^7.9.6" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" - integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-annotate-as-pure@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" - integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" - integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" - integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.5" - -"@babel/helper-builder-react-jsx@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" - integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/types" "^7.9.0" - -"@babel/helper-compilation-targets@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" - integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" - integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - -"@babel/helper-create-class-features-plugin@^7.8.3", "@babel/helper-create-class-features-plugin@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" - integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== - dependencies: - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.9.6" - "@babel/helper-split-export-declaration" "^7.8.3" - -"@babel/helper-create-regexp-features-plugin@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" - integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - regexpu-core "^4.7.0" - -"@babel/helper-define-map@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" - integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/types" "^7.8.3" - lodash "^4.17.13" - -"@babel/helper-explode-assignable-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" - integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== - dependencies: - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" - integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" - integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== - dependencies: - lodash "^4.17.13" - -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6", "@babel/helper-replace-supers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" - integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" - integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helpers@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635" - integrity sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA== - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helpers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" - integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.8.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" - integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== - dependencies: - "@babel/helper-validator-identifier" "^7.9.0" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" - integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== - -"@babel/parser@^7.1.6", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.6.tgz#d85cc68ca3cac84eae384c06f032921f5227f4b2" - integrity sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ== - -"@babel/plugin-proposal-class-properties@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" - integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-proposal-class-properties@^7.1.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.8.3.tgz#4cb7c2fdeaed490b60d9bfd3dc8a20f81f9c2e7c" - integrity sha512-PYtv2S2OdCdp7GSPDg5ndGZFm9DmWFvuLoS5nBxZCgOBggluLnhTScspJxng96alHQzPyrrHxvC9/w4bFuspeA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-export-default-from" "^7.8.3" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" - integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" - integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.9.5" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" - integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" - integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.1.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@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.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.8.3.tgz#f1e55ce850091442af4ba9c2550106035b29d678" - integrity sha512-a1qnnsr73KLNIQcQlcQ4ZHxqqfBKM6iNQZW2OMTyxNbA2WC7SHWHtGVpFzWtQAuS2pspkWVzdEBXXx8Ik0Za4w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" - integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" - integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" - integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.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-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": - 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.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-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" - integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" - integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" - integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - lodash "^4.17.13" - -"@babel/plugin-transform-classes@^7.0.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" - integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-split-export-declaration" "^7.8.3" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" - integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" - integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" - integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" - integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-flow" "^7.8.3" - -"@babel/plugin-transform-flow-strip-types@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz#0dc9c1d11dcdc873417903d6df4bed019ef0f85e" - integrity sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-flow" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" - integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-function-name@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" - integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== - dependencies: - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-literals@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" - integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-member-expression-literals@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" - integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" - integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== - dependencies: - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.1.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" - integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== - dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-object-assign@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.8.3.tgz#dc3b8dd50ef03837868a37b7df791f64f288538e" - integrity sha512-i3LuN8tPDqUCRFu3dkzF2r1Nx0jp4scxtm7JxtIqI9he9Vk20YD+/zshdzR9JLsoBMlJlNR82a62vQExNEVx/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-object-super@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" - integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.3" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.9.5": - version "7.9.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" - integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-property-literals@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" - integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" - integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.5.tgz#703b5d1edccd342179c2a99ee8c7065c2b4403cc" - integrity sha512-M/fmDX6n0cfHK/NLTcPmrfVAORKDhK8tyjDhyxlUjYyPYYO8FRWwuxBA3WBx8kWN/uBUuwGa3s/0+hQ9JIN3Tg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" - integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== - dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" - integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-runtime@^7.0.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz#3ba804438ad0d880a17bca5eaa0cdf1edeedb2fd" - integrity sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" - integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-spread@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" - integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" - integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-regex" "^7.8.3" - -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" - integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-transform-typescript@^7.14.5": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz#6e9c2d98da2507ebe0a883b100cde3c7279df36c" - integrity sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.6" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.5.0": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9" - integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.9.6" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" - -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" - integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/preset-flow@^7.0.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.14.5.tgz#a1810b0780c8b48ab0bece8e7ab8d0d37712751c" - integrity sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-flow-strip-types" "^7.14.5" - -"@babel/preset-typescript@^7.1.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz#aa98de119cf9852b79511f19e7f44a2d379bcce0" - integrity sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.14.5" - -"@babel/register@^7.0.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.9.0.tgz#02464ede57548bddbb5e9f705d263b7c3f43d48b" - integrity sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q== - dependencies: - find-cache-dir "^2.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/runtime@^7.8.4": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" - integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.0.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/template@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" - integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.6" - "@babel/types" "^7.9.6" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/traverse@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" - integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" - integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - -"@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" - -"@hapi/hoek@^9.0.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" - integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== - -"@hapi/topo@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" - integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@jest/create-cache-key-function@^26.5.0": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz#04cf439207a4fd12418d8aee551cddc86f9ac5f5" - integrity sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw== - dependencies: - "@jest/types" "^26.6.2" - -"@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" - -"@react-native-community/cli-debugger-ui@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-5.0.1.tgz#6b1f3367b8e5211e899983065ea2e72c1901d75f" - integrity sha512-5gGKaaXYOVE423BUqxIfvfAVSj5Cg1cU/TpGbeg/iqpy2CfqyWqJB3tTuVUbOOiOvR5wbU8tti6pIi1pchJ+oA== - dependencies: - serve-static "^1.13.1" - -"@react-native-community/cli-hermes@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-5.0.1.tgz#039d064bf2dcd5043beb7dcd6cdf5f5cdd51e7fc" - integrity sha512-nD+ZOFvu5MfjLB18eDJ01MNiFrzj8SDtENjGpf0ZRFndOWASDAmU54/UlU/wj8OzTToK1+S1KY7j2P2M1gleww== - dependencies: - "@react-native-community/cli-platform-android" "^5.0.1" - "@react-native-community/cli-tools" "^5.0.1" - chalk "^3.0.0" - hermes-profile-transformer "^0.0.6" - ip "^1.1.5" - -"@react-native-community/cli-platform-android@^5.0.1", "@react-native-community/cli-platform-android@^5.0.1-alpha.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-5.0.1.tgz#7f761e1818e5a099877ec59a1b739553fd6a6905" - integrity sha512-qv9GJX6BJ+Y4qvV34vgxKwwN1cnveXUdP6y2YmTW7XoAYs5YUzKqHajpY58EyucAL2y++6+573t5y4U/9IIoww== - dependencies: - "@react-native-community/cli-tools" "^5.0.1" - chalk "^3.0.0" - 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@^5.0.1-alpha.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-5.0.1.tgz#efa9c9b3bba0978d0a26d6442eefeffb5006a196" - integrity sha512-Nr/edBEYJfElgBNvjDevs2BuDicsvQaM8nYkTGgp33pyuCZRBxsYxQqfsNmnLalTzcYaebjWj6AnjUSxzQBWqg== - dependencies: - "@react-native-community/cli-tools" "^5.0.1" - chalk "^3.0.0" - glob "^7.1.3" - js-yaml "^3.13.1" - lodash "^4.17.15" - plist "^3.0.1" - xcode "^2.0.0" - -"@react-native-community/cli-server-api@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-5.0.1.tgz#3cf92dac766fab766afedf77df3fe4d5f51e4d2b" - integrity sha512-OOxL+y9AOZayQzmSW+h5T54wQe+QBc/f67Y9QlWzzJhkKJdYx+S4VOooHoD5PFJzGbYaxhu2YF17p517pcEIIA== - dependencies: - "@react-native-community/cli-debugger-ui" "^5.0.1" - "@react-native-community/cli-tools" "^5.0.1" - 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 "^1.1.0" - -"@react-native-community/cli-tools@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-5.0.1.tgz#9ee564dbe20448becd6bce9fbea1b59aa5797919" - integrity sha512-XOX5w98oSE8+KnkMZZPMRT7I5TaP8fLbDl0tCu40S7Epz+Zz924n80fmdu6nUDIfPT1nV6yH1hmHmWAWTDOR+Q== - dependencies: - chalk "^3.0.0" - lodash "^4.17.15" - mime "^2.4.1" - node-fetch "^2.6.0" - open "^6.2.0" - shell-quote "1.6.1" - -"@react-native-community/cli-types@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-5.0.1.tgz#8c5db4011988b0836d27a5efe230cb34890915dc" - integrity sha512-BesXnuFFlU/d1F3+sHhvKt8fUxbQlAbZ3hhMEImp9A6sopl8TEtryUGJ1dbazGjRXcADutxvjwT/i3LJVTIQug== - dependencies: - ora "^3.4.0" - -"@react-native-community/cli@5.0.1", "@react-native-community/cli@^5.0.1-alpha.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-5.0.1.tgz#1f7a66d813d5daf102e593f3c550650fa0cc8314" - integrity sha512-9VzSYUYSEqxEH5Ib2UNSdn2eyPiYZ4T7Y79o9DKtRBuSaUIwbCUdZtIm+UUjBpLS1XYBkW26FqL8/UdZDmQvXw== - dependencies: - "@react-native-community/cli-debugger-ui" "^5.0.1" - "@react-native-community/cli-hermes" "^5.0.1" - "@react-native-community/cli-server-api" "^5.0.1" - "@react-native-community/cli-tools" "^5.0.1" - "@react-native-community/cli-types" "^5.0.1" - appdirsjs "^1.2.4" - chalk "^3.0.0" - 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" - metro "^0.64.0" - metro-config "^0.64.0" - metro-core "^0.64.0" - metro-react-native-babel-transformer "^0.64.0" - metro-resolver "^0.64.0" - metro-runtime "^0.64.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - 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/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@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-color/-/normalize-color-1.0.0.tgz#c52a99d4fe01049102d47dc45d40cbde4f720ab6" - integrity sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg== - -"@react-native/polyfills@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-1.0.0.tgz#05bb0031533598f9458cf65a502b8df0eecae780" - integrity sha512-0jbp4RxjYopTsIdLl+/Fy2TiwVYHy4mgeu07DG4b/LyM0OS/+lPP5c9sbnt/AMlnF6qz2JRZpPpGw1eMNS6A4w== - -"@sideway/address@^4.1.0": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.2.tgz#811b84333a335739d3969cfc434736268170cad1" - integrity sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA== - 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== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@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": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@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/node@*": - version "15.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" - integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== - -"@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== - -"@types/yargs@^15.0.0": - version "15.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" - integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== - dependencies: - "@types/yargs-parser" "*" - -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.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.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-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.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^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.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - 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.4" - resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.4.tgz#3ab582acc9fdfaaa0c1f81b3a25422ad4d95f9d4" - integrity sha512-WO5StDORR6JF/xYnXk/Fm0yu+iULaV5ULKuUw0Tu+jbgiTlSquaWBCgbpnsHLMXldf+fM3Gxn5p7vjond7He6w== - -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-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= - -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== - -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" - -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-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-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-preset-fbjs@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" - integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== - 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" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.1.2, base64-js@^1.2.3: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -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.44: - version "1.6.48" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== - -bplist-creator@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c" - integrity sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA== - dependencies: - stream-buffers "~2.2.0" - -bplist-parser@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - 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" - -browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -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.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -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" - -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= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001219: - version "1.0.30001237" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz#4b7783661515b8e7151fc6376cfd97f0e427b9e5" - integrity sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw== - -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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -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== - -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-spinners@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz#0632239a4b5aa4c958610142c34bb7a651fc8df5" - integrity sha512-Xs2Hf2nzrvJMFKimOR7YR0QwZ8fc0u98kdtwN1eNAZzNQgH3vK2pXzff6GJtKh7S5hoJ87ECiAiZFS2fb5Ii2w== - -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@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -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.1.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" - integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== - -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -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.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.5, 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" - -dayjs@^1.8.15: - version "1.8.26" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.26.tgz#c6d62ccdf058ca72a8d14bb93a23501058db9f1e" - integrity sha512-KqtAuIfdNfZR5sJY1Dixr2Is4ZvcCqhb0dZpCOt5dGEFiMzoIbjkTSzUb4QKTCsP+WNpGwUjAFIZrnZvUxxkhw== - -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.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -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= - -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== - -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.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -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.3.723: - version "1.3.752" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09" - integrity sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A== - -eme-encryption-scheme-polyfill@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.0.1.tgz#b080b01bffd74c75c9cf8044c1cabedf3b83954f" - integrity sha512-Wz+Ro1c0/2Wsx2RLFvTOO0m4LvYn+7cSnq3XOvRvLLBq8jbvUACH/zpU9s0/5+mQa5oaelkU69x+q0z/iWYrFA== - -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" - -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.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== - 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" - -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= - -esprima@^4.0.0, 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== - -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.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== - -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" - -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" - -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" - -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" - -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.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" - -flow-parser@0.*: - version "0.153.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.153.0.tgz#bac7e977c79f380b07088d36fd0fccea24435db8" - integrity sha512-qa7UODgbofQyruRWqNQ+KM5hO37CenByxhNfAztiwjBsPhWZ5AFh5g+gtLpTWPlzG7X66QdjBB9DuHNUBcaF+Q== - -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= - -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: - 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== - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -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-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob@^7.0.0: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - 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" - -glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -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== - -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: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -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.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hermes-engine@~0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.7.2.tgz#303cd99d23f68e708b223aec2d49d5872985388b" - integrity sha512-E2DkRaO97gwL98LPhgfkMqhHiNsrAjIfEk3wWYn2Y31xdkdWn0572H7RnVcGujMJVqZNJvtknxlpsUb8Wzc3KA== - -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" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -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" - -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: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -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-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-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: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== - 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-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-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-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-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-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-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= - -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= - -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.5.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-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-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-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-validate@^26.5.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-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" - -jetifier@^1.6.2: - version "1.6.5" - resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.5.tgz#ea87324a4230bef20a9651178ecab978ee54a8cb" - integrity sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ== - -joi@^17.2.1: - version "17.4.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" - integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.0" - "@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.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsc-android@^245459.0.0: - version "245459.0.0" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" - integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== - -jscodeshift@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.11.0.tgz#4f95039408f3f06b0e39bb4d53bc3139f5330e2f" - integrity sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g== - dependencies: - "@babel/core" "^7.1.6" - "@babel/parser" "^7.1.6" - "@babel/plugin-proposal-class-properties" "^7.1.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.1.0" - "@babel/plugin-proposal-optional-chaining" "^7.1.0" - "@babel/plugin-transform-modules-commonjs" "^7.1.0" - "@babel/preset-flow" "^7.0.0" - "@babel/preset-typescript" "^7.1.0" - "@babel/register" "^7.0.0" - babel-core "^7.0.0-bridge.0" - colors "^1.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.3" - temp "^0.8.1" - write-file-atomic "^2.3.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== - -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -keymirror@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/keymirror/-/keymirror-0.1.1.tgz#918889ea13f8d0a42e7c557250eee713adc95c35" - integrity sha1-kYiJ6hP40KQufFVyUO7nE63JXDU= - -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== - -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.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= - -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - -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" - -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" - -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" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-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" - -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-register@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.64.0.tgz#1a2d23f68da8b8ee42e78dca37ad21a5f4d3647d" - integrity sha512-Kf6YvE3kIRumGnjK0Q9LqGDIdnsX9eFGtNBmBuCVDuB9wGGA/5CgX8We8W7Y44dz1RGTcHJRhfw5iGg+pwC3aQ== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/register" "^7.0.0" - escape-string-regexp "^1.0.5" - -metro-babel-transformer@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.64.0.tgz#a21f8a989a5ea60c1109456e21bd4d9374194ea0" - integrity sha512-itZaxKTgmKGEZWxNzbSZBc22NngrMZzoUNuU92aHSTGkYi2WH4XlvzEHsstmIKHMsRVKl75cA+mNmgk4gBFJKw== - dependencies: - "@babel/core" "^7.0.0" - metro-source-map "0.64.0" - nullthrows "^1.1.1" - -metro-cache-key@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.64.0.tgz#98d0a94332453c4c52b74f72c07cc62a5c264c4f" - integrity sha512-O9B65G8L/fopck45ZhdRosyVZdMtUQuX5mBWEC1NRj02iWBIUPLmYMjrunqIe8vHipCMp3DtTCm/65IlBmO8jg== - -metro-cache@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.64.0.tgz#a769503e12521d9e9d95ce5840ffb2efdb4e8703" - integrity sha512-QvGfxe/1QQYM9XOlR8W1xqE9eHDw/AgJIgYGn/TxZxBu9Zga+Rgs1omeSZju45D8w5VWgMr83ma5kACgzvOecg== - dependencies: - metro-core "0.64.0" - mkdirp "^0.5.1" - rimraf "^2.5.4" - -metro-config@0.64.0, metro-config@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.64.0.tgz#b634fa05cffd06b1e50e4339c200f90a42924afb" - integrity sha512-QhM4asnX5KhlRWaugwVGNNXhX0Z85u5nK0UQ/A90bBb4xWyXqUe20e788VtdA75rkQiiI6wXTCIHWT0afbnjwQ== - dependencies: - cosmiconfig "^5.0.5" - jest-validate "^26.5.2" - metro "0.64.0" - metro-cache "0.64.0" - metro-core "0.64.0" - metro-runtime "0.64.0" - -metro-core@0.64.0, metro-core@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.64.0.tgz#7616b27acfe7baa476f6cd6bd9e70ae64fa62541" - integrity sha512-v8ZQ5j72EaUwamQ8pLfHlOHTyp7SbdazvHPzFGDpHnwIQqIT0Bw3Syg8R4regTlVG3ngpeSEAi005UITljmMcQ== - dependencies: - jest-haste-map "^26.5.2" - lodash.throttle "^4.1.1" - metro-resolver "0.64.0" - -metro-hermes-compiler@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.64.0.tgz#e6043d7aa924e5b2be99bd3f602e693685d15386" - integrity sha512-CLAjVDWGAoGhbi2ZyPHnH5YDdfrDIx6+tzFWfHGIMTZkYBXsYta9IfYXBV8lFb6BIbrXLjlXZAOoosknetMPOA== - -metro-inspector-proxy@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.64.0.tgz#9a481b3f49773d5418e028178efec68f861bec88" - integrity sha512-KywbH3GNSz9Iqw4UH3smgaV2dBHHYMISeN7ORntDL/G+xfgPc6vt13d+zFb907YpUcXj5N0vdoiAHI5V/0y8IA== - dependencies: - connect "^3.6.5" - debug "^2.2.0" - ws "^1.1.5" - yargs "^15.3.1" - -metro-minify-uglify@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.64.0.tgz#da6ab4dda030e3211f5924e7f41ed308d466068f" - integrity sha512-DRwRstqXR5qfte9Nuwoov5dRXxL7fJeVlO5fGyOajWeO3+AgPjvjXh/UcLJqftkMWTPGUFuzAD5/7JC5v5FLWw== - dependencies: - uglify-es "^3.1.9" - -metro-react-native-babel-preset@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.64.0.tgz#76861408681dfda3c1d962eb31a8994918c976f8" - integrity sha512-HcZ0RWQRuJfpPiaHyFQJzcym+/dDIVUPwUAXWoub/C4GkGu+mPjp8vqK6g0FxokCnnI2TK0gZTza2IDfiNNscQ== - dependencies: - "@babel/core" "^7.0.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-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.64.0, metro-react-native-babel-transformer@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.64.0.tgz#eafef756972f20efdc51bd5361d55f8598355623" - integrity sha512-K1sHO3ODBFCr7uEiCQ4RvVr+cQg0EHQF8ChVPnecGh/WDD8udrTq9ECwB0dRfMjAvlsHtRUlJm6ZSI8UPgum2w== - dependencies: - "@babel/core" "^7.0.0" - babel-preset-fbjs "^3.3.0" - metro-babel-transformer "0.64.0" - metro-react-native-babel-preset "0.64.0" - metro-source-map "0.64.0" - nullthrows "^1.1.1" - -metro-resolver@0.64.0, metro-resolver@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.64.0.tgz#21126b44f31346ac2ce0b06b77ef65e8c9e2294a" - integrity sha512-cJ26Id8Zf+HmS/1vFwu71K3u7ep/+HeXXAJIeVDYf+niE7AWB9FijyMtAlQgbD8elWqv1leJCnQ/xHRFBfGKYA== - dependencies: - absolute-path "^0.0.0" - -metro-runtime@0.64.0, metro-runtime@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.64.0.tgz#cdaa1121d91041bf6345f2a69eb7c2fb289eff7b" - integrity sha512-m7XbWOaIOeFX7YcxUhmnOi6Pg8EaeL89xyZ+quZyZVF1aNoTr4w8FfbKxvijpjsytKHIZtd+43m2Wt5JrqyQmQ== - -metro-source-map@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.64.0.tgz#4310e17c3d4539c6369688022494ad66fa4d39a1" - integrity sha512-OCG2rtcp5cLEGYvAbfkl6mEc0J2FPRP4/UCEly+juBk7hawS9bCBMBfhJm/HIsvY1frk6nT2Vsl1O8YBbwyx2g== - dependencies: - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - invariant "^2.2.4" - metro-symbolicate "0.64.0" - nullthrows "^1.1.1" - ob1 "0.64.0" - source-map "^0.5.6" - vlq "^1.0.0" - -metro-symbolicate@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.64.0.tgz#405c21438ab553c29f6841da52ca76ee87bb06ac" - integrity sha512-qIi+YRrDWnLVmydj6gwidYLPaBsakZRibGWSspuXgHAxOI3UuLwlo4dpQ73Et0gyHjI7ZvRMRY8JPiOntf9AQQ== - dependencies: - invariant "^2.2.4" - metro-source-map "0.64.0" - nullthrows "^1.1.1" - source-map "^0.5.6" - through2 "^2.0.1" - vlq "^1.0.0" - -metro-transform-plugins@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.64.0.tgz#41d3dce0f2966bbd79fea1ecff61bcc8a00e4665" - integrity sha512-iTIRBD/wBI98plfxj8jAoNUUXfXLNlyvcjPtshhpGvdwu9pzQilGfnDnOaaK+vbITcOk9w5oQectXyJwAqTr1A== - dependencies: - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - nullthrows "^1.1.1" - -metro-transform-worker@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.64.0.tgz#f94429b2c42b13cb1c93be4c2e25e97f2d27ca60" - integrity sha512-wegRtK8GyLF6IPZRBJp+zsORgA4iX0h1DRpknyAMDCtSbJ4VU2xV/AojteOgAsDvY3ucAGsvfuZLNDJHUdUNHQ== - dependencies: - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/parser" "^7.0.0" - "@babel/types" "^7.0.0" - babel-preset-fbjs "^3.3.0" - metro "0.64.0" - metro-babel-transformer "0.64.0" - metro-cache "0.64.0" - metro-cache-key "0.64.0" - metro-hermes-compiler "0.64.0" - metro-source-map "0.64.0" - metro-transform-plugins "0.64.0" - nullthrows "^1.1.1" - -metro@0.64.0, metro@^0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.64.0.tgz#0091a856cfbcc94dd576da563eee466e96186195" - integrity sha512-G2OC08Rzfs0kqnSEuKo2yZxR+/eNUpA93Ru45c60uN0Dw3HPrDi+ZBipgFftC6iLE0l+6hu8roFFIofotWxybw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.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" - image-size "^0.6.0" - invariant "^2.2.4" - jest-haste-map "^26.5.2" - jest-worker "^26.0.0" - lodash.throttle "^4.1.1" - metro-babel-register "0.64.0" - metro-babel-transformer "0.64.0" - metro-cache "0.64.0" - metro-cache-key "0.64.0" - metro-config "0.64.0" - metro-core "0.64.0" - metro-hermes-compiler "0.64.0" - metro-inspector-proxy "0.64.0" - metro-minify-uglify "0.64.0" - metro-react-native-babel-preset "0.64.0" - metro-resolver "0.64.0" - metro-runtime "0.64.0" - metro-source-map "0.64.0" - metro-symbolicate "0.64.0" - metro-transform-plugins "0.64.0" - metro-transform-worker "0.64.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 "^1.1.5" - 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: - 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.44.0, "mime-db@>= 1.43.0 < 2": - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-db@1.48.0: - version "1.48.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" - integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== - -mime-types@^2.1.27: - version "2.1.31" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" - integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== - dependencies: - mime-db "1.48.0" - -mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.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.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== - -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== - -minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -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" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -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.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== - -node-stream-zip@^1.9.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.10.1.tgz#d4c648e8d4cf97311e655b3c998d344ccbb421a8" - integrity sha512-fd2jdfvs3xJhSGpipy3EgCHGgFMXZkJh6HeQ8LURfMUW9oHcPEMWLXO657MtMRGJCHvQYQk6dTHZmNycu87PEg== - -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" - -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== - -ob1@0.64.0: - version "0.64.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.64.0.tgz#f254a55a53ca395c4f9090e28a85483eac5eba19" - integrity sha512-CO1N+5dhvy+MoAwxz8+fymEUcwsT4a+wHhrHFb02LppcJdHxgcBWviwEhUwKOD2kLMQ7ijrrzybOqpGcqEtvpQ== - -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-keys@^1.0.11, object-keys@^1.0.12: - 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: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.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" - -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" - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - -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" - -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-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== - -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" - -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-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -picomatch@^2.0.4, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -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.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -plist@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" - integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== - dependencies: - base64-js "^1.2.3" - xmlbuilder "^9.0.7" - xmldom "0.1.x" - -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= - -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" - -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.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== - -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.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -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" - -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.6.0: - version "4.13.5" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.13.5.tgz#803e9ae8f7ab46deaa04129b376f3f21b2eb6ef1" - integrity sha512-k+P5VSKM6P22Go9IQ8dJmjj9fbztvKt1iRDI/4wS5oTvd1EnytIJMYB59wZt+D3kgp64jklNX/MRmY42xAQ08g== - dependencies: - shell-quote "^1.6.1" - ws "^7" - -react-is@^16.8.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-is@^17.0.1: - 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-native-codegen@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/react-native-codegen/-/react-native-codegen-0.0.6.tgz#b3173faa879cf71bfade8d030f9c4698388f6909" - integrity sha512-cMvrUelD81wiPitEPiwE/TCNscIVauXxmt4NTGcy18HrUd0WRWXfYzAQGXm0eI87u3NMudNhqFj2NISJenxQHg== - dependencies: - flow-parser "^0.121.0" - jscodeshift "^0.11.0" - nullthrows "^1.1.1" - -react-native-image-crop-picker@../: - version "0.36.2" - -react-native-video@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-native-video/-/react-native-video-5.1.1.tgz#89a7989efeb8d404611c06154d1da227a745d7d8" - integrity sha512-zee8gRUrjPWRoZSEBiMebClqu1iAuCQNLjzqpmXFrRWEoJj7azM3BPqLQWJgsnfLiYUYGySeApC/G60THM5+tw== - dependencies: - keymirror "^0.1.1" - prop-types "^15.7.2" - shaka-player "^2.5.9" - -react-native@0.64.2: - version "0.64.2" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.64.2.tgz#233b6ed84ac4749c8bc2a2d6cf63577a1c437d18" - integrity sha512-Ty/fFHld9DcYsFZujXYdeVjEhvSeQcwuTGXezyoOkxfiGEGrpL/uwUZvMzwShnU4zbbTKDu2PAm/uwuOittRGA== - dependencies: - "@jest/create-cache-key-function" "^26.5.0" - "@react-native-community/cli" "^5.0.1-alpha.1" - "@react-native-community/cli-platform-android" "^5.0.1-alpha.1" - "@react-native-community/cli-platform-ios" "^5.0.1-alpha.1" - "@react-native/assets" "1.0.0" - "@react-native/normalize-color" "1.0.0" - "@react-native/polyfills" "1.0.0" - abort-controller "^3.0.0" - anser "^1.4.9" - base64-js "^1.1.2" - event-target-shim "^5.0.1" - hermes-engine "~0.7.0" - invariant "^2.2.4" - jsc-android "^245459.0.0" - metro-babel-register "0.64.0" - metro-react-native-babel-transformer "0.64.0" - metro-runtime "0.64.0" - metro-source-map "0.64.0" - nullthrows "^1.1.1" - pretty-format "^26.5.2" - promise "^8.0.3" - prop-types "^15.7.2" - react-devtools-core "^4.6.0" - react-native-codegen "^0.0.6" - react-refresh "^0.4.0" - regenerator-runtime "^0.13.2" - scheduler "^0.20.1" - shelljs "^0.8.4" - stacktrace-parser "^0.1.3" - use-subscription "^1.0.0" - whatwg-fetch "^3.0.0" - ws "^6.1.4" - -react-refresh@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.2.tgz#54a277a6caaac2803d88f1d6f13c1dcfbd81e334" - integrity sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ== - -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" - -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" - -recast@^0.20.3: - version "0.20.4" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.4.tgz#db55983eac70c46b3fff96c8e467d65ffb4a7abc" - integrity sha512-6qLIBGGRcwjrTZGIiBpJVC/NeuXpogXNyRQpqU1zWPUigCphvApoCs9KIwDYh1eDuJ6dAFlQoi/QUyE5KQ6RBQ== - dependencies: - ast-types "0.14.2" - esprima "~4.0.0" - source-map "~0.6.1" - tslib "^2.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: - version "0.13.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" - integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== - -regenerator-transform@^0.14.2: - version "0.14.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" - integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== - dependencies: - "@babel/runtime" "^7.8.4" - private "^0.1.8" - -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" - -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regjsgen@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" - integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== - -regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.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-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-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.6: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^1.3.2, resolve@^1.8.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - 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" - -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@~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-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" - -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== - -scheduler@^0.20.1: - 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@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - 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.7.2" - mime "1.6.0" - ms "2.1.1" - 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.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -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.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -shaka-player@^2.5.9: - version "2.5.23" - resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.23.tgz#db92d1c6cf2314f0180a2cec11b0e2f2560336f5" - integrity sha512-3MC9k0OXJGw8AZ4n/ZNCZS2yDxx+3as5KgH6Tx4Q5TRboTBBCu6dYPI5vp1DxKeyU12MBN1Zcbs7AKzXv2EnCg== - dependencies: - eme-encryption-scheme-polyfill "^2.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shell-quote@1.6.1: - 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: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -shelljs@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-plist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.1.0.tgz#8354ab63eb3922a054c78ce96c209c532e907a23" - integrity sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg== - dependencies: - bplist-creator "0.0.8" - bplist-parser "0.2.0" - plist "^3.0.1" - -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" - -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: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.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: - 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== - -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= - -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - -stacktrace-parser@^0.1.3: - version "0.1.9" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.9.tgz#11e6d61d42e8cfc87293143d0766408b7a87b00f" - integrity sha512-DRy03ljj0367Ud3OAJHD6eVS/+CvMK2u/djVYuU37fHYcYHoZ8tkFyhbRf7PNG1h3bWLsw+SNTSXrPFe07A7aQ== - 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.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^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: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-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= - -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: - 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@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -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.1: - 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" - -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.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -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.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tslib@^2.0.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -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== - -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" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== - -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: - 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" - -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: - 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: - 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@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -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== - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -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" - -whatwg-fetch@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== - -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" - -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" - -ws@^1.1.0, ws@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== - dependencies: - options ">=0.0.5" - ultron "1.0.x" - -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: - version "7.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" - integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== - -xcode@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" - integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== - dependencies: - simple-plist "^1.0.0" - uuid "^3.3.2" - -xmlbuilder@^9.0.7: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -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" - -xmldom@0.1.x: - version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - -xtend@~4.0.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.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -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: - 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/harmony/image_crop_picker.har b/harmony/image_crop_picker.har new file mode 100644 index 0000000000000000000000000000000000000000..4619068aa6003a8f2d42859a853c5c1f94722d3c Binary files /dev/null and b/harmony/image_crop_picker.har differ diff --git a/harmony/image_crop_picker/.gitignore b/harmony/image_crop_picker/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5 --- /dev/null +++ b/harmony/image_crop_picker/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/harmony/image_crop_picker/build-profile.json5 b/harmony/image_crop_picker/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..b823c6efb11ba938e7fa0aea4364cbe2abf7f0c9 --- /dev/null +++ b/harmony/image_crop_picker/build-profile.json5 @@ -0,0 +1,8 @@ +{ + "apiType": "stageMode", + "targets": [ + { + "name": "default" + } + ] +} diff --git a/harmony/image_crop_picker/hvigorfile.ts b/harmony/image_crop_picker/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..614f1c4181e32eb06239bef4d40b3d75f5cbbec1 --- /dev/null +++ b/harmony/image_crop_picker/hvigorfile.ts @@ -0,0 +1 @@ +export { harTasks } from "@ohos/hvigor-ohos-plugin"; diff --git a/harmony/image_crop_picker/index.ets b/harmony/image_crop_picker/index.ets new file mode 100644 index 0000000000000000000000000000000000000000..5b3a41d738ef38c11a3ff42811349146879e1664 --- /dev/null +++ b/harmony/image_crop_picker/index.ets @@ -0,0 +1,6 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +export { ImageEditInfo } from "./src/main/ets/pages/ImageEditInfo" +export * from "./ts"; diff --git a/harmony/image_crop_picker/oh-package.json5 b/harmony/image_crop_picker/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..f01522ca3011b0bb643d69c54cbddbcf01e4a863 --- /dev/null +++ b/harmony/image_crop_picker/oh-package.json5 @@ -0,0 +1,10 @@ +{ + name: '@react-native-ohos/react-native-image-crop-picker', + "description": "Please describe the basic information.", + main: 'index.ets', + type: 'module', + version: '0.40.3', + dependencies: { + "@rnoh/react-native-openharmony": "^0.72.38" + }, +} diff --git a/harmony/image_crop_picker/src/main/cpp/CMakeLists.txt b/harmony/image_crop_picker/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..8a425bff8f40555704930073a49efc6af324a05b --- /dev/null +++ b/harmony/image_crop_picker/src/main/cpp/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +set(rnoh_image_crop_picker_generated_dir "${CMAKE_CURRENT_SOURCE_DIR}/generated") +file(GLOB_RECURSE rnoh_image_crop_picker_generated_SRC "${rnoh_image_crop_picker_generated_dir}/**/*.cpp") +file(GLOB rnoh_image_crop_picker_SRC CONFIGURE_DEPENDS *.cpp) +add_library(rnoh_image_crop_picker SHARED ${rnoh_image_crop_picker_SRC} ${rnoh_image_crop_picker_generated_SRC}) +target_include_directories(rnoh_image_crop_picker PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${rnoh_image_crop_picker_generated_dir} ${CMAKE_CURRENT_SOURCE_DIR}/generated/RNOH/generated) +target_link_libraries(rnoh_image_crop_picker PUBLIC rnoh) \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/cpp/ImageCropPickerPackage.h b/harmony/image_crop_picker/src/main/cpp/ImageCropPickerPackage.h new file mode 100644 index 0000000000000000000000000000000000000000..b5759d28d34f23c3b8d03ef8427888becfa5f72c --- /dev/null +++ b/harmony/image_crop_picker/src/main/cpp/ImageCropPickerPackage.h @@ -0,0 +1,19 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +#ifndef IMAGECROPPICKERPACKAGE_H +#define IMAGECROPPICKERPACKAGE_H + + +#include "generated/RNOH/generated/BaseReactNativeImageCropPickerPackage.h" +#pragma once + + +namespace rnoh { +class ImageCropPickerPackage : public BaseReactNativeImageCropPickerPackage { + using Super = BaseReactNativeImageCropPickerPackage; + using Super::Super; +}; +} // namespace rnoh +#endif //IMAGECROPPICKERPACKAGE_H \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/BaseReactNativeImageCropPickerPackage.h b/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/BaseReactNativeImageCropPickerPackage.h new file mode 100644 index 0000000000000000000000000000000000000000..0e7c1c7b6d2bf7041681c5dd0f800bd6e5c0847a --- /dev/null +++ b/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/BaseReactNativeImageCropPickerPackage.h @@ -0,0 +1,66 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +#pragma once + +#include "RNOH/Package.h" +#include "RNOH/ArkTSTurboModule.h" +#include "RNOH/generated/turbo_modules/ImageCropPicker.h" + +namespace rnoh { + +class BaseReactNativeImageCropPickerPackageTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate { + public: + SharedTurboModule createTurboModule(Context ctx, const std::string &name) const override { + if (name == "ImageCropPicker") { + return std::make_shared(ctx, name); + } + return nullptr; + }; +}; + +class BaseReactNativeImageCropPickerPackageEventEmitRequestHandler : public EventEmitRequestHandler { + public: + void handleEvent(Context const &ctx) override { + auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter(ctx.tag); + if (eventEmitter == nullptr) { + return; + } + + std::vector supportedEventNames = { + }; + if (std::find(supportedEventNames.begin(), supportedEventNames.end(), ctx.eventName) != supportedEventNames.end()) { + eventEmitter->dispatchEvent(ctx.eventName, ArkJS(ctx.env).getDynamic(ctx.payload)); + } + } +}; + + +class BaseReactNativeImageCropPickerPackage : public Package { + public: + BaseReactNativeImageCropPickerPackage(Package::Context ctx) : Package(ctx){}; + + std::unique_ptr createTurboModuleFactoryDelegate() override { + return std::make_unique(); + } + + std::vector createComponentDescriptorProviders() override { + return { + }; + } + + ComponentJSIBinderByString createComponentJSIBinderByName() override { + return { + }; + }; + + EventEmitRequestHandlers createEventEmitRequestHandlers() override { + return { + std::make_shared(), + }; + } +}; + +} // namespace rnoh + diff --git a/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/turbo_modules/ImageCropPicker.cpp b/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/turbo_modules/ImageCropPicker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..59d1f67291ecd5ce72fcf39cba278283a6a7db0b --- /dev/null +++ b/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/turbo_modules/ImageCropPicker.cpp @@ -0,0 +1,20 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +#include "ImageCropPicker.h" + +namespace rnoh { +using namespace facebook; + +ImageCropPicker::ImageCropPicker(const ArkTSTurboModule::Context ctx, const std::string name) : ArkTSTurboModule(ctx, name) { + methodMap_ = { + ARK_ASYNC_METHOD_METADATA(openPicker, 1), + ARK_ASYNC_METHOD_METADATA(openCamera, 1), + ARK_ASYNC_METHOD_METADATA(openCropper, 1), + ARK_ASYNC_METHOD_METADATA(clean, 0), + ARK_ASYNC_METHOD_METADATA(cleanSingle, 1), + }; +} + +} // namespace rnoh diff --git a/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/turbo_modules/ImageCropPicker.h b/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/turbo_modules/ImageCropPicker.h new file mode 100644 index 0000000000000000000000000000000000000000..85dd69e3f640653ae60333480252fcce220ad64d --- /dev/null +++ b/harmony/image_crop_picker/src/main/cpp/generated/RNOH/generated/turbo_modules/ImageCropPicker.h @@ -0,0 +1,16 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +#pragma once + +#include "RNOH/ArkTSTurboModule.h" + +namespace rnoh { + +class JSI_EXPORT ImageCropPicker : public ArkTSTurboModule { + public: + ImageCropPicker(const ArkTSTurboModule::Context ctx, const std::string name); +}; + +} // namespace rnoh diff --git a/harmony/image_crop_picker/src/main/ets/ImageCropPickerPackage.ts b/harmony/image_crop_picker/src/main/ets/ImageCropPickerPackage.ts new file mode 100644 index 0000000000000000000000000000000000000000..4aa2d37cd661c66933b6a299a1acc1ab409541e4 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/ImageCropPickerPackage.ts @@ -0,0 +1,28 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +import { RNPackage, TurboModulesFactory } from '@rnoh/react-native-openharmony/ts'; +import type { TurboModule, TurboModuleContext } from '@rnoh/react-native-openharmony/ts'; +import { ImageCropPickerTurboModule } from './ImageCropPickerTurboModule'; + +class ImageCropPickerTurboModulesFactory extends TurboModulesFactory { + + createTurboModule(name: string): TurboModule | null { + if (name === 'ImageCropPicker') { + return new ImageCropPickerTurboModule(this.ctx); + } + return null; + } + + hasTurboModule(name: string): boolean { + return name === 'ImageCropPicker'; + } + +} + +export class ImageCropPickerPackage extends RNPackage { + createTurboModulesFactory(ctx: TurboModuleContext): TurboModulesFactory { + return new ImageCropPickerTurboModulesFactory(ctx); + } +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/ImageCropPickerTurboModule.ts b/harmony/image_crop_picker/src/main/ets/ImageCropPickerTurboModule.ts new file mode 100644 index 0000000000000000000000000000000000000000..bb62c7081a058edd535b24f6efd938874dfc42f1 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/ImageCropPickerTurboModule.ts @@ -0,0 +1,1041 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +import type { TurboModuleContext } from '@rnoh/react-native-openharmony/ts'; +import { ImageCropPicker } from "./generated/turboModules/ImageCropPicker"; +import { TurboModule } from '@rnoh/react-native-openharmony/ts' +import Logger from './Logger'; +import type Want from '@ohos.app.ability.Want'; +import image from '@ohos.multimedia.image'; +import media from '@ohos.multimedia.media'; +import util from '@ohos.util'; +import uri from '@ohos.uri'; +import picker from '@ohos.multimedia.cameraPicker'; +import photoAccessHelper from '@ohos.file.photoAccessHelper'; +import camera from '@ohos.multimedia.camera'; +import { BusinessError } from '@ohos.base'; +import fs, { Filter } from '@ohos.file.fs'; +import { JSON } from '@kit.ArkTS'; +import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl'; +import { PermissionRequestResult } from '@ohos.abilityAccessCtrl'; + +import { window } from '@kit.ArkUI'; + + +export type MediaType = 'photo' | 'video' | 'any'; + +export type OrderType = 'asc' | 'desc' | 'none'; + +export type ErrorCode = 'camera_unavailable' | 'permission' | 'others'; + +const MaxNumber = 5; +const MinNumber = 1; +const ImageQuality = 1; +const TAG: string = 'ImageCropPickerTurboModule'; +const WANT_PARAM_URI_SELECT_SINGLE: string = 'singleselect'; +const WANT_PARAM_URI_SELECT_MULTIPLE: string = 'multipleselect'; +const ENTER_GALLERY_ACTION: string = "ohos.want.action.photoPicker"; +const filePrefix = 'file://' +const atManager = abilityAccessCtrl.createAtManager(); +const MINIMUM_VALUE = 1; + +let avMetadataExtractor: media.AVMetadataExtractor; + +export type SmartAlbums = | 'Regular' | 'SyncedEvent' | 'SyncedFaces'; + +export type CompressVideoPresets = | 'LowQuality' | 'MediumQuality' | 'HighestQuality' | 'Passthrough'; + +export type CropperOptions = ImageOptions & { + path: string; +} + +export type Options = AnyOptions | VideoOptions | ImageOptions; + +export type AnyOptions = Omit & Omit & { + mediaType?: 'any'; +}; + +export type VideoOptions = CommonOptions & { + mediaType: 'video'; + compressVideoPreset?: CompressVideoPresets; +}; + +export type ImageOptions = CommonOptions & { + mediaType: MediaType; + width?: number; + height?: number; + includeBase64?: boolean; + includeExif?: boolean; + forceJpg?: boolean; + cropping?: boolean; + avoidEmptySpaceAroundImage?: boolean; + cropperActiveWidgetColor?: string; + cropperStatusBarColor?: string; + cropperToolbarColor?: string; + cropperToolbarWidgetColor?: string; + cropperToolbarTitle?: string; + freeStyleCropEnabled?: boolean; + cropperTintColor?: string; + cropperCircleOverlay?: boolean; + cropperCancelText?: string; + cropperCancelColor?: string; + cropperChooseText?: string; + cropperChooseColor?: string; + cropperRotateButtonsHidden?: boolean + showCropGuidelines?: boolean; + showCropFrame?: boolean; + enableRotationGesture?: boolean; + disableCropperColorSetters?: boolean; + compressImageMaxWidth?: number; + compressImageMaxHeight?: number; + compressImageQuality?: number; +} + +export interface CommonOptions { + multiple?: boolean; + minFiles?: number; + maxFiles?: number; + waitAnimationEnd?: boolean; + smartAlbums?: SmartAlbums[]; + useFrontCamera?: boolean; + loadingLabelText?: string; + showsSelectedCount?: boolean; + sortOrder?: 'none' | 'asc' | 'desc'; + hideBottomControls?: boolean; + compressImageQuality?: number; + mediaType: MediaType; + width?: number; + height?: number; + includeBase64?: boolean; + includeExif?: boolean; + forceJpg?: boolean; + cropping?: boolean; + avoidEmptySpaceAroundImage?: boolean; + cropperActiveWidgetColor?: string; + cropperStatusBarColor?: string; + cropperToolbarColor?: string; + cropperToolbarWidgetColor?: string; + cropperToolbarTitle?: string; + freeStyleCropEnabled?: boolean; + cropperTintColor?: string; + cropperCircleOverlay?: boolean; + cropperCancelText?: string; + cropperCancelColor?: string; + cropperChooseText?: string; + cropperChooseColor?: string; + cropperRotateButtonsHidden?: boolean + showCropGuidelines?: boolean; + showCropFrame?: boolean; + enableRotationGesture?: boolean; + disableCropperColorSetters?: boolean; + compressImageMaxWidth?: number; + compressImageMaxHeight?: number; + writeTempFile?: boolean; +} + +export interface Image extends ImageVideoCommon { + data?: string | null; + cropRect?: CropRect | null; +} + +export interface Video extends ImageVideoCommon { + duration: number | null; +} + +export interface CropRect { + x: number; + y: number; + width: number; + height: number; +} + +export interface ImageOrVideo { + data?: string | null; + width?: number | null; + height?: number | null; + size?: number | null; + cropRect?: CropRect | null; + filename?: string | null; + path?: string | null; + exif?: Exif | null; + mime?: string | null; + sourceURL?: string | null; + creationDate?: string | null; + modificationDate?: string | null; + localIdentifier?: string | null; + duration?: string | null; +} + +export interface ImageVideoCommon { + path: string; + size: number; + width: number; + height: number; + mime: string; + exif?: Exif; + localIdentifier?: string; + sourceURL?: string; + filename?: string; + creationDate?: string; + modificationDate?: string; +} + +export interface Exif { + BitsPerSample?: string; + Orientation?: string; + ImageLength?: string; + ImageWidth?: string; + GPSLatitude?: string; + GPSLongitude?: string; + GPSLatitudeRef?: string; + GPSLongitudeRef?: string; + DateTimeOriginal?: string; + ExposureTime?: string; + SceneType?: string; + ISOSpeedRatings?: string; + FNumber?: string; +} + +export class FilePath { + path?: string; +} + +export interface VideoImageInfo { + data?: string | null; + width?: number | null; + height?: number | null; + size?: number | null; + cropRect?: CropRect | null; + filename?: string | null; + path?: string | null; + exif?: Exif | null; + mime?: string | null; + sourceURL?: string | null; + creationDate?: number | null; + modificationDate?: number | null; + localIdentifier?: string | null; + duration?: string | null; +} + +export interface FilePathResult { + result?: FilePath[]; +} + +export class AbilityResult { + resultCode: number; + want?: Want; +} + +export class ImageCropPickerTurboModule extends TurboModule implements ImageCropPicker.Spec { + constructor(protected ctx: TurboModuleContext) { + super(ctx); + } + + isNullOrUndefined(value: any): boolean { + return value === null || value === undefined || value === ''; + } + + async openPicker(options?: Options): Promise { + Logger.info(`${TAG} into openPicker request ${JSON.stringify(options)}`); + let cropping = this.isNullOrUndefined(options?.cropping) ? false : options?.cropping; + let minFiles = this.isNullOrUndefined(options?.minFiles) ? MinNumber : options.minFiles; + let maxFiles = this.isNullOrUndefined(options?.maxFiles) ? MaxNumber : options.maxFiles; + let isShowSerialNum = this.isNullOrUndefined(options?.showsSelectedCount) ? true : options?.showsSelectedCount; + if (options.multiple && minFiles > maxFiles) { + return new Promise(async (res, rej) => { + rej('minFiles is error') + }) + } + let quality = options.compressImageQuality; + if (!this.isNullOrUndefined(quality) && !(quality >= 0 && quality <= 1)) { + return new Promise(async (res, rej) => { + rej('quality is error') + }) + } + let multiple = this.isNullOrUndefined(options.multiple) ? false : options.multiple; + let mediaType = options.mediaType == 'photo' ? photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE + : (options.mediaType == 'video' ? photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE : photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE); + + let writeTempFile = this.isNullOrUndefined(options.writeTempFile) ? true : options.writeTempFile; + let qualityNumber = this.isNullOrUndefined(options.compressImageQuality) ? ImageQuality : options.compressImageQuality; + let forceJpg = this.isNullOrUndefined(options.forceJpg) ? false : options.forceJpg; + try { + let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions(); + photoSelectOptions.MIMEType = mediaType; + photoSelectOptions.maxSelectNumber = multiple ? maxFiles : 1; + photoSelectOptions.isSearchSupported = false; + let photoPicker = new photoAccessHelper.PhotoViewPicker(); + let result: photoAccessHelper.PhotoSelectResult = await photoPicker.select(photoSelectOptions); + let sourceFilePaths: Array = result.photoUris as Array; + if (sourceFilePaths.length < MINIMUM_VALUE) { + return new Promise(async (res, rej) => { + rej('sourceFilePaths is empty') + }) + } + let tempFilePaths = null; + Logger.info(`${TAG} into openPicker tempFilePaths ${JSON.stringify(sourceFilePaths)}`); + if (qualityNumber !== 1 || forceJpg) { + Logger.info(`${TAG} qualityNumber = ${qualityNumber} forceJpg = ${forceJpg}`); + tempFilePaths = await this.compressPictures(qualityNumber * 100, forceJpg, sourceFilePaths); + } else { + tempFilePaths = writeTempFile ? this.getTempFilePaths(sourceFilePaths) : null; + } + + let tempFilePath = null; + const isImg = tempFilePaths ? this.isImage(tempFilePaths[0]) : false; + if (!multiple && isImg && cropping) { + const imgCropPath = await this.intoCropper(tempFilePaths[0], options); + if (!this.isNullOrUndefined(imgCropPath)) { + tempFilePath = imgCropPath; + Logger.info(`${TAG} into openCamera imgCropPath = ${imgCropPath}`); + } + let exifInfo; + if (options?.includeExif) { + try { + let exifFile = fs.openSync(tempFilePath, fs.OpenMode.READ_ONLY); + let exifImageIS = image.createImageSource(exifFile.fd); + exifInfo = await this.getImageExif(exifImageIS); + } catch (err) { + Logger.error(`${TAG} into getPickerResult err : ${JSON.stringify(err)}`); + } + } + let imgResult: Image = { + data: null, + cropRect: null, + path: null, + size: 0, + width: 0, + height: 0, + mime: '', + exif: null, + localIdentifier: '', + sourceURL: '', + filename: '', + creationDate: null, + modificationDate: null + }; + await this.getFileInfo(options?.includeBase64, tempFilePath, null, exifInfo).then((imageInfo) => { + imgResult.path = filePrefix + imgCropPath; + imgResult.exif = imageInfo.exif; + imgResult.data = imageInfo.data; + imgResult.size = imageInfo.size; + imgResult.width = imageInfo.width; + imgResult.height = imageInfo.height; + imgResult.filename = imageInfo.filename; + imgResult.mime = imageInfo.mime; + imgResult.localIdentifier = imageInfo.localIdentifier; + imgResult.cropRect = imageInfo.cropRect; + imgResult.creationDate = imageInfo.creationDate + ''; + imgResult.modificationDate = imageInfo.modificationDate + ''; + }) + return imgResult; + } + + return this.getPickerResult(options, sourceFilePaths, tempFilePaths); + } catch (error) { + Logger.error(`${TAG} PhotoViewPicker failed err: ${JSON.stringify(error)}`); + return new Promise(async (res, rej) => { + rej('PhotoViewPicker is failed') + }) + } + } + + getTempFilePaths(images: Array): Array { + let resultImages: Array = new Array(); + Logger.info(`${TAG} getTempFilePaths images = ${images}`); + for (let srcPath of images) { + Logger.info(`${TAG} getTempFilePaths img srcPath = ${srcPath}`); + let i = srcPath.lastIndexOf('.'); + let imageType = ''; + if (i != -1) { + imageType = srcPath.substring(i + 1); + Logger.info(`${TAG} getTempFilePaths img imageType = ${imageType}`); + } + let file = fs.openSync(srcPath, fs.OpenMode.CREATE); + let dstPath = this.ctx.uiAbilityContext.tempDir + '/rn_image_crop_picker_lib_temp_' + util.generateRandomUUID(true) + '.' + imageType; + try { + fs.copyFileSync(file.fd, dstPath, 0); + resultImages.push(dstPath); + Logger.info(`${TAG} getTempFilePaths suc dstPath = ${dstPath}`); + } catch (err) { + Logger.info(`${TAG}, getTempFilePaths fail err = ${JSON.stringify(err)}`); + } + fs.closeSync(file); + } + return resultImages; + } + + async getPickerResult(options: Options, sourceFilePaths: Array, tempFilePaths: Array): Promise { + Logger.info(`${TAG}, into openPickerResult :`); + let resultsList: ImageOrVideo[] = []; + let includeExif = this.isNullOrUndefined(options?.includeExif) ? false : options?.includeExif; + let images = this.isNullOrUndefined(tempFilePaths) ? sourceFilePaths : tempFilePaths; + Logger.info(`${TAG} into openPickerResult : images = ${images}`); + let includeBase64 = this.isNullOrUndefined(options.includeBase64) ? false : options.includeBase64; + let results; + for (let j = 0; j < images.length; j++) { + results = { + duration: null, + data: null, + cropRect: null, + path: null, + size: 0, + width: 0, + height: 0, + mime: '', + exif: null, + localIdentifier: '', + sourceURL: '', + filename: '', + creationDate: null, + modificationDate: null + }; + let value = images[j]; + if (this.isNullOrUndefined(value)) { + return; + } + let imageType; + let i = value.lastIndexOf('/') + let fileName = value.substring(i + 1) + i = value.lastIndexOf('.') + if (i != -1) { + imageType = value.substring(i + 1) + } + results.sourceURL = sourceFilePaths[j]; + results.filename = fileName; + let exifInfo; + // /\.(jpeg)$/i.test(sourceFilePaths[j]) + if (includeExif) { + try { + let exifFile = fs.openSync(sourceFilePaths[j], fs.OpenMode.READ_ONLY); + let exifImageIS = image.createImageSource(exifFile.fd); + exifInfo = await this.getImageExif(exifImageIS); + } catch (err) { + Logger.error(`${TAG} into getPickerResult err : ${JSON.stringify(err)}`); + } + } + results.exif = exifInfo; + let file = fs.openSync(value, fs.OpenMode.READ_ONLY) + Logger.info(`${TAG} into openSync : file.fd = ${file.fd} file.path = ${file.path} file.name = ${file.name}`); + let stat = fs.statSync(file.fd); + let length = stat.size; + results.size = length; + results.creationDate = stat.ctime + ''; + results.modificationDate = stat.mtime + ''; + results.path = this.isNullOrUndefined(tempFilePaths) ? null : filePrefix + value; + if (this.isImage(value)) { + results.data = includeBase64 ? this.imageToBase64(value) : null; + results.mime = 'image/' + imageType; + Logger.info(`${TAG} into openPickerResult value : ${value}`); + let imageIS = image.createImageSource(file.fd) + let imagePM = await imageIS.createPixelMap() + Logger.info(`${TAG} end createImageSource : imageIS = ${imageIS} imagePM = ${imagePM}`); + let imgInfo = await imagePM.getImageInfo(); + results.height = imgInfo.size.height; + results.width = imgInfo.size.width; + imagePM.release().then(() => { + imagePM = undefined; + }) + imageIS.release().then(() => { + imageIS = undefined; + }) + results.duration = null; + } else { + Logger.info(`${TAG} into getPickerResult video start`); + results.data = null; + results.mime = 'video/' + imageType; + let url = 'fd://' + file.fd; + Logger.info(`${TAG} start avPlayer url = ${url}`); + avMetadataExtractor = await media.createAVMetadataExtractor(); + avMetadataExtractor.fdSrc = { fd: file.fd, offset: 0, length: length }; + try { + const res = await avMetadataExtractor.fetchMetadata(); + results.duration = res.duration; + results.width = Number(res.videoWidth); + results.height = Number(res.videoHeight); + } catch (error) { + Logger.error(`${TAG} get video info suc error = ${JSON.stringify(error)}`); + } + } + resultsList.push(results); + fs.closeSync(file); + } + return options.multiple ? resultsList : results; + } + + async openCamera(options?: Options): Promise { + Logger.info(`${TAG} into openCamera request = ${JSON.stringify(options)}`); + let cropping = this.isNullOrUndefined(options?.cropping) ? false : options?.cropping; + let quality = options.compressImageQuality; + if (!this.isNullOrUndefined(quality) && !(quality >= 0 && quality <= 1)) { + return new Promise(async (res, rej) => { + rej('quality is error') + }) + } + let isImg = false; + let imgResult: Image = { + data: null, + cropRect: null, + path: null, + size: 0, + width: 0, + height: 0, + mime: '', + exif: null, + localIdentifier: '', + sourceURL: '', + filename: '', + creationDate: null, + modificationDate: null + }; + let videoResult: Video = { + duration: null, + path: null, + size: 0, + width: 0, + height: 0, + mime: '', + exif: null, + localIdentifier: '', + sourceURL: '', + filename: '', + creationDate: null, + modificationDate: null + }; + let useFrontCamera = this.isNullOrUndefined(options.useFrontCamera) ? false : options.useFrontCamera; + let writeTempFile = this.isNullOrUndefined(options?.writeTempFile) ? true : options?.writeTempFile; + let includeBase64 = this.isNullOrUndefined(options.includeBase64) ? false : options.includeBase64; + let qualityNumber = this.isNullOrUndefined(options.compressImageQuality) ? ImageQuality : options.compressImageQuality; + let forceJpg = this.isNullOrUndefined(options.forceJpg) ? false : options.forceJpg; + let mediaType = options.mediaType == 'photo' ? [picker.PickerMediaType.PHOTO] : (options.mediaType == 'video' + ? [picker.PickerMediaType.VIDEO] : [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO]); + return new Promise(async (res, rej) => { + try { + let mContext = await this.ctx.uiAbilityContext; + let pickerProfile: picker.PickerProfile = { + cameraPosition: useFrontCamera ? camera.CameraPosition.CAMERA_POSITION_FRONT : camera.CameraPosition.CAMERA_POSITION_BACK, + }; + let pickerResult: picker.PickerResult = await picker.pick(mContext, mediaType, pickerProfile); + Logger.info(`${TAG} into openCamera results = ${JSON.stringify(pickerResult)}`); + let imgOrVideoPath = pickerResult.resultUri; + isImg = this.isImage(imgOrVideoPath); + if (isImg) { + let file = fs.openSync(imgOrVideoPath, fs.OpenMode.READ_ONLY); + try { + let dstPath = this.ctx.uiAbilityContext.tempDir + '/rn_image_crop_picker_lib_temp_' + util.generateRandomUUID(true) + '.jpeg'; + fs.copyFileSync(file.fd, dstPath, 0); + imgOrVideoPath = dstPath; + Logger.info(`${TAG} into openCamera suc dstPath = ${dstPath}`); + } catch (err) { + Logger.error(`${TAG} into openCamera fail err = ${JSON.stringify(err)}`); + } + fs.closeSync(file); + } + let tempFilePaths = null; + let sourceFilePaths: Array = [imgOrVideoPath]; + if (qualityNumber !== 1 || forceJpg) { + Logger.info(`${TAG} into openCamera qualityNumber = ${qualityNumber} forceJpg = ${forceJpg}`); + tempFilePaths = await this.compressPictures(qualityNumber * 100, forceJpg, sourceFilePaths); + } else { + tempFilePaths = writeTempFile ? this.getTempFilePaths(sourceFilePaths) : null; + } + let tempFilePath = this.isNullOrUndefined(tempFilePaths) ? null : tempFilePaths[0]; + let includeExif = this.isNullOrUndefined(options?.includeExif) ? false : options?.includeExif; + if (isImg) { + let exifInfo; + // /\.(jpeg)$/i.test(imgOrVideoPath) + if (includeExif) { + try { + let exifFile = fs.openSync(imgOrVideoPath, fs.OpenMode.READ_ONLY); + let exifImageIS = image.createImageSource(exifFile.fd); + exifInfo = await this.getImageExif(exifImageIS); + } catch (err) { + Logger.error(`${TAG} into openCamera err = ${JSON.stringify(err)}`); + } + } + let imgCropPath = cropping ? await this.intoCropper(imgOrVideoPath, options) : ''; + if (!this.isNullOrUndefined(imgCropPath)) { + tempFilePath = imgCropPath; + Logger.info(`${TAG} into openCamera imgCropPath = ${imgCropPath}`); + } + this.getFileInfo(includeBase64, imgOrVideoPath, tempFilePath, exifInfo).then((imageInfo) => { + imgResult.sourceURL = imgOrVideoPath; + imgResult.path = this.isNullOrUndefined(tempFilePath) ? filePrefix + imgOrVideoPath : filePrefix + tempFilePath; + imgResult.exif = imageInfo.exif; + imgResult.data = imageInfo.data; + imgResult.size = imageInfo.size; + imgResult.width = imageInfo.width; + imgResult.height = imageInfo.height; + imgResult.filename = imageInfo.filename; + imgResult.mime = imageInfo.mime; + imgResult.localIdentifier = imageInfo.localIdentifier; + imgResult.cropRect = imageInfo.cropRect; + imgResult.creationDate = imageInfo.creationDate + ''; + imgResult.modificationDate = imageInfo.modificationDate + ''; + res(imgResult); + }) + } else { + this.getFileInfo(false, imgOrVideoPath, tempFilePath, null).then((imageInfo) => { + videoResult.sourceURL = imgOrVideoPath; + videoResult.path = this.isNullOrUndefined(tempFilePath) ? imgOrVideoPath : filePrefix + tempFilePath; + videoResult.exif = imageInfo.exif; + videoResult.size = imageInfo.size; + videoResult.width = imageInfo.width; + videoResult.height = imageInfo.height; + videoResult.filename = imageInfo.filename; + videoResult.mime = imageInfo.mime; + videoResult.localIdentifier = imageInfo.localIdentifier; + videoResult.creationDate = imageInfo.creationDate + ''; + videoResult.modificationDate = imageInfo.modificationDate + ''; + videoResult.duration = Number(imageInfo.duration); + res(videoResult); + }) + } + } catch (error) { + let err = error as BusinessError; + rej(JSON.stringify(err)); + } + }) + }; + + imageToBase64(filePath: string): string { + Logger.info(`${TAG} into imageToBase64 filePath = ${filePath}`); + let uriPath = new uri.URI(filePath); + let dstPath = filePath; + if (uriPath.host === 'media') { + let i = filePath.lastIndexOf('.'); + let imageType; + if (i != -1) { + imageType = filePath.substring(i + 1); + } + let file = fs.openSync(filePath, fs.OpenMode.CREATE); + try { + dstPath = this.ctx.uiAbilityContext.tempDir + '/rn_image_crop_picker_lib_temp_' + util.generateRandomUUID(true) + '.' + imageType; + fs.copyFileSync(file.fd, dstPath, 0); + Logger.info(`${TAG} into imageToBase64 suc dstPath = ${dstPath}`); + } catch (err) { + Logger.error(`${TAG} into imageToBase64 fail err = ${JSON.stringify(err)}`); + } + fs.closeSync(file); + } + let base64Data; + try { + let file = fs.openSync(dstPath, fs.OpenMode.READ_ONLY); + let stat = fs.lstatSync(dstPath); + Logger.info(`${TAG} into imageToBase64 stat.size = ${stat.size}`); + let buf = new ArrayBuffer(stat.size); + fs.readSync(file.fd, buf); + let unit8Array: Uint8Array = new Uint8Array(buf); + let base64Helper = new util.Base64Helper(); + base64Data = base64Helper.encodeToStringSync(unit8Array, util.Type.BASIC); + fs.closeSync(file); + Logger.info(`${TAG} into imageToBase64 base64Data = ${base64Data}`); + } catch (err) { + Logger.error(`${TAG} into imageToBase64 err = ${JSON.stringify(err)}`); + } + return base64Data; + } + + isImage(filePath: string): boolean { + Logger.info(`${TAG} into isImage fileName = ${filePath}`); + const imageExtensionsRegex = /\.(jpg|jpeg|png|gif|bmp|webp)$/i; + return imageExtensionsRegex.test(filePath); + } + + async compressPictures(quality: number, forceJpg: boolean, sourceURL: Array): Promise> { + Logger.info(`${TAG} into compressPictures sourceURL = ${sourceURL} quality = ${quality} forceJpg = ${forceJpg}`); + let imageType: string = 'jpg'; + let resultImages: Array = new Array(); + quality = (quality > 100) ? 100 : quality; + for (let srcPath of sourceURL) { + if (this.isImage(srcPath)) { + Logger.info(`${TAG} into compressPictures img srcPath = ${srcPath}`); + if (forceJpg) { + imageType = 'jpg' + } else { + let i = srcPath.lastIndexOf('.'); + if (i != -1) { + imageType = srcPath.substring(i + 1); + } + } + Logger.info(`${TAG} into compressPictures imageType = ${imageType}`); + let files = fs.openSync(srcPath, fs.OpenMode.READ_ONLY) + let imageISs = image.createImageSource(files.fd); + let imagePMs = await imageISs.createPixelMap(); + let imagePackerApi = await image.createImagePacker(); + let options: image.PackingOption = { + format: 'image/jpeg', + quality: quality, + }; + try { + let packerData = await imagePackerApi.packing(imagePMs, options); + Logger.info(`${TAG} into compressPictures data = ${JSON.stringify(packerData)}`); + let dstPath = this.ctx.uiAbilityContext.tempDir + '/rn_image_crop_picker_lib_temp_' + util.generateRandomUUID(true) + '.' + imageType; + let newFile = fs.openSync(dstPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); + Logger.info(`${TAG} into compressPictures newFile id = ${newFile.fd}`); + const number = fs.writeSync(newFile.fd, packerData); + Logger.info(`${TAG} into compressPictures write data to file succeed size = ${number}`); + resultImages.push(dstPath); + fs.closeSync(files); + } catch (err) { + Logger.error(`${TAG} into compressPictures write data to file failed err = ${JSON.stringify(err)}`); + } + } else { + Logger.info(`${TAG} into compressPictures video srcPath = ${srcPath}`); + resultImages.push(srcPath); + } + } + return resultImages; + } + + async getListFile(): Promise { + let filePathResult: FilePathResult = { result: [] }; + let filesDir = this.ctx.uiAbilityContext.tempDir; + + class ListFileOption { + public recursion: boolean = false; + public listNum: number = 0; + public filter: Filter = {}; + } + + let option = new ListFileOption(); + option.filter.suffix = ['.jpg']; + option.filter.displayName = ['*']; + option.filter.fileSizeOver = 0; + option.filter.lastModifiedAfter = new Date(0).getTime(); + Logger.info(`${TAG} into getListFile filesDir = ${filesDir}`); + let files = fs.listFileSync(filesDir, option); + for (let i = 0; i < files.length; i++) { + let listFilePath: FilePath = {} + listFilePath.path = files[i]; + filePathResult.result.push(listFilePath); + } + Logger.info(`${TAG} into getListFile arrayList = ${JSON.stringify(filePathResult)}`); + return filePathResult; + } + + async cleanSingle(path: string): Promise { + Logger.info(`${TAG} into cleanSingle path = ${path}`); + let filePath = path.trim(); + fs.access(filePath, (err) => { + if (err) { + Logger.info(`${TAG} cleanSingle access error data = ${err.data}`); + } else { + fs.unlink(filePath).then(() => { + Logger.info(`${TAG} cleanSingle file succeed`); + }).catch((err: BusinessError) => { + Logger.error(`${TAG} cleanSingle err = ${JSON.stringify(err)}`); + }); + } + }); + } + + async clean(): Promise { + let dirPath = this.ctx.uiAbilityContext.tempDir; + fs.rmdir(dirPath).then(() => { + Logger.info(`${TAG} clean rmdir succeed`); + }).catch((err: BusinessError) => { + Logger.error(`${TAG} clean rmdir err = ${JSON.stringify(err)}`); + }); + } + + async openCropper(options?: CropperOptions): Promise { + Logger.info(`${TAG} into openCropper = ${JSON.stringify(options)}`); + let path = options?.path; + if (this.isNullOrUndefined(path?.trim())) { + return new Promise(async (res, rej) => { + rej('path is empty') + }) + } + let quality = options.compressImageQuality; + if (!this.isNullOrUndefined(quality) && !(quality >= 0 && quality <= 1)) { + return new Promise(async (res, rej) => { + rej('quality is error') + }) + } + let result: Image = { + data: null, + cropRect: null, + path: null, + size: 0, + width: 0, + height: 0, + mime: '', + exif: null, + localIdentifier: '', + sourceURL: '', + filename: '', + creationDate: null, + modificationDate: null + }; + let includeExif = this.isNullOrUndefined(options?.includeExif) ? false : options?.includeExif; + let writeTempFile = this.isNullOrUndefined(options?.writeTempFile) ? true : options?.writeTempFile; + let qualityNumber = this.isNullOrUndefined(options.compressImageQuality) ? ImageQuality : options.compressImageQuality; + let forceJpg = this.isNullOrUndefined(options.forceJpg) ? false : options.forceJpg; + let imgPath = await this.intoCropper(path, options); + Logger.info(`${TAG} into openCropper imgPath = ${imgPath}`); + if (this.isNullOrUndefined(imgPath)) { + return new Promise(async (res, rej) => { + rej('imgPath is null') + }) + } + let tempFilePaths = null; + let sourceFilePaths: Array = [imgPath]; + if (qualityNumber !== 1 || forceJpg) { + Logger.info(`${TAG} into openCropper qualityNumber = ${qualityNumber} forceJpg = ${forceJpg}`); + tempFilePaths = await this.compressPictures(qualityNumber * 100, forceJpg, sourceFilePaths); + } else { + tempFilePaths = writeTempFile ? this.getTempFilePaths(sourceFilePaths) : null; + } + let tempFilePath = this.isNullOrUndefined(tempFilePaths) ? null : tempFilePaths[0]; + let exifInfo; + // /\.(jpeg)$/i.test(path) + if (includeExif) { + try { + let exifFile = fs.openSync(path, fs.OpenMode.READ_ONLY); + let exifImageIS = image.createImageSource(exifFile.fd); + exifInfo = await this.getImageExif(exifImageIS); + } catch (err) { + Logger.error(`${TAG} into openCamera err = ${JSON.stringify(err)}`); + } + } + return new Promise(async (res, rej) => { + this.getFileInfo(options?.includeBase64, imgPath, tempFilePath, exifInfo).then((imageInfo) => { + result.path = this.isNullOrUndefined(tempFilePath) ? filePrefix + imgPath : filePrefix + tempFilePath; + result.exif = imageInfo.exif; + result.sourceURL = options?.path; + result.data = imageInfo.data; + result.size = imageInfo.size; + result.width = imageInfo.width; + result.height = imageInfo.height; + result.filename = imageInfo.filename; + result.mime = imageInfo.mime; + result.localIdentifier = imageInfo.localIdentifier; + result.cropRect = imageInfo.cropRect; + result.creationDate = imageInfo.creationDate + ''; + result.modificationDate = imageInfo.modificationDate + ''; + res(result); + }) + }) + } + + async getFileInfo(includeBase64: boolean, filePath: string, compressOrTempFilePath: string, exifInfo: Exif): Promise { + let videoImageInfo: VideoImageInfo = { duration: null }; + let imageType; + let i = this.isNullOrUndefined(compressOrTempFilePath) ? filePath.lastIndexOf('/') : compressOrTempFilePath.lastIndexOf('/') + let fileName = this.isNullOrUndefined(compressOrTempFilePath) ? filePath.substring(i + 1) : compressOrTempFilePath.substring(i + 1) + i = filePath.lastIndexOf('.') + if (i != -1) { + imageType = filePath.substring(i + 1) + } + videoImageInfo.path = this.isNullOrUndefined(compressOrTempFilePath) ? filePrefix + filePath : compressOrTempFilePath + filePath; + videoImageInfo.filename = fileName; + videoImageInfo.mime = 'image/' + imageType; + + let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY) + let stat = fs.statSync(file.fd); + let length = stat.size; + videoImageInfo.size = length; + videoImageInfo.creationDate = stat.ctime; + videoImageInfo.modificationDate = stat.mtime; + if (this.isImage(filePath)) { + let imageIS = image.createImageSource(file.fd) + let imagePM = await imageIS.createPixelMap() + let imgInfo = await imagePM.getImageInfo(); + videoImageInfo.data = includeBase64 ? this.imageToBase64(compressOrTempFilePath || filePath) : null; + videoImageInfo.height = imgInfo.size.height; + videoImageInfo.width = imgInfo.size.width; + videoImageInfo.exif = exifInfo; + imagePM.release().then(() => { + imagePM = undefined; + }) + imageIS.release().then(() => { + imageIS = undefined; + }) + } else { + videoImageInfo.mime = 'video/' + imageType; + let url = 'fd://' + file.fd; + Logger.info(`${TAG} start avPlayer url = ${url}`); + avMetadataExtractor = await media.createAVMetadataExtractor(); + avMetadataExtractor.fdSrc = { fd: file.fd, offset: 0, length: length }; + try { + const res = await avMetadataExtractor.fetchMetadata(); + videoImageInfo.duration = res.duration; + videoImageInfo.width = Number(res.videoWidth); + videoImageInfo.height = Number(res.videoHeight); + } catch (error) { + Logger.error(`${TAG} get video info suc error = ${JSON.stringify(error)}`); + } + } + + videoImageInfo.cropRect = AppStorage.get('cropRect') as CropRect; + + fs.close(file.fd); + return videoImageInfo; + } + + async intoCropper(filePath: string, options?: Options | CropperOptions): Promise { + Logger.info(`${TAG} into intoCropper : filePath = ${filePath}`); + let imagePath: string; + const bundleName = this.ctx.uiAbilityContext.abilityInfo.bundleName; + AppStorage.setOrCreate('filePath', filePath); + return new Promise((res, rej) => { + const initWidth: number = this.isNullOrUndefined(options?.width) ? 0 : options?.width; + const initHeight: number = this.isNullOrUndefined(options?.height) ? 0 : options?.height; + const enableRotationGesture: boolean = this.isNullOrUndefined(options?.enableRotationGesture) ? false : options?.enableRotationGesture; + const title: string = this.isNullOrUndefined(options?.cropperToolbarTitle) ? '编辑图片' : options?.cropperToolbarTitle; + const chooseText: string = this.isNullOrUndefined(options?.cropperChooseText) ? 'Choose' : options?.cropperChooseText; + const chooseTextColor: string = this.isNullOrUndefined(options?.cropperChooseColor) ? '#FFCC00' : options?.cropperChooseColor; + const cancelText: string = this.isNullOrUndefined(options?.cropperCancelText) ? 'Cancel' : options?.cropperCancelText; + const cancelTextColor: string = this.isNullOrUndefined(options?.cropperCancelColor) ? '#0000FF' : options?.cropperCancelColor; + const showCropGuidelines: boolean = this.isNullOrUndefined(options?.showCropGuidelines) ? true : options?.showCropGuidelines; + const showCropFrame: boolean = this.isNullOrUndefined(options?.showCropFrame) ? true : options?.showCropFrame; + const freeStyleCropEnabled: boolean = this.isNullOrUndefined(options?.freeStyleCropEnabled) ? false : options?.freeStyleCropEnabled; + const cropperRotate: string = options?.cropperRotateButtonsHidden + ''; + AppStorage.setOrCreate('initWidth', initWidth); + AppStorage.setOrCreate('initHeight', initHeight); + AppStorage.setOrCreate('enableRotationGesture', enableRotationGesture); + AppStorage.setOrCreate('textTitle', title); + AppStorage.setOrCreate('chooseText', chooseText); + AppStorage.setOrCreate('chooseTextColor', chooseTextColor); + AppStorage.setOrCreate('cancelText', cancelText); + AppStorage.setOrCreate('cancelTextColor', cancelTextColor); + AppStorage.setOrCreate('cropperRotate', cropperRotate); + AppStorage.setOrCreate('showCropGuidelines', showCropGuidelines); + AppStorage.setOrCreate('showCropFrame', showCropFrame); + AppStorage.setOrCreate('freeStyleCropEnabled', freeStyleCropEnabled); + + try { + let want: Want = { + "bundleName": bundleName, + "abilityName": "ImageEditAbility", + } + this.ctx.uiAbilityContext.startAbilityForResult(want, (error, data) => { + imagePath = AppStorage.get('cropImagePath') as string; + AppStorage.setOrCreate('cropImagePath', '') + Logger.info(`${TAG} into intoCropper startAbility suc imagePath = ${imagePath}`); + res(imagePath); + }); + } catch (err) { + Logger.error(`${TAG} into intoCropper startAbility err = ${JSON.stringify(err)}`); + res('') + } + }); + } + + async getImageExif(imageSource: image.ImageSource): Promise { + Logger.info(`${TAG} into getImageExif:`); + let bitsPerSample; + let orientation; + let imageLength; + let imageWidth; + let gpsLatitude; + let gpsLongitude; + let gpsLatitudeRef; + let gpsLongitudeRef; + let dateTimeOriginal; + let exposureTime; + let sceneType; + let isoSpeedRatings; + let fNumber; + try { + bitsPerSample = await imageSource.getImageProperty(image.PropertyKey.BITS_PER_SAMPLE); + } catch (err) { + Logger.info(`${TAG} into getImageExif bitsPerSample err = ${JSON.stringify(err)}`); + } + try { + orientation = await imageSource.getImageProperty(image.PropertyKey.ORIENTATION); + } catch (err) { + Logger.info(`${TAG} into getImageExif orientation err = ${JSON.stringify(err)}`); + } + try { + imageLength = await imageSource.getImageProperty(image.PropertyKey.IMAGE_LENGTH); + } catch (err) { + Logger.info(`${TAG} into getImageExif imageLength err = ${JSON.stringify(err)}`); + } + try { + imageWidth = await imageSource.getImageProperty(image.PropertyKey.IMAGE_WIDTH); + } catch (err) { + Logger.info(`${TAG} into getImageExif imageWidth err = ${JSON.stringify(err)}`); + } + try { + gpsLatitude = await imageSource.getImageProperty(image.PropertyKey.GPS_LATITUDE); + } catch (err) { + Logger.info(`${TAG} into getImageExif gpsLatitude err = ${JSON.stringify(err)}`); + } + try { + gpsLongitude = await imageSource.getImageProperty(image.PropertyKey.GPS_LONGITUDE); + } catch (err) { + Logger.info(`${TAG} into getImageExif gpsLongitude err = ${JSON.stringify(err)}`); + } + try { + gpsLatitudeRef = await imageSource.getImageProperty(image.PropertyKey.GPS_LATITUDE_REF); + } catch (err) { + Logger.info(`${TAG} into getImageExif gpsLatitudeRef err = ${JSON.stringify(err)}`); + } + try { + gpsLongitudeRef = await imageSource.getImageProperty(image.PropertyKey.GPS_LONGITUDE_REF); + } catch (err) { + Logger.info(`${TAG} into getImageExif gpsLongitudeRef err = ${JSON.stringify(err)}`); + } + try { + dateTimeOriginal = await imageSource.getImageProperty(image.PropertyKey.DATE_TIME_ORIGINAL); + } catch (err) { + Logger.info(`${TAG} into getImageExif dateTimeOriginal err = ${JSON.stringify(err)}`); + } + try { + exposureTime = await imageSource.getImageProperty(image.PropertyKey.EXPOSURE_TIME); + } catch (err) { + Logger.info(`${TAG} into getImageExif exposureTime err = ${JSON.stringify(err)}`); + } + try { + sceneType = await imageSource.getImageProperty(image.PropertyKey.SCENE_TYPE); + } catch (err) { + Logger.info(`${TAG} into getImageExif sceneType err = ${JSON.stringify(err)}`); + } + try { + isoSpeedRatings = await imageSource.getImageProperty(image.PropertyKey.ISO_SPEED_RATINGS); + } catch (err) { + Logger.info(`${TAG} into getImageExif isoSpeedRatings err = ${JSON.stringify(err)}`); + } + try { + fNumber = await imageSource.getImageProperty(image.PropertyKey.F_NUMBER); + } catch (err) { + Logger.info(`${TAG} into getImageExif fNumber err = ${JSON.stringify(err)}`); + } + return { + BitsPerSample: bitsPerSample, + Orientation: orientation, + ImageLength: imageLength, + ImageWidth: imageWidth, + GPSLatitude: gpsLatitude, + GPSLongitude: gpsLongitude, + GPSLatitudeRef: gpsLatitudeRef, + GPSLongitudeRef: gpsLongitudeRef, + DateTimeOriginal: dateTimeOriginal, + ExposureTime: exposureTime, + SceneType: sceneType, + ISOSpeedRatings: isoSpeedRatings, + FNumber: fNumber, + } + } + + grantPermission(): Promise { + Logger.info(`${TAG} into grantPermission:`); + const permissions: Array = [ + 'ohos.permission.READ_MEDIA', + 'ohos.permission.WRITE_MEDIA', + 'ohos.permission.MEDIA_LOCATION', + ]; + return new Promise((res, rej) => { + atManager.requestPermissionsFromUser(this.ctx.uiAbilityContext, permissions) + .then((data: PermissionRequestResult) => { + res(data?.authResults[0] === 0) + }).catch((err) => { + res(false) + Logger.info(`${TAG} grantPermission err = ${JSON.stringify(err)}`); + }) + }); + } +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/Logger.ts b/harmony/image_crop_picker/src/main/ets/Logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bae2f479e6114e10144d0f74fe6bff5b9fe0415 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/Logger.ts @@ -0,0 +1,38 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +import hilog from '@ohos.hilog'; + +class Logger { + private domain: number; + private prefix: string; + private format: string = '%{public}s, %{public}s'; + private isDebug: boolean; + + constructor(prefix: string = 'MyApp', domain: number = 0xFF00, isDebug = false) { + this.prefix = prefix; + this.domain = domain; + this.isDebug = isDebug; + } + + debug(...args: string[]): void { + if (this.isDebug) { + hilog.debug(this.domain, this.prefix, this.format, args); + } + } + + info(...args: string[]): void { + hilog.info(this.domain, this.prefix, this.format, args); + } + + warn(...args: string[]): void { + hilog.warn(this.domain, this.prefix, this.format, args); + } + + error(...args: string[]): void { + hilog.error(this.domain, this.prefix, this.format, args); + } +} + +export default new Logger('ImageCropPickerTurboModule', 0xFF00, true) \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/generated/components/ts.ts b/harmony/image_crop_picker/src/main/ets/generated/components/ts.ts new file mode 100644 index 0000000000000000000000000000000000000000..50160fa118b00faa27ec14da24bb8c18e3da8558 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/generated/components/ts.ts @@ -0,0 +1,5 @@ + +/** + */ + +export {} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/generated/index.ets b/harmony/image_crop_picker/src/main/ets/generated/index.ets new file mode 100644 index 0000000000000000000000000000000000000000..041b7edf42bfd5af1779aa40009e5d5e53e2152f --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/generated/index.ets @@ -0,0 +1,5 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +export * from "./ts" diff --git a/harmony/image_crop_picker/src/main/ets/generated/ts.ts b/harmony/image_crop_picker/src/main/ets/generated/ts.ts new file mode 100644 index 0000000000000000000000000000000000000000..4c568a8e486aaafd28ba432cf802ae5277923d56 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/generated/ts.ts @@ -0,0 +1,6 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +export * as RNC from "./components/ts" +export * as TM from "./turboModules/ts" diff --git a/harmony/image_crop_picker/src/main/ets/generated/turboModules/ImageCropPicker.ts b/harmony/image_crop_picker/src/main/ets/generated/turboModules/ImageCropPicker.ts new file mode 100644 index 0000000000000000000000000000000000000000..d9ac920312c7d4c66d9e82a75faf5aff92e10720 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/generated/turboModules/ImageCropPicker.ts @@ -0,0 +1,30 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +export namespace ImageCropPicker { + export const NAME = 'ImageCropPicker' as const + + export type CropperOptions = {multiple?: boolean, minFiles?: number, maxFiles?: number, waitAnimationEnd?: boolean, smartAlbums?: unknown[], useFrontCamera?: boolean, loadingLabelText?: string, showsSelectedCount?: boolean, sortOrder?: string, hideBottomControls?: boolean, writeTempFile?: boolean, mediaType: string, width?: number, height?: number, includeBase64?: boolean, includeExif?: boolean, forceJpg?: boolean, cropping?: boolean, avoidEmptySpaceAroundImage?: boolean, cropperActiveWidgetColor?: string, cropperStatusBarColor?: string, cropperToolbarColor?: string, cropperToolbarWidgetColor?: string, cropperToolbarTitle?: string, freeStyleCropEnabled?: boolean, cropperTintColor?: string, cropperCircleOverlay?: boolean, cropperCancelText?: string, cropperCancelColor?: string, cropperChooseText?: string, cropperChooseColor?: string, cropperRotateButtonHidden?: boolean, showCropGuidelines?: boolean, showCropFrame?: boolean, enableRotationGesture?: boolean, disableCropperColorSetters?: boolean, compressImageMaxWidth?: number, compressImageMaxHeight?: number, compressImageQuality?: number, path: string} + + export type Exif = {} + + export type ImageVideoCommon = {path: string, size: number, width: number, height: number, mime: string, exif?: Exif, localIdentifier?: string, sourceURL?: string, filename?: string, creationDate?: string, modificationDate?: string} + + export type CropRect = {x: number, y: number, width: number, height: number} + + export type Image = {path: string, size: number, width: number, height: number, mime: string, exif?: Exif, localIdentifier?: string, sourceURL?: string, filename?: string, creationDate?: string, modificationDate?: string, data?: null | string, cropRect?: null | CropRect} + + export interface Spec { + openPicker(options: Object): Promise; + + openCamera(options: Object): Promise; + + openCropper(options: CropperOptions): Promise; + + clean(): Promise; + + cleanSingle(path: string): Promise; + + } +} diff --git a/harmony/image_crop_picker/src/main/ets/generated/turboModules/ts.ts b/harmony/image_crop_picker/src/main/ets/generated/turboModules/ts.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c69b26c822d09e19e8a59574bbdd84d51d210e1 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/generated/turboModules/ts.ts @@ -0,0 +1,5 @@ +/** + * This code was generated by "react-native codegen-lib-harmony" + */ + +export * from "./ImageCropPicker" diff --git a/harmony/image_crop_picker/src/main/ets/pages/ImageEditInfo.ets b/harmony/image_crop_picker/src/main/ets/pages/ImageEditInfo.ets new file mode 100644 index 0000000000000000000000000000000000000000..1c47f812a97b2d9223e3e377082232aa816f0136 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/pages/ImageEditInfo.ets @@ -0,0 +1,862 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +import image from '@ohos.multimedia.image'; +import Logger from '../Logger'; +import display from '@ohos.display'; +import router from '@ohos.router'; +import { BusinessError } from '@ohos.base'; +import { Rectangle } from '../utils/types'; +import { Event } from '../utils/jul'; +import { Action, DownPos, DragObj } from '../utils/CropModel'; +import { Constants } from '../utils/Constants'; +import { getPixelMap } from '../utils/DecodeAndEncodeUtil'; +import { RotateType } from '../viewmodel/viewAndModel'; +import { encode } from '../utils/EncodeUtil'; + +let hotspotsWidth: number = 18; +const PHONE_MIN_CROP: number = 43; +const TAG: string = 'ImageEditInfo'; + +@Extend(Row) +function rowStyle() { + .width('100%') + .height(1) + .backgroundColor('#FFFFFF') + .opacity(0.5) +} + +@Extend(Row) +function rowStyle1(hasSplitLine: boolean) { + .width('100%') + .height(0.5) + .backgroundColor('#FFFFFF') + .opacity(hasSplitLine ? 0.5 : 0) +} + +@Extend(Row) +function rowStyle2(hasMoreSplitLine: boolean) { + .width('100%') + .height(0.5) + .backgroundColor('#FFFFFF') + .opacity(hasMoreSplitLine ? 0.2 : 0) +} + +@Extend(Column) +function columnStyle() { + .width(1) + .height('100%') + .backgroundColor('#FFFFFF') + .opacity(0.5) +} + +@Extend(Column) +function columnStyle1(hasSplitLine: boolean) { + .width(0.5) + .height('100%') + .backgroundColor('#FFFFFF') + .opacity(hasSplitLine ? 0.5 : 0) +} + +@Extend(Column) +function columnStyle2(hasMoreSplitLine: boolean) { + .width(0.5) + .height('100%') + .backgroundColor('#FFFFFF') + .opacity(hasMoreSplitLine ? 0.2 : 0) +} + +@Extend(Image) +function iconStyle() { + .size({ width: 24, height: 24 }) + .fillColor('#FFFFFF') + .opacity(0.9) +} + +@Extend(Row) +function bottomIconStyle() { + .size({ width: '20%', height: '100%' }) + .justifyContent(FlexAlign.Center) +} + +@Extend(Text) +function textStyle() { + .size({ width: '20%', height: '100%' }) + .textAlign(TextAlign.Center) +} + +@Entry +@Component +export struct ImageEditInfo { + @StorageProp('filePath') filePath: string = ''; + @StorageProp('cropperRotate') cropperRotate: string = ''; + setting: RenderingContextSettings = new RenderingContextSettings(true); + context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.setting); + @Provide('isPixelMapChange') @Watch('flushPixelMap') isPixelMapChange: boolean = false; + @StorageProp('initWidth') initWidth: number = 0; + @StorageProp('initHeight') initHeight: number = 0; + @StorageProp('textTitle') title: string = ''; + @StorageProp('cancelText') cancel: string = ''; + @StorageProp('cancelTextColor') cancelTextColor: string = ''; + @StorageProp('chooseText') choose: string = ''; + @StorageProp('chooseTextColor') chooseTextColor: string = ''; + @StorageProp('freeStyleCropEnabled') freeStyleCropEnabled: boolean = false; + @StorageProp('enableRotationGesture') enableRotationGesture: boolean = false; + @State uri: string = ''; + @State icon?: image.PixelMap = undefined; + @State imageWith: number = 0; + @State imageHeight: number = 0; + @State screenWidth: number = 0; + @State screenHeight: number = 0; + DEFAULT_MASK_STYLE: string = 'rgba(0, 0, 0, 0.3)'; + @State clipSize: Rectangle = new Rectangle(0, 0, 0, 0); + @State maxClipSize: Rectangle = new Rectangle(0, 0, 0, 0); + @State display: Rectangle = new Rectangle(0, 0, 0, 0); + @State crop: number = 0; + @State hasSplitLine: boolean = true; + @State clipVisible: boolean = true; + @State imgOffSetX: number = 0; + @State imgOffSetY: number = 0; + @State imgScale: number = 1; + @State currentScale: number = 1; + @State preOffsetX: number = 0; + @State preOffsetY: number = 0; + @State clipRatio: number = 0; + @State imageFlag: boolean = true; + @State angle: number = 0; + @State rotateValue: number = 0; + private minSize = PHONE_MIN_CROP // 最小宽高 + private dragObj: DragObj = new DragObj(false); + private clb: number = 1 + + pixelInit(path: string) { + this.angle = 0; + this.screenWidth = px2vp(display.getDefaultDisplaySync().width); + this.screenHeight = px2vp(display.getDefaultDisplaySync().height); + this.uri = path; + getPixelMap(this.uri) + .then((pixelMap: image.PixelMap) => { + if (pixelMap) { + this.isPixelMapChange = !this.isPixelMapChange; + this.icon = pixelMap; + pixelMap.getImageInfo().then((imageInfo) => { + this.imageHeight = imageInfo.size == undefined ? 0 : imageInfo.size?.height; + this.imageWith = imageInfo.size == undefined ? 0 : imageInfo.size?.width; + this.initCropBox(this.imageWith, this.imageHeight, this.screenWidth, this.screenHeight); + }) + } + }) + } + + resetImg(): void { + this.imgScale = 1; + this.currentScale = 1; + this.preOffsetX = 0; + this.preOffsetY = 0; + } + + initCropBox(imageWidth: number, imageHeight: number, screenWidth: number, screenHeight: number) { + if (imageHeight / imageWidth < screenHeight / screenWidth) { + this.clb = imageWidth / (screenWidth - hotspotsWidth * 2); + } else { + this.clb = imageHeight / (screenHeight - hotspotsWidth * 2 - 56 * 2); + } + let imgHeight = Math.round(imageHeight / this.clb); + let imgWidth = Math.round(imageWidth / this.clb); + + let left = (screenWidth - imgWidth) / 2; + let top = (screenHeight - imgHeight) / 2 - 56; + let right = imgWidth + left; + let bottom = imgHeight + top; + + this.maxClipSize = new Rectangle(left, top, right, bottom); + + if (this.initWidth > 0) { + left = (screenWidth - this.initWidth) / 2; + right = this.initWidth + left; + } + if (this.initHeight > 0) { + top = (screenHeight - this.initHeight) / 2 - 56; + bottom = this.initHeight + top; + } + + this.clipSize = new Rectangle(left, top, right, bottom); + this.display = new Rectangle(0, 0, this.screenWidth, this.screenHeight - 56 * 2); + } + + aboutToAppear() { + this.pixelInit(this.filePath); + } + + aboutToDisappear(): void { + let arrayData = ['filePath', 'textTitle', 'chooseText', 'chooseTextColor', 'cancelText', 'cancelTextColor', 'cropperRotate']; + this.clearData(arrayData); + } + + clearData(arrayData: Array) { + for (let i = 0; i < arrayData.length; i++) { + AppStorage.setOrCreate(arrayData[i], ''); + } + } + + @Builder + CropTitleBar() { + Text(this.title) + .fontColor(Color.White) + .fontSize(20) + .textAlign(TextAlign.Center) + .width('100%') + .height(56) + .position({ x: 0, y: 0 }) + .backgroundColor(Color.Black) + } + + @Builder + CropImageArea() { + Stack() { + Image(this.icon) + .objectFit(ImageFit.Contain) + .position({ x: this.imgOffSetX, y: this.imgOffSetY }) + .scale({ x: this.imgScale, y: this.imgScale }) + .padding(hotspotsWidth) + .width('100%') + .height('100%') + + Row() + .height(this.clipSize.height()) + .width(this.clipSize.left - this.display.left) + .position({ x: this.display.left, y: this.clipSize.top }) + .backgroundColor(this.DEFAULT_MASK_STYLE) + + Row() + .height(this.clipSize.top - this.display.top) + .width(this.display.width()) + .position({ x: this.display.left, y: this.display.top }) + .backgroundColor(this.DEFAULT_MASK_STYLE) + + Row() + .height(this.clipSize.height()) + .width(this.display.right - this.clipSize.right) + .position({ x: this.clipSize.right, y: this.clipSize.top }) + .backgroundColor(this.DEFAULT_MASK_STYLE) + + Row() + .height(this.display.bottom - this.clipSize.bottom) + .width(this.display.width()) + .position({ x: this.display.left, y: this.clipSize.bottom }) + .backgroundColor(this.DEFAULT_MASK_STYLE) + + RectangleSizer({ + clipSize: this.clipSize, + onDrag: this.onDragStartFun, + clipVisible: this.clipVisible, + hasSplitLine: this.hasSplitLine + }) + } + .height(this.screenHeight - 56 * 2) + .width('100%') + .backgroundColor(Color.Black) + .onTouch(this.touchHandler) + .gesture(GestureGroup(GestureMode.Exclusive, + PinchGesture({ fingers: Constants.DOUBLE_NUMBER }) + .onActionUpdate((event?: GestureEvent) => { + if (event) { + this.imgScale = this.currentScale * event.scale; + } + }) + .onActionEnd(() => { + if (this.imgScale < 1) { + this.resetImg(); + this.imgOffSetX = 0; + this.imgOffSetY = 0; + } else { + this.currentScale = this.imgScale; + } + }), + PanGesture() + .onActionStart(() => { + this.preOffsetX = this.imgOffSetX; + this.preOffsetY = this.imgOffSetY; + }) + .onActionUpdate((event?: GestureEvent) => { + if (event && this.imageFlag) { + this.imgOffSetX = this.preOffsetX + event.offsetX; + this.imgOffSetY = this.preOffsetY + event.offsetY; + Logger.info(TAG, "into flushPixelMapChange x : " + this.imgOffSetX + " y : " + this.imgOffSetY) + } + }), + RotationGesture() + .onActionEnd((event: GestureEvent) => { + if (this.enableRotationGesture) { + this.rotateValue = event.angle; + const sum = Math.ceil(this.rotateValue / 90); + this.resetImg(); + this.imgOffSetX = 0; + this.imgOffSetY = 0; + if (sum > 0) { + this.rotateImage(RotateType.CLOCKWISE); + } else { + this.rotateImage(RotateType.ANTI_CLOCK); + } + } + }) + )) + } + + @Builder + BottomToolbar() { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center }) { + Text(this.cancel) + .textStyle() + .fontColor(this.cancelTextColor) + .onClick(async () => { + router.back() + }); + Row() { + Image($r('app.media.ic_anti_clockwise')) + .iconStyle() + .visibility(this.cropperRotate === 'true' ? Visibility.Hidden : Visibility.Visible) + .onClick(async () => { + this.resetImg(); + this.imgOffSetX = 0; + this.imgOffSetY = 0; + this.rotateImage(RotateType.ANTI_CLOCK); + }); + } + .bottomIconStyle(); + + Row() { + Image($r('app.media.ic_reset')) + .iconStyle() + .onClick(() => { + this.pixelInit(this.uri); + this.resetImg(); + this.imgOffSetX = 0; + this.imgOffSetY = 0; + }); + } + .bottomIconStyle(); + + Row() { + Image($r('app.media.ic_clockwise')) + .iconStyle() + .visibility(this.cropperRotate === 'true' ? Visibility.Hidden : Visibility.Visible) + .onClick(() => { + this.resetImg(); + this.imgOffSetX = 0; + this.imgOffSetY = 0; + this.rotateImage(RotateType.CLOCKWISE); + }); + } + .bottomIconStyle(); + + Text(this.choose) + .textStyle() + .fontColor(this.chooseTextColor) + .onClick(() => { + if (this.icon) { + let xOff = this.imageWith * (this.imgScale - 1) / 2; + let yOff = this.imageHeight * (this.imgScale - 1) / 2; + let region: image.Region = { x: 0, y: 0, size: { height: this.imageHeight, width: this.imageWith } }; + region.x = + (this.clipSize.left - this.maxClipSize.left) / this.imgScale * this.clb + (xOff / this.imgScale) - this.imgOffSetX / this.imgScale * this.clb; + region.size.width = this.imageWith - region.x - (this.maxClipSize.right - this.clipSize.right) / this.imgScale * this.clb + - (xOff / this.imgScale) - this.imgOffSetX / this.imgScale * this.clb; + region.y = + (this.clipSize.top - this.maxClipSize.top) / this.imgScale * this.clb + (yOff / this.imgScale) - this.imgOffSetY / this.imgScale * this.clb; + region.size.height = this.imageHeight - region.y - (this.maxClipSize.bottom - this.clipSize.bottom) / this.imgScale * this.clb + - (yOff / this.imgScale) - this.imgOffSetY / this.imgScale * this.clb; + this.icon.crop(region, async (err: BusinessError) => { + if (err != undefined) { + console.error("Failed to crop pixelmap."); + return; + } else { + let imgPath = await encode(this, this.icon); + AppStorage.setOrCreate('cropImagePath', imgPath) + AppStorage.setOrCreate('cropRect', { + width: region.size.width, + height: region.size.height, + x: region.x, + y: region.y + }) + router.back() + } + }) + } + }) + } + .width('100%') + .height(56) + .position({ x: 0, y: (this.screenHeight - 56) }) + .backgroundColor(Color.Black) + } + + rotateImage(rotateType: RotateType) { + Logger.info(TAG, "into rotateImage rotateType : " + rotateType) + if (rotateType === RotateType.CLOCKWISE) { + if (!this.icon) { + Logger.info(TAG, "into rotateImage return") + return; + } + try { + this.icon.rotate(Constants.CLOCK_WISE) + .then(() => { + this.angle = this.angle + Constants.CLOCK_WISE; + this.flushPixelMapChange(this.angle); + }) + } catch (error) { + } + } + if (rotateType === RotateType.ANTI_CLOCK) { + if (!this.icon) { + Logger.info(TAG, "into rotateImage return") + return; + } + try { + this.icon.rotate(Constants.ANTI_CLOCK) + .then(() => { + this.angle = this.angle + Constants.ANTI_CLOCK; + this.flushPixelMapChange(this.angle); + }) + } catch (error) { + } + } + } + + flushPixelMapChange(angle: number) { + this.isPixelMapChange = !this.isPixelMapChange; + let clipAngle = angle / 90; + switch (Math.abs(clipAngle % 4)) { + case 0: + case 2: + this.initCropBox(this.imageWith, this.imageHeight, this.screenWidth, this.screenHeight); + break; + default: + this.initCropBox(this.imageHeight, this.imageWith, this.screenWidth, this.screenHeight); + break; + } + } + + flushPixelMap() { + const temp = this.icon; + this.icon = undefined; + this.icon = temp; + } + + onDragStartFun = (event: TouchEvent, left: boolean, top: boolean, right: boolean, bottom: boolean, multiCrop: boolean): void => { + let downPos = new DownPos(this.clipSize.left, this.clipSize.top, this.clipSize.bottom, this.clipSize.right); + let action = new Action(left, top, right, bottom); + this.dragObj = new DragObj(true, event.touches[0].screenX, event.touches[0].screenY, action, downPos, multiCrop); + } + + private endImageDrag(): void { + // 图片的宽高 + let imageWidth = this.imageHeight; + let imageHeight = this.imageWith; + if ([0, 2].includes(Math.abs((this.angle / 90) % 4))) { + imageWidth = this.imageWith; + imageHeight = this.imageHeight; + } + + let crop: Rectangle = new Rectangle(this.clipSize.left, this.clipSize.top, this.clipSize.right, this.clipSize.bottom); + + // 裁剪框和图片间的偏移量 + let extraLeft = 0; + let extraTop = 0; + let extraRight = 0; + let extraBottom = 0; + + // 图片实际的宽高 + let actualHeight = 0; + let actualWidth = 0; + + // 图片偏移量 + let imgOffSetX = this.imgOffSetX; + let imgOffSetY = this.imgOffSetY; + + // 图片缩放偏移量 + let scaleOffsetX = 0; + let scaleOffsetY = 0; + + // 根据图片宽高比计算实际的图片宽高和偏移量 + // 计算图片的实际宽高和实际偏移量 + actualHeight = Math.round(imageHeight / this.clb); + actualWidth = Math.round(imageWidth / this.clb); + extraLeft = (this.screenWidth - actualWidth) / 2; + extraTop = (this.screenHeight - actualHeight) / 2 - 56; + extraRight = actualWidth + extraLeft; + extraBottom = actualHeight + extraTop; + + // 计算缩放偏移量 + scaleOffsetX = this.imgScale > 1 ? 0 - ((extraRight - extraLeft) * this.imgScale - (extraRight - extraLeft)) / 2 : 0; + scaleOffsetY = this.imgScale > 1 ? 0 - ((extraBottom - extraTop) * this.imgScale - (extraBottom - extraTop)) / 2 : 0; + + // 计算图片四个边缘的位置 + const imageRight = this.imgOffSetX + actualWidth; + const imageBottom = this.imgOffSetY + actualHeight; + + // 计算裁剪框四个边缘的位置 + const cropRight = crop.right + const cropBottom = crop.bottom; + + // 判断图片左边缘是否在裁剪框内 + if (this.imgOffSetX + scaleOffsetX > crop.left - extraLeft) { + // 图片左边缘已经被拖动到裁剪框内,需要还原位置 + imgOffSetX = crop.left - extraLeft - scaleOffsetX; + } + + // 判断图片上边缘是否在裁剪框内 + if (this.imgOffSetY + scaleOffsetY > crop.top - extraTop) { + // 图片上边缘已经被拖动到裁剪框内,需要还原位置 + imgOffSetY = crop.top - extraTop - scaleOffsetY; + } + + // 判断图片右边缘是否在裁剪框内 + if (imageRight - scaleOffsetX < cropRight - extraLeft) { + imgOffSetX = cropRight - extraRight + scaleOffsetX; + } + + // 判断图片下边缘是否在裁剪框内 + if (imageBottom - scaleOffsetY < cropBottom - extraTop) { + // 图片下边缘已经被拖动到裁剪框内,需要还原位置 + imgOffSetY = cropBottom - extraBottom + scaleOffsetY; + } + this.imgOffSetX = imgOffSetX; + this.imgOffSetY = imgOffSetY; + } + + touchHandler: (event: TouchEvent | undefined) => void = (event: TouchEvent | undefined): void => { + if (!event) { + return; + } + + if (event.type === TouchType.Up) { + this.dragObj.dragging = false; + this.endImageDrag(); + } + + if (event.type === TouchType.Down) { + Logger.info(TAG, "Down") + } + + if (event.type === TouchType.Move) { + if (!this.dragObj.dragging) { + this.imageFlag = true; + return; + } + this.imageFlag = false; + if (this.freeStyleCropEnabled) { + return; + } + let touch = event.touches[0]; + let delX: number = touch.screenX - this.dragObj.x; + let delY: number = touch.screenY - this.dragObj.y; + // 裁剪和缩放平移收拾互斥 + + let newPosition = this.clipSize.clone(); + + let direction = this.dragObj.action; + if (this.dragObj.multiCrop) { + this.getMultiCropRect(delX, delY, newPosition, direction, event.pressure); + } else { + this.getSingleCropRect(delX, delY, newPosition, direction, event.pressure); + } + } + } + + getMultiCropRect(delX: number, delY: number, newPosition: Rectangle, direction: Action, pressure: number) { + if (direction.left) { + newPosition.left = this.dragObj.downPos.left + delX; + let width = this.clipSize.right - newPosition.left; + if (this.clipRatio > 0) { + let height = width / this.clipRatio; + if (height <= this.minSize) { + newPosition.left = this.clipSize.right - this.minSize * this.clipRatio; + } + } else if (width <= this.minSize) { + newPosition.left = this.clipSize.right - this.minSize; + } + if (newPosition.left < this.maxClipSize.left) { + newPosition.left = this.maxClipSize.left; + } + } + if (direction.top) { + newPosition.top = this.dragObj.downPos.top + delY; + let height = this.clipSize.bottom - newPosition.top; + if (this.clipRatio > 0) { + let width = height * this.clipRatio; + if (width <= this.minSize) { + newPosition.top = this.clipSize.bottom - this.minSize / this.clipRatio; + } + } else if (height <= this.minSize) { + newPosition.top = this.clipSize.bottom - this.minSize; + } + if (newPosition.top < this.maxClipSize.top) { + newPosition.top = this.maxClipSize.top; + } + } + if (direction.right) { + newPosition.right = this.dragObj.downPos.right + delX; + let width = newPosition.right - this.clipSize.left; + if (this.clipRatio > 0) { + let height = width / this.clipRatio; + if (height <= this.minSize) { + newPosition.right = this.clipSize.left + this.minSize * this.clipRatio; + } + } else if (width <= this.minSize) { + newPosition.right = this.clipSize.left + this.minSize; + } + if (newPosition.right > this.maxClipSize.right) { + newPosition.right = this.maxClipSize.right; + } + } + if (direction.bottom) { + newPosition.bottom = this.dragObj.downPos.bottom + delY; + let height = newPosition.bottom - this.clipSize.top; + if (this.clipRatio > 0) { + let width = height * this.clipRatio; + if (width <= this.minSize) { + newPosition.bottom = this.clipSize.top + this.minSize / this.clipRatio; + } + } else if (height <= this.minSize) { + newPosition.bottom = this.clipSize.top + this.minSize; + } + if (newPosition.bottom > this.maxClipSize.bottom) { + newPosition.bottom = this.maxClipSize.bottom; + } + } + this.clipSize = new Rectangle(newPosition.left, newPosition.top, newPosition.right, newPosition.bottom); + } + + getSingleCropRect(delX: number, delY: number, newPosition: Rectangle, direction: Action, pressure: number) { + if (direction.left) { + let newX = this.dragObj.downPos.left + delX; + newX = newX < this.dragObj.downPos.right - this.minSize ? newX : this.dragObj.downPos.right - this.minSize + if (this.clipRatio > 0) { + let width = this.clipSize.right - newX; + let height = width / this.clipRatio; + newPosition.top = this.clipSize.top - (height - this.clipSize.height()) / 2; + newPosition.bottom = this.clipSize.bottom + (height - this.clipSize.height()) / 2; + if (height <= this.minSize) { + newX = this.clipSize.right - this.minSize * this.clipRatio; + } + } + newPosition.left = newX; + if (newPosition.left < this.maxClipSize.left) { + newPosition.left = this.maxClipSize.left; + } + } else if (direction.right) { + let newX = this.dragObj.downPos.right + delX; + if (newX < this.dragObj.downPos.left + this.minSize) { + newX = this.dragObj.downPos.left + this.minSize; + } + if (this.clipRatio > 0) { + let width = newX - this.clipSize.left; + let height = width / this.clipRatio; + newPosition.top = this.clipSize.top - (height - this.clipSize.height()) / 2; + newPosition.bottom = this.clipSize.bottom + (height - this.clipSize.height()) / 2; + if (height <= this.minSize) { + newX = this.minSize * this.clipRatio + this.clipSize.left; + } + } + newPosition.right = newX; + if (newPosition.right > this.maxClipSize.right) { + newPosition.right = this.maxClipSize.right; + } + } else if (direction.top) { + let newY = this.dragObj.downPos.top + delY; + newY = newY < this.dragObj.downPos.bottom - this.minSize ? newY : this.dragObj.downPos.bottom - this.minSize + if (this.clipRatio > 0) { + let height = this.clipSize.bottom - newY; + let width = height * this.clipRatio; + newPosition.left = this.clipSize.left - (width - this.clipSize.width()) / 2; + newPosition.right = this.clipSize.right + (width - this.clipSize.width()) / 2; + if (width <= this.minSize) { + newY = this.clipSize.bottom - this.minSize / this.clipRatio; + } + } + newPosition.top = newY; + if (newPosition.top < this.maxClipSize.top) { + newPosition.top = this.maxClipSize.top; + } + } else if (direction.bottom) { + let newY = this.dragObj.downPos.bottom + delY; + if (newY < this.dragObj.downPos.top + this.minSize) { + newY = this.dragObj.downPos.top + this.minSize; + } + if (this.clipRatio > 0) { + let height = newY - this.clipSize.top; + let width = height * this.clipRatio; + newPosition.left = this.clipSize.left - (width - this.clipSize.width()) / 2; + newPosition.right = this.clipSize.right + (width - this.clipSize.width()) / 2; + if (width <= this.minSize) { + newY = this.minSize / this.clipRatio + this.clipSize.top; + } + } + newPosition.bottom = newY; + if (newPosition.bottom > this.maxClipSize.bottom) { + newPosition.bottom = this.maxClipSize.bottom; + } + } + this.clipSize = new Rectangle(newPosition.left, newPosition.top, newPosition.right, newPosition.bottom); + + } + + build() { + Stack() { + this.CropImageArea(); + this.CropTitleBar(); + this.BottomToolbar(); + } + .width('100%') + .height('100%') + } +} + + +@Component +export struct RectangleSizer { + @Prop clipSize: Rectangle = new Rectangle(0, 0, 0, 0); + public onDrag: (event: TouchEvent, left: boolean, top: boolean, right: boolean, bottom: boolean, multiCrop: boolean) => void = Event + @Prop clipVisible: boolean = true; + @State isScrolling: boolean = false; + @State isTouched: boolean = false; + @Prop hasSplitLine: boolean = true; + @StorageProp('showCropFrame') showCropFrame: boolean = true; + @StorageProp('showCropGuidelines') showCropGuidelines: boolean = true; + @Prop isScreenPortrait: boolean = false; + + build() { + Stack() { + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween }) { + Row().rowStyle().id('petalClip_frostedGlass_top') + Row().rowStyle2(this.isScrolling).id('petalClip_frostedGlass_row_81_1') + Row().rowStyle2(this.isScrolling).id('petalClip_frostedGlass_row_81_2') + Row().rowStyle1(this.hasSplitLine || this.isScrolling).id('petalClip_frostedGlass_row_9_1') + Row().rowStyle2(this.isScrolling).id('petalClip_frostedGlass_row_81_3') + Row().rowStyle2(this.isScrolling).id('petalClip_frostedGlass_row_81_4') + Row().rowStyle1(this.hasSplitLine || this.isScrolling).id('petalClip_frostedGlass_row_9_2') + Row().rowStyle2(this.isScrolling).id('petalClip_frostedGlass_row_81_5') + Row().rowStyle2(this.isScrolling).id('petalClip_frostedGlass_row_81_6') + Row().rowStyle().id('petalClip_frostedGlass_bottom') + } + .visibility(this.showCropGuidelines ? Visibility.Visible : Visibility.Hidden) + .padding(hotspotsWidth) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) { + Column().columnStyle().id('petalClip_frostedGlass_left') + Column().columnStyle2(this.isScrolling).id('petalClip_frostedGlass_column_81_1') + Column().columnStyle2(this.isScrolling).id('petalClip_frostedGlass_column_81_2') + Column() + .columnStyle1(this.hasSplitLine || this.isScrolling) + .id('petalClip_frostedGlass_column_9_1') + Column().columnStyle2(this.isScrolling).id('petalClip_frostedGlass_column_81_3') + Column().columnStyle2(this.isScrolling).id('petalClip_frostedGlass_column_81_4') + Column() + .columnStyle1(this.hasSplitLine || this.isScrolling) + .id('petalClip_frostedGlass_column_9_2') + Column().columnStyle2(this.isScrolling).id('petalClip_frostedGlass_column_81_5') + Column().columnStyle2(this.isScrolling).id('petalClip_frostedGlass_column_81_6') + Column().columnStyle().id('petalClip_frostedGlass_right') + } + .visibility(this.showCropGuidelines ? Visibility.Visible : Visibility.Hidden) + .padding(hotspotsWidth) + + Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.SpaceBetween }) { + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) { + Row() + .width(20) + .height(20) + .border({ width: { top: 3, left: 3 }, color: { top: '#FFFFFF', left: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_leftTop') + Row() + .width(20) + .height(20) + .border({ width: { top: 3 }, color: { top: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_topMiddle') + Row() + .width(20) + .height(20) + .border({ width: { top: 3, right: 3 }, color: { top: '#FFFFFF', right: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_rightTop') + } + .height(Math.min(20, this.clipSize.height() / 3 + 4)).clip(true) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) { + Row() + .width(20) + .height(20) + .border({ width: { left: 3 }, color: { left: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_leftMiddle') + Row() + .width(20) + .height(20) + .border({ width: { right: 3 }, color: { right: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_rightMiddle') + } + .height(Math.min(20, this.clipSize.height() / 3 + 1)).clip(true) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) { + Row() + .width(20) + .height(Math.min(20, this.clipSize.height() / 3 + 4)) + .border({ width: { bottom: 3, left: 3 }, color: { bottom: '#FFFFFF', left: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_leftBottom') + Row() + .width(20) + .height(Math.min(20, this.clipSize.height() / 3 + 4)) + .border({ width: { bottom: 3 }, color: { bottom: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_MiddleBottom') + Row() + .width(20) + .height(Math.min(20, this.clipSize.height() / 3 + 4)) + .border({ width: { bottom: 3, right: 3 }, color: { bottom: '#FFFFFF', right: '#FFFFFF' } }) + .id('petalClip_frostedGlass_rect_rightBottom') + } + } + .visibility(this.showCropFrame ? Visibility.Visible : Visibility.Hidden) + .padding(12) + } + .width(this.clipSize.width() + hotspotsWidth * 2) + .height(this.clipSize.height() + hotspotsWidth * 2) + .visibility(this.clipVisible ? Visibility.Visible : Visibility.Hidden) + .position({ + x: this.clipSize.left - hotspotsWidth, + y: this.clipSize.top - hotspotsWidth, + }) + .onTouch((event?: TouchEvent) => { + if (!event) { + return; + } + if (this.isScrolling) { + return; + } + if (event.touches.length >= 2) { + return; + } + let touch = event.touches[0]; + let eventX = touch.x; + let eventY = touch.y; + if (event.type == TouchType.Down) { + if (this.isTouched) { + return; + } + this.isTouched = true; + let eventLeft = eventX < (2 * hotspotsWidth); + let eventTop = eventY < (2 * hotspotsWidth); + let eventRight = eventX > this.clipSize.width(); + let eventBottom = eventY > this.clipSize.height(); + + let eventCount = (eventLeft ? 1 : 0) + (eventTop ? 1 : 0) + (eventRight ? 1 : 0) + (eventBottom ? 1 : 0); + if (eventCount > 0) { + this.onDrag(event, eventLeft, eventTop, eventRight, eventBottom, eventCount > 1); + } + } + if (event.type === TouchType.Up) { + this.isTouched = false; + } + }) + + } +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/utils/Constants.ets b/harmony/image_crop_picker/src/main/ets/utils/Constants.ets new file mode 100644 index 0000000000000000000000000000000000000000..a700daeec21f223ed2a8e152f47199afa6735f3f --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/utils/Constants.ets @@ -0,0 +1,14 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +export class Constants { + static readonly ENCODE_FORMAT: string = 'image/jpeg'; + static readonly ENCODE_QUALITY: number = 100; + static readonly DOUBLE_NUMBER: number = 2; + static readonly CLOCK_WISE: number = 90; + static readonly ANTI_CLOCK: number = -90; + static readonly IMAGE_FORMAT: string = '.jpg' + static readonly IMAGE_PREFIX: string = 'image'; + static readonly ENCODE_FILE_PERMISSION: string = 'rw' +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/utils/CropModel.ets b/harmony/image_crop_picker/src/main/ets/utils/CropModel.ets new file mode 100644 index 0000000000000000000000000000000000000000..0ac0b72e732a56751c17301706047cfaf5ca0c85 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/utils/CropModel.ets @@ -0,0 +1,73 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +export class CropScaleClass { + value: number; + ratio: string; + cropIndex: number; + text: string | Resource; + key: string = ''; + + constructor(value: number, ratio: string, cropIndex: number, text: string | Resource, key?: string) { + this.value = value; + this.ratio = ratio; + this.cropIndex = cropIndex; + this.text = text; + key && (this.key = key); + } +} + +export class DownPos{ + left: number + top: number + bottom: number + right: number + + constructor(left: number, top: number, bottom: number, right: number) { + this.left = left; + this.top = top; + this.bottom = bottom; + this.right = right; + } +} + +export class DragObj{ + x: number + y: number + dragging: boolean + action: Action + downPos: DownPos + multiCrop: boolean + + constructor(dragging: boolean, x: number = 0, y: number = 0, + action: Action = new Action(false, false, false, false), + downPos: DownPos = new DownPos(0, 0, 0, 0), multiCrop: boolean = false) { + this.dragging = dragging; + this.x = x; + this.y = y; + this.action = action; + this.downPos = downPos; + this.multiCrop = multiCrop; + } +} + +export class Action { + left: boolean + top: boolean + right: boolean + bottom: boolean + + constructor(left: boolean, top: boolean, right: boolean, bottom: boolean) { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } +} + +export enum CropType { + FREE_CROP, + FIXED_RATIO, + FRAME_CROP +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/utils/DecodeAndEncodeUtil.ets b/harmony/image_crop_picker/src/main/ets/utils/DecodeAndEncodeUtil.ets new file mode 100644 index 0000000000000000000000000000000000000000..5e80c2ac2a770463cf5cfb630bae58e5e8970f71 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/utils/DecodeAndEncodeUtil.ets @@ -0,0 +1,54 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +import fs from '@ohos.file.fs'; +import image from '@ohos.multimedia.image'; +import { Constants } from '../utils/Constants'; +import { photoAccessHelper } from '@kit.MediaLibraryKit'; +import { fileIo } from '@kit.CoreFileKit' + + +const TAG: string = 'imageCrop_Decode_Encode'; + +/** + * Async create pixel map. + * + * @return pixelMa. + */ +export async function getPixelMap(uri: string){ + const file = fs.openSync(uri, fs.OpenMode.READ_ONLY); + const fd = file?.fd; + // path为已获得的沙箱路径 + const imageSource = image.createImageSource(fd); + const pixelMap = await imageSource.createPixelMap({ + editable: true + }); + return pixelMap +} + +export async function encode(component: Object, pixelMap: PixelMap) { + const newPixelMap = pixelMap; + // Packing image. + const imagePackerApi = image.createImagePacker(); + const packOptions: image.PackingOption = { + format: Constants.ENCODE_FORMAT, + quality: Constants.ENCODE_QUALITY + } + const imageData = await imagePackerApi.packing(newPixelMap, packOptions); + // Get album's path. + const context = getContext(component); + const media = photoAccessHelper.getPhotoAccessHelper(context); + const currentTime = new Date().getTime(); + // Create image asset. + const filePath = await media.createAsset( + photoAccessHelper.PhotoType.IMAGE, + `${Constants.IMAGE_PREFIX}_${currentTime}${Constants.IMAGE_FORMAT}`, + ); + + let file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE) + await fs.write(file.fd, imageData); + // Image resource release. + imagePackerApi.release(); + await media.release(); +} diff --git a/harmony/image_crop_picker/src/main/ets/utils/EncodeUtil.ets b/harmony/image_crop_picker/src/main/ets/utils/EncodeUtil.ets new file mode 100644 index 0000000000000000000000000000000000000000..38a487bcfaf779debb73464592a0497ac232d030 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/utils/EncodeUtil.ets @@ -0,0 +1,33 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +import fs from '@ohos.file.fs'; +import image from '@ohos.multimedia.image'; +import Logger from '../Logger'; +import { Constants } from '../utils/Constants' +import util from '@ohos.util'; + +const TAG: string = 'imageEdit_Encode'; + + +export async function encode(component: Object, pixelMap: ESObject) : Promise { + let imgPath: string = ''; + const newPixelMap: ESObject = pixelMap; + const imagePackerApi = image.createImagePacker(); + const packOptions: image.PackingOption = { + format: Constants.ENCODE_FORMAT, + quality: Constants.ENCODE_QUALITY + } + let packerData = await imagePackerApi.packing(newPixelMap, packOptions); + Logger.info(TAG, 'into compressPictures data: ' + JSON.stringify(packerData)); + const context = getContext(component); + imgPath = context.tempDir + '/rn_image_crop_picker_lib_temp_' + util.generateRandomUUID(true) + Constants.IMAGE_FORMAT; + let newFile = fs.openSync(imgPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE); + Logger.info(TAG, 'into compressPictures newFile id: ' + newFile.fd); + const number = fs.writeSync(newFile.fd, packerData); + Logger.info(TAG, 'into compressPictures write data to file succeed size: ' + number); + fs.closeSync(newFile.fd); + imagePackerApi.release(); + return imgPath; +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/utils/jul.ts b/harmony/image_crop_picker/src/main/ets/utils/jul.ts new file mode 100644 index 0000000000000000000000000000000000000000..21c3d537becee0344183a861412e97dd223f800e --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/utils/jul.ts @@ -0,0 +1,7 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +export function Event(...args): void { + +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/utils/types.ets b/harmony/image_crop_picker/src/main/ets/utils/types.ets new file mode 100644 index 0000000000000000000000000000000000000000..2f7959f1b582be80510b3eb3e8c7951d3bef7f0e --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/utils/types.ets @@ -0,0 +1,94 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +@Observed +export class Rectangle { + left: number; + top: number; + right: number; + bottom: number; + + constructor(left: number, top: number, right: number, bottom: number){ + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + width(): number { + return this.right - this.left; + } + + height(): number { + return this.bottom - this.top; + } + + centerX(): number { + return this.left + this.width() / 2; + } + + centerY(): number { + return this.top + this.height() / 2; + } + + roundLeft(): number { + return Math.floor(vp2px(this.left)); + } + + roundRight(): number { + return Math.floor(vp2px(this.right)); + } + + roundTop(): number { + return Math.floor(vp2px(this.top)); + } + + roundBottom(): number { + return Math.floor(vp2px(this.bottom)); + } + + roundWidth(): number { + return this.roundRight() - this.roundLeft(); + } + + roundHeight(): number { + return this.roundBottom() - this.roundTop(); + } + + scale(ratio: number, originPointX: number, originPointY: number): Rectangle { + let left = originPointX + (this.left - originPointX) * ratio; + let top = originPointY + (this.top - originPointY) * ratio; + let right = originPointX + (this.right - originPointX) * ratio; + let bottom = originPointY + (this.bottom - originPointY) * ratio; + return new Rectangle (left, top, right, bottom); + } + + translate(offsetX: number, offsetY: number): Rectangle { + let left = this.left + offsetX; + let top = this.top + offsetY; + let right = this.right + offsetX; + let bottom = this.bottom + offsetY; + return new Rectangle (left, top, right, bottom); + } + + clone(): Rectangle { + return new Rectangle(this.left, this.top, this.right, this.bottom); + } + + toString() { + return 'Rect[' + this.left + ',' + this.top + ',' + this.right + ',' + this.bottom + ']'; + } +} + +@Observed +export class TextDrawStatus { + public currentTab: string = 'text'; + public play_pos: number = 0; + public fixWidth: number = 0; + public fixHeight: number = 0; + public currentTextUid: string = ''; + public trimerMove: boolean = false; + public identifyStatus: number = -1 + public identifyResult: number = -1 +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/ets/viewmodel/viewAndModel.ets b/harmony/image_crop_picker/src/main/ets/viewmodel/viewAndModel.ets new file mode 100644 index 0000000000000000000000000000000000000000..2879651e681d9abfe5d6e4ceab4a47295db687e5 --- /dev/null +++ b/harmony/image_crop_picker/src/main/ets/viewmodel/viewAndModel.ets @@ -0,0 +1,38 @@ +// Copyright (c) 2024 Huawei Device Co., Ltd. All rights reserved +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +export class RegionItem { + x: number; + y: number; + constructor(x: number, y: number) { + this.x = x; + this.y = y; + } +} + +export class IconStatus { + normal: Resource; + chosen: Resource; + constructor(normal: Resource, chosen: Resource) { + this.normal = normal; + this.chosen = chosen; + } +} + +export enum CropType { + ORIGINAL_IMAGE, + SQUARE, + BANNER, + RECTANGLE +} + +export enum RotateType { + CLOCKWISE, + ANTI_CLOCK +} + +export enum MainTabId { + CROP, + ROTATE +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/module.json5 b/harmony/image_crop_picker/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..80b82a9ab7a8d8608b5b1efc33d35ddd8a799274 --- /dev/null +++ b/harmony/image_crop_picker/src/main/module.json5 @@ -0,0 +1,9 @@ +{ + "module": { + "name": "image_crop_picker", + "type": "har", + "deviceTypes": [ + "default", + ], + } +} diff --git a/harmony/image_crop_picker/src/main/resources/base/element/string.json b/harmony/image_crop_picker/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..663ecd16f0fdb8b2e4ae9af07efed8b071503c74 --- /dev/null +++ b/harmony/image_crop_picker/src/main/resources/base/element/string.json @@ -0,0 +1,20 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "ImageEdit" + }, + { + "name": "reason", + "value": "save image" + } + ] +} diff --git a/harmony/image_crop_picker/src/main/resources/base/media/ic_anti_clockwise.png b/harmony/image_crop_picker/src/main/resources/base/media/ic_anti_clockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..262594ad4b902e5810a1bda18f04ae1c63170b8b Binary files /dev/null and b/harmony/image_crop_picker/src/main/resources/base/media/ic_anti_clockwise.png differ diff --git a/harmony/image_crop_picker/src/main/resources/base/media/ic_clockwise.png b/harmony/image_crop_picker/src/main/resources/base/media/ic_clockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..0b739c4ccea379a18704e849519b74bc685aec6a Binary files /dev/null and b/harmony/image_crop_picker/src/main/resources/base/media/ic_clockwise.png differ diff --git a/harmony/image_crop_picker/src/main/resources/base/media/ic_reset.png b/harmony/image_crop_picker/src/main/resources/base/media/ic_reset.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac9af2768caf6d9b79da3bf798d01e153e9820f Binary files /dev/null and b/harmony/image_crop_picker/src/main/resources/base/media/ic_reset.png differ diff --git a/harmony/image_crop_picker/src/main/resources/base/media/ic_save.png b/harmony/image_crop_picker/src/main/resources/base/media/ic_save.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6599c303b99a0e3cf0078d802068b7d5f33255 Binary files /dev/null and b/harmony/image_crop_picker/src/main/resources/base/media/ic_save.png differ diff --git a/harmony/image_crop_picker/src/main/resources/base/media/icon.png b/harmony/image_crop_picker/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and b/harmony/image_crop_picker/src/main/resources/base/media/icon.png differ diff --git a/harmony/image_crop_picker/src/main/resources/base/profile/main_pages.json b/harmony/image_crop_picker/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..1698cd495c27750488e0e4af9ef83309a85c5b4b --- /dev/null +++ b/harmony/image_crop_picker/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/ImageEditInfo" + ] +} \ No newline at end of file diff --git a/harmony/image_crop_picker/src/main/resources/en_US/element/string.json b/harmony/image_crop_picker/src/main/resources/en_US/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..f51a9c8461a55f6312ef950344e3145b7f82d607 --- /dev/null +++ b/harmony/image_crop_picker/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from package" + } + ] +} diff --git a/harmony/image_crop_picker/src/main/resources/zh_CN/element/string.json b/harmony/image_crop_picker/src/main/resources/zh_CN/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..f51a9c8461a55f6312ef950344e3145b7f82d607 --- /dev/null +++ b/harmony/image_crop_picker/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from package" + } + ] +} diff --git a/harmony/image_crop_picker/ts.ts b/harmony/image_crop_picker/ts.ts new file mode 100644 index 0000000000000000000000000000000000000000..5a51826e2fe5709cd27072e610a22519f7863305 --- /dev/null +++ b/harmony/image_crop_picker/ts.ts @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * 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 + * + * http://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. + */ + +export * from "./src/main/ets/ImageCropPickerPackage"; +export * from "./src/main/ets/ImageCropPickerTurboModule"; \ No newline at end of file diff --git a/images/ios_circular_crop.png b/images/ios_circular_crop.png deleted file mode 100644 index 7e798f6c4fe35c72825f7c6d334a272b3c08c294..0000000000000000000000000000000000000000 Binary files a/images/ios_circular_crop.png and /dev/null differ diff --git a/images/ios_multiple_pick_v2.png b/images/ios_multiple_pick_v2.png deleted file mode 100644 index 61c42519ed98a656e6ca017f98a4796aa40fe6df..0000000000000000000000000000000000000000 Binary files a/images/ios_multiple_pick_v2.png and /dev/null differ diff --git a/images/ios_normal_crop.png b/images/ios_normal_crop.png deleted file mode 100644 index 9c2de0b0b886492c4db72cee3a8336b51392df1b..0000000000000000000000000000000000000000 Binary files a/images/ios_normal_crop.png and /dev/null differ diff --git a/images/ios_single_pick_v2.png b/images/ios_single_pick_v2.png deleted file mode 100644 index 53c9e45c8b36c9a92eecba2f63bbed2e2f271626..0000000000000000000000000000000000000000 Binary files a/images/ios_single_pick_v2.png and /dev/null differ diff --git a/index.js b/index.js deleted file mode 100644 index 10514de6c8ee4d7fda942181e1b84c02fc989cbf..0000000000000000000000000000000000000000 --- a/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; - -import {NativeModules} from 'react-native'; - -const ImageCropPicker = NativeModules.ImageCropPicker; - -export default ImageCropPicker; -export const openPicker = ImageCropPicker.openPicker; -export const openCamera = ImageCropPicker.openCamera; -export const openCropper = ImageCropPicker.openCropper; -export const clean = ImageCropPicker.clean; -export const cleanSingle = ImageCropPicker.cleanSingle; diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePicker.h b/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePicker.h deleted file mode 100644 index 54ccdce326ac54d8d8125c6b6ef623a6be4c5ae7..0000000000000000000000000000000000000000 --- a/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePicker.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// QBImagePicker.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -//! Project version number for QBImagePicker. -FOUNDATION_EXPORT double QBImagePickerVersionNumber; - -//! Project version string for QBImagePicker. -FOUNDATION_EXPORT const unsigned char QBImagePickerVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import -#import diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePickerController.h b/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePickerController.h deleted file mode 100644 index e7547e59761f57cd52464bae4e651039dba43499..0000000000000000000000000000000000000000 --- a/ios/ImageCropPickerSDK/QBImagePicker.framework/Headers/QBImagePickerController.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// QBImagePickerController.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import -#import - -@class QBImagePickerController; - -@protocol QBImagePickerControllerDelegate - -@optional -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets; -- (void)qb_imagePickerControllerDidCancel:(QBImagePickerController *)imagePickerController; - -- (BOOL)qb_imagePickerController:(QBImagePickerController *)imagePickerController shouldSelectAsset:(PHAsset *)asset; -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didSelectAsset:(PHAsset *)asset; -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didDeselectAsset:(PHAsset *)asset; - -@end - -typedef NS_ENUM(NSUInteger, QBImagePickerMediaType) { - QBImagePickerMediaTypeAny = 0, - QBImagePickerMediaTypeImage, - QBImagePickerMediaTypeVideo -}; - -@interface QBImagePickerController : UIViewController - -@property (nonatomic, weak) id delegate; - -@property (nonatomic, strong, readonly) NSMutableOrderedSet *selectedAssets; - -@property (nonatomic, copy) NSArray *assetCollectionSubtypes; -@property (nonatomic, assign) QBImagePickerMediaType mediaType; - -@property (nonatomic, assign) BOOL allowsMultipleSelection; -@property (nonatomic, assign) NSUInteger minimumNumberOfSelection; -@property (nonatomic, assign) NSUInteger maximumNumberOfSelection; - -@property (nonatomic, copy) NSString *prompt; -@property (nonatomic, assign) BOOL showsNumberOfSelectedAssets; - -@property (nonatomic, assign) NSUInteger numberOfColumnsInPortrait; -@property (nonatomic, assign) NSUInteger numberOfColumnsInLandscape; - -@end diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/Info.plist b/ios/ImageCropPickerSDK/QBImagePicker.framework/Info.plist deleted file mode 100644 index eae83061a08df64f24a3b0b2b7dc27cda6446204..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/Info.plist and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/Modules/module.modulemap b/ios/ImageCropPickerSDK/QBImagePicker.framework/Modules/module.modulemap deleted file mode 100644 index b6519afa7f2c93dc5c3081dd4b7674a8e5ee8704..0000000000000000000000000000000000000000 --- a/ios/ImageCropPickerSDK/QBImagePicker.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module QBImagePicker { - umbrella header "QBImagePicker.h" - - export * - module * { export * } -} diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker deleted file mode 100755 index 774ba900360d10392c4ea19024042598391adba7..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/Info.plist b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/Info.plist deleted file mode 100644 index 7f1a41b67f5973ada759a942f8b80431ebccfca6..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/Info.plist and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsNavigationController.nib b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsNavigationController.nib deleted file mode 100644 index aaf475738c3bf205859b68c0052eca9dad8d9181..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsNavigationController.nib and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsViewController.nib b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsViewController.nib deleted file mode 100644 index 98ef93b019605e5f4807befce09a563be0d8d1fb..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAlbumsViewController.nib and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAssetsViewController.nib b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAssetsViewController.nib deleted file mode 100644 index 4858c86c610c94938e1885bf6b3a779ef53819b2..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QBAssetsViewController.nib and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib deleted file mode 100644 index a05c0e1c520509023dae69fd24a02ccd7595bcd5..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib b/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib deleted file mode 100644 index 0b3925208b661882bb8dbd73d6dec9919e4dc6d4..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/_CodeSignature/CodeResources b/ios/ImageCropPickerSDK/QBImagePicker.framework/_CodeSignature/CodeResources deleted file mode 100644 index dc71fb2267ccb72fb0f9c91d191658685b8da197..0000000000000000000000000000000000000000 --- a/ios/ImageCropPickerSDK/QBImagePicker.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,378 +0,0 @@ - - - - - files - - Headers/QBImagePicker.h - - wIb/otiZ7bd2vyPJQF6JEeoqhqo= - - Headers/QBImagePickerController.h - - Pj/03SZs3R39/KDJC/Sw28hOcV4= - - Info.plist - - IcCz/8UZ07kkFONGwju3BBUrdSA= - - Modules/module.modulemap - - b8XazA/6z0jSXdJ08gOuLFgiplM= - - QBImagePicker.storyboardc/Info.plist - - iwZHbHPu3m3FYRI+FCDLbHeFs44= - - QBImagePicker.storyboardc/QBAlbumsNavigationController.nib - - 5MCnX6u0y0SAVdmtiddUomh9GyY= - - QBImagePicker.storyboardc/QBAlbumsViewController.nib - - pY80pANgQzeIQuYM9GWFeoXUSxQ= - - QBImagePicker.storyboardc/QBAssetsViewController.nib - - 7+OaszKW0bhc6RotWxC0o0SijKw= - - QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib - - 0xNFW/713RpJkWqwnLEP8bUWcuI= - - QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib - - Fj2aIfr+Es6yrxOSQzP/3Uhvvvs= - - de.lproj/QBImagePicker.strings - - hash - - aEwah75TRZyK1k7zsKbitGOHsEE= - - optional - - - en.lproj/QBImagePicker.strings - - hash - - /bN8mAXwM04zgDQj19s7yTHxKQs= - - optional - - - es.lproj/QBImagePicker.strings - - hash - - 3E8xykBQDKx9XRx4cigrfFeoUwo= - - optional - - - ja.lproj/QBImagePicker.strings - - hash - - 7j4cVfYmTo9Yfo4fA9g4AvzTLhw= - - optional - - - pl.lproj/QBImagePicker.strings - - hash - - LfadkhKMCL8TGzZnnEP7Pbsb0I4= - - optional - - - zh-Hans.lproj/QBImagePicker.strings - - hash - - 0F5a3/dLVWvW3skcaXrrOpnhPv0= - - optional - - - - files2 - - Headers/QBImagePicker.h - - hash - - wIb/otiZ7bd2vyPJQF6JEeoqhqo= - - hash2 - - Fh9fdGZCY2P54hZbKvAZwwcML6IHufU9QAmHXrcmAMI= - - - Headers/QBImagePickerController.h - - hash - - Pj/03SZs3R39/KDJC/Sw28hOcV4= - - hash2 - - WcCD5/uhcGaZMLBPYHrRY/JkiB7BPQZqn5rkufhmY8c= - - - Modules/module.modulemap - - hash - - b8XazA/6z0jSXdJ08gOuLFgiplM= - - hash2 - - t0ZEP5nTTzs177dyaKMwGF/sZUJu1h9MPbMCcGQ7acw= - - - QBImagePicker.storyboardc/Info.plist - - hash - - iwZHbHPu3m3FYRI+FCDLbHeFs44= - - hash2 - - gyFhkTx7M92K1jKJpSG0Yl9R+mQfrd/YtnmTaP54ukY= - - - QBImagePicker.storyboardc/QBAlbumsNavigationController.nib - - hash - - 5MCnX6u0y0SAVdmtiddUomh9GyY= - - hash2 - - SLNRGZnuwERXFNcJLu1791ZVDMDsNnnk49Xb01ZjoZo= - - - QBImagePicker.storyboardc/QBAlbumsViewController.nib - - hash - - pY80pANgQzeIQuYM9GWFeoXUSxQ= - - hash2 - - KiZiF6NMbTf2YFOEQs4U1Yef9CSUk8GUiApZAjwtnOM= - - - QBImagePicker.storyboardc/QBAssetsViewController.nib - - hash - - 7+OaszKW0bhc6RotWxC0o0SijKw= - - hash2 - - PLJdoPEFJT4ItZgiMWCnK0GDoCTxbI/2wAwBBb8l3wM= - - - QBImagePicker.storyboardc/QL5-wR-LYt-view-66K-TS-Yoc.nib - - hash - - 0xNFW/713RpJkWqwnLEP8bUWcuI= - - hash2 - - ey42W/ZWm6W0Eea8Q4i9o79eTvpujgSK8HU9PTkbS/4= - - - QBImagePicker.storyboardc/QiH-NZ-ZGN-view-sD2-zK-ryo.nib - - hash - - Fj2aIfr+Es6yrxOSQzP/3Uhvvvs= - - hash2 - - 0iH5b4oLNN+sXyFq/BdGICtJzSnj4ll873t0puG4aqM= - - - de.lproj/QBImagePicker.strings - - hash - - aEwah75TRZyK1k7zsKbitGOHsEE= - - hash2 - - 5NH6glXlP7txoHgxKL83/BqWApGAb0poqKByJ1yo+9c= - - optional - - - en.lproj/QBImagePicker.strings - - hash - - /bN8mAXwM04zgDQj19s7yTHxKQs= - - hash2 - - xZGH0lOWeKlYEMMZNToG0j+vQVTgUTNoydCOJBG+Kjs= - - optional - - - es.lproj/QBImagePicker.strings - - hash - - 3E8xykBQDKx9XRx4cigrfFeoUwo= - - hash2 - - T0LWvjKc9Wmuxznj7gCFXRNeGYuFiF92kDcjOVI/WPo= - - optional - - - ja.lproj/QBImagePicker.strings - - hash - - 7j4cVfYmTo9Yfo4fA9g4AvzTLhw= - - hash2 - - jxfNgX8MVlO7C53RGOjJwPc1dcSj9DxTyWW8N37BkaE= - - optional - - - pl.lproj/QBImagePicker.strings - - hash - - LfadkhKMCL8TGzZnnEP7Pbsb0I4= - - hash2 - - BQCDVBKWaLio8bCJuurR2oc3ENu7K8c6N9ECEh98owU= - - optional - - - zh-Hans.lproj/QBImagePicker.strings - - hash - - 0F5a3/dLVWvW3skcaXrrOpnhPv0= - - hash2 - - smMz2/UyQzPo54Zq6lLJj+H42kPbfO4Bfy0iP1jCyf8= - - optional - - - - rules - - ^ - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^ - - weight - 20 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ - - nested - - weight - 10 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^[^/]+$ - - nested - - weight - 10 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/de.lproj/QBImagePicker.strings b/ios/ImageCropPickerSDK/QBImagePicker.framework/de.lproj/QBImagePicker.strings deleted file mode 100644 index 7a95e4205a9de89fd146b061faa57a8547795dcc..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/de.lproj/QBImagePicker.strings and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/en.lproj/QBImagePicker.strings b/ios/ImageCropPickerSDK/QBImagePicker.framework/en.lproj/QBImagePicker.strings deleted file mode 100644 index 709b47e57d3ee946b487b6326892fd0c91cf0e34..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/en.lproj/QBImagePicker.strings and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/es.lproj/QBImagePicker.strings b/ios/ImageCropPickerSDK/QBImagePicker.framework/es.lproj/QBImagePicker.strings deleted file mode 100644 index 79380f2abda5cd7171de3eb83d6affbe91104070..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/es.lproj/QBImagePicker.strings and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/ja.lproj/QBImagePicker.strings b/ios/ImageCropPickerSDK/QBImagePicker.framework/ja.lproj/QBImagePicker.strings deleted file mode 100644 index 30dd0df3fe97b6cc8606ff667d2816da4844d7ff..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/ja.lproj/QBImagePicker.strings and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/pl.lproj/QBImagePicker.strings b/ios/ImageCropPickerSDK/QBImagePicker.framework/pl.lproj/QBImagePicker.strings deleted file mode 100644 index c4ef883788fc3ebebe302b459307870f3d330f4b..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/pl.lproj/QBImagePicker.strings and /dev/null differ diff --git a/ios/ImageCropPickerSDK/QBImagePicker.framework/zh-Hans.lproj/QBImagePicker.strings b/ios/ImageCropPickerSDK/QBImagePicker.framework/zh-Hans.lproj/QBImagePicker.strings deleted file mode 100644 index a0de43a922938db9bf9796cf320d7934973c5b82..0000000000000000000000000000000000000000 Binary files a/ios/ImageCropPickerSDK/QBImagePicker.framework/zh-Hans.lproj/QBImagePicker.strings and /dev/null differ diff --git a/ios/QBImagePicker/.gitignore b/ios/QBImagePicker/.gitignore deleted file mode 100644 index 00276e02d570f780858e1bfce388ce7814632488..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/.gitignore +++ /dev/null @@ -1,80 +0,0 @@ -# Created by https://www.gitignore.io - -### OSX ### -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - - -### Xcode ### -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.xcuserstate - - -### Objective-C ### -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control -# -# Pods/ - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build diff --git a/ios/QBImagePicker/LICENSE b/ios/QBImagePicker/LICENSE deleted file mode 100644 index a98aa09273c62ea11ddcbd2d0bacda9c36b3ab0e..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2015 Katsuma Tanaka - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/ios/QBImagePicker/QBImagePicker.xcodeproj/project.pbxproj b/ios/QBImagePicker/QBImagePicker.xcodeproj/project.pbxproj deleted file mode 100644 index 5e1a335b0acf2131593f74873b34bb8d88cee3f5..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker.xcodeproj/project.pbxproj +++ /dev/null @@ -1,531 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXAggregateTarget section */ - 340A78CB1D7909FB00241672 /* Build QBImagePicker */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 340A78CE1D7909FC00241672 /* Build configuration list for PBXAggregateTarget "Build QBImagePicker" */; - buildPhases = ( - 340A78CF1D790A0100241672 /* ShellScript */, - ); - dependencies = ( - ); - name = "Build QBImagePicker"; - productName = "Build QBImagePicker"; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 790A850F1AE7D4D9008E2A80 /* QBSlomoIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = 790A850D1AE7D4D9008E2A80 /* QBSlomoIconView.h */; }; - 790A85101AE7D4D9008E2A80 /* QBSlomoIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = 790A850E1AE7D4D9008E2A80 /* QBSlomoIconView.m */; }; - AA3AD06F1ACF9A3A00BF523E /* QBVideoIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = AA3AD06D1ACF9A3A00BF523E /* QBVideoIconView.h */; }; - AA3AD0701ACF9A3A00BF523E /* QBVideoIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = AA3AD06E1ACF9A3A00BF523E /* QBVideoIconView.m */; }; - AA3AD0731ACFA06700BF523E /* QBVideoIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = AA3AD0711ACFA06700BF523E /* QBVideoIndicatorView.h */; }; - AA3AD0741ACFA06700BF523E /* QBVideoIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = AA3AD0721ACFA06700BF523E /* QBVideoIndicatorView.m */; }; - AAA8FE091ACDA079002A9710 /* QBImagePicker.h in Headers */ = {isa = PBXBuildFile; fileRef = AAA8FE081ACDA079002A9710 /* QBImagePicker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AAA8FE211ACDA090002A9710 /* QBImagePickerController.h in Headers */ = {isa = PBXBuildFile; fileRef = AAA8FE1F1ACDA090002A9710 /* QBImagePickerController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AAA8FE221ACDA090002A9710 /* QBImagePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = AAA8FE201ACDA090002A9710 /* QBImagePickerController.m */; }; - AAA8FE5B1ACDA554002A9710 /* QBAlbumsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = AAA8FE591ACDA554002A9710 /* QBAlbumsViewController.h */; }; - AAA8FE5C1ACDA554002A9710 /* QBAlbumsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AAA8FE5A1ACDA554002A9710 /* QBAlbumsViewController.m */; }; - AABBF0901ACEDDFF003188A3 /* QBCheckmarkView.h in Headers */ = {isa = PBXBuildFile; fileRef = AABBF08E1ACEDDFF003188A3 /* QBCheckmarkView.h */; }; - AABBF0911ACEDDFF003188A3 /* QBCheckmarkView.m in Sources */ = {isa = PBXBuildFile; fileRef = AABBF08F1ACEDDFF003188A3 /* QBCheckmarkView.m */; }; - AAF1CA1A1ACE5467005F6295 /* QBAlbumCell.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF1CA181ACE5467005F6295 /* QBAlbumCell.h */; }; - AAF1CA1B1ACE5467005F6295 /* QBAlbumCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF1CA191ACE5467005F6295 /* QBAlbumCell.m */; }; - AAF1CA231ACE5598005F6295 /* QBImagePicker.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AAF1CA221ACE5598005F6295 /* QBImagePicker.storyboard */; }; - AAF1CA2F1ACE6E46005F6295 /* QBAssetsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF1CA2D1ACE6E46005F6295 /* QBAssetsViewController.h */; }; - AAF1CA301ACE6E46005F6295 /* QBAssetsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF1CA2E1ACE6E46005F6295 /* QBAssetsViewController.m */; }; - AAF1CA331ACE6FB5005F6295 /* QBAssetCell.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF1CA311ACE6FB5005F6295 /* QBAssetCell.h */; }; - AAF1CA341ACE6FB5005F6295 /* QBAssetCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF1CA321ACE6FB5005F6295 /* QBAssetCell.m */; }; - E521B0A21B01D9300079461F /* QBImagePicker.strings in Resources */ = {isa = PBXBuildFile; fileRef = AAF1CA3F1ACE8918005F6295 /* QBImagePicker.strings */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 07A50A481B331A840010E048 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/QBImagePicker.strings; sourceTree = ""; }; - 3A21B6F126614081003AF608 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/QBImagePicker.strings; sourceTree = ""; }; - 3A684B06251887B4006605D4 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/QBImagePicker.strings; sourceTree = ""; }; - 4237D94D25F8C071008C19B7 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/QBImagePicker.strings; sourceTree = ""; }; - 5A63116E200FC8C0006D76A5 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/QBImagePicker.strings; sourceTree = ""; }; - 6525CF3C27CFBCA8004F9AAE /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/QBImagePicker.strings; sourceTree = ""; }; - 74BB93661B2CE91A0044EB60 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/QBImagePicker.strings; sourceTree = ""; }; - 790A850D1AE7D4D9008E2A80 /* QBSlomoIconView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBSlomoIconView.h; sourceTree = ""; }; - 790A850E1AE7D4D9008E2A80 /* QBSlomoIconView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBSlomoIconView.m; sourceTree = ""; }; - 7D92D893270E4FF700BFC37E /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/QBImagePicker.strings; sourceTree = ""; }; - 7D92D894270E500300BFC37E /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/QBImagePicker.strings; sourceTree = ""; }; - 82C8A8C927C370E300A3B0EB /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/QBImagePicker.strings; sourceTree = ""; }; - 1F83428028819165002788FE /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/QBImagePicker.strings; sourceTree = ""; }; - 1F83427F28819162002788FE /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/QBImagePicker.strings; sourceTree = ""; }; - AA3AD06D1ACF9A3A00BF523E /* QBVideoIconView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBVideoIconView.h; sourceTree = ""; }; - AA3AD06E1ACF9A3A00BF523E /* QBVideoIconView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBVideoIconView.m; sourceTree = ""; }; - AA3AD0711ACFA06700BF523E /* QBVideoIndicatorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBVideoIndicatorView.h; sourceTree = ""; }; - AA3AD0721ACFA06700BF523E /* QBVideoIndicatorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBVideoIndicatorView.m; sourceTree = ""; }; - AAA8FE031ACDA079002A9710 /* QBImagePicker.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = QBImagePicker.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AAA8FE071ACDA079002A9710 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AAA8FE081ACDA079002A9710 /* QBImagePicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QBImagePicker.h; sourceTree = ""; }; - AAA8FE1F1ACDA090002A9710 /* QBImagePickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBImagePickerController.h; sourceTree = ""; }; - AAA8FE201ACDA090002A9710 /* QBImagePickerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBImagePickerController.m; sourceTree = ""; }; - AAA8FE591ACDA554002A9710 /* QBAlbumsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBAlbumsViewController.h; sourceTree = ""; }; - AAA8FE5A1ACDA554002A9710 /* QBAlbumsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBAlbumsViewController.m; sourceTree = ""; }; - AABBF08E1ACEDDFF003188A3 /* QBCheckmarkView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBCheckmarkView.h; sourceTree = ""; }; - AABBF08F1ACEDDFF003188A3 /* QBCheckmarkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBCheckmarkView.m; sourceTree = ""; }; - AAF1CA181ACE5467005F6295 /* QBAlbumCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBAlbumCell.h; sourceTree = ""; }; - AAF1CA191ACE5467005F6295 /* QBAlbumCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBAlbumCell.m; sourceTree = ""; }; - AAF1CA221ACE5598005F6295 /* QBImagePicker.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = QBImagePicker.storyboard; sourceTree = ""; }; - AAF1CA2D1ACE6E46005F6295 /* QBAssetsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBAssetsViewController.h; sourceTree = ""; }; - AAF1CA2E1ACE6E46005F6295 /* QBAssetsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = QBAssetsViewController.m; sourceTree = ""; }; - AAF1CA311ACE6FB5005F6295 /* QBAssetCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QBAssetCell.h; sourceTree = ""; }; - AAF1CA321ACE6FB5005F6295 /* QBAssetCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QBAssetCell.m; sourceTree = ""; }; - AAF1CA3E1ACE8918005F6295 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/QBImagePicker.strings; sourceTree = ""; }; - AAF1CA401ACE8A8B005F6295 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/QBImagePicker.strings; sourceTree = ""; }; - D12C7DB1255B412500F13F68 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/QBImagePicker.strings; sourceTree = ""; }; - D12C7DB2255B413200F13F68 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/QBImagePicker.strings; sourceTree = ""; }; - D12C7DB3255B413E00F13F68 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/QBImagePicker.strings"; sourceTree = ""; }; - E521B0A11B01D6810079461F /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/QBImagePicker.strings"; sourceTree = ""; }; - F167DB441C086AB90045AD5B /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/QBImagePicker.strings; sourceTree = ""; }; - FE931D551CEC597D00D343BD /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/QBImagePicker.strings; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - AAA8FDFF1ACDA079002A9710 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - AA3AD0751ACFA22500BF523E /* Views */ = { - isa = PBXGroup; - children = ( - AAF1CA181ACE5467005F6295 /* QBAlbumCell.h */, - AAF1CA191ACE5467005F6295 /* QBAlbumCell.m */, - AAF1CA311ACE6FB5005F6295 /* QBAssetCell.h */, - AAF1CA321ACE6FB5005F6295 /* QBAssetCell.m */, - AABBF08E1ACEDDFF003188A3 /* QBCheckmarkView.h */, - AABBF08F1ACEDDFF003188A3 /* QBCheckmarkView.m */, - AA3AD06D1ACF9A3A00BF523E /* QBVideoIconView.h */, - AA3AD06E1ACF9A3A00BF523E /* QBVideoIconView.m */, - 790A850D1AE7D4D9008E2A80 /* QBSlomoIconView.h */, - 790A850E1AE7D4D9008E2A80 /* QBSlomoIconView.m */, - AA3AD0711ACFA06700BF523E /* QBVideoIndicatorView.h */, - AA3AD0721ACFA06700BF523E /* QBVideoIndicatorView.m */, - ); - name = Views; - sourceTree = ""; - }; - AA3AD0761ACFA23300BF523E /* ViewControllers */ = { - isa = PBXGroup; - children = ( - AAA8FE1F1ACDA090002A9710 /* QBImagePickerController.h */, - AAA8FE201ACDA090002A9710 /* QBImagePickerController.m */, - AAA8FE591ACDA554002A9710 /* QBAlbumsViewController.h */, - AAA8FE5A1ACDA554002A9710 /* QBAlbumsViewController.m */, - AAF1CA2D1ACE6E46005F6295 /* QBAssetsViewController.h */, - AAF1CA2E1ACE6E46005F6295 /* QBAssetsViewController.m */, - ); - name = ViewControllers; - sourceTree = ""; - }; - AAA8FDF91ACDA079002A9710 = { - isa = PBXGroup; - children = ( - AAA8FE051ACDA079002A9710 /* QBImagePicker */, - AAA8FE041ACDA079002A9710 /* Products */, - ); - sourceTree = ""; - }; - AAA8FE041ACDA079002A9710 /* Products */ = { - isa = PBXGroup; - children = ( - AAA8FE031ACDA079002A9710 /* QBImagePicker.framework */, - ); - name = Products; - sourceTree = ""; - }; - AAA8FE051ACDA079002A9710 /* QBImagePicker */ = { - isa = PBXGroup; - children = ( - AAA8FE081ACDA079002A9710 /* QBImagePicker.h */, - AA3AD0751ACFA22500BF523E /* Views */, - AA3AD0761ACFA23300BF523E /* ViewControllers */, - AAF1CA241ACE5665005F6295 /* Resources */, - AAA8FE061ACDA079002A9710 /* Supporting Files */, - ); - path = QBImagePicker; - sourceTree = ""; - }; - AAA8FE061ACDA079002A9710 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - AAA8FE071ACDA079002A9710 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - AAF1CA241ACE5665005F6295 /* Resources */ = { - isa = PBXGroup; - children = ( - AAF1CA221ACE5598005F6295 /* QBImagePicker.storyboard */, - AAF1CA3F1ACE8918005F6295 /* QBImagePicker.strings */, - ); - name = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - AAA8FE001ACDA079002A9710 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 790A850F1AE7D4D9008E2A80 /* QBSlomoIconView.h in Headers */, - AA3AD0731ACFA06700BF523E /* QBVideoIndicatorView.h in Headers */, - AAF1CA331ACE6FB5005F6295 /* QBAssetCell.h in Headers */, - AAF1CA2F1ACE6E46005F6295 /* QBAssetsViewController.h in Headers */, - AAF1CA1A1ACE5467005F6295 /* QBAlbumCell.h in Headers */, - AAA8FE5B1ACDA554002A9710 /* QBAlbumsViewController.h in Headers */, - AA3AD06F1ACF9A3A00BF523E /* QBVideoIconView.h in Headers */, - AAA8FE091ACDA079002A9710 /* QBImagePicker.h in Headers */, - AABBF0901ACEDDFF003188A3 /* QBCheckmarkView.h in Headers */, - AAA8FE211ACDA090002A9710 /* QBImagePickerController.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - AAA8FE021ACDA079002A9710 /* QBImagePicker */ = { - isa = PBXNativeTarget; - buildConfigurationList = AAA8FE191ACDA079002A9710 /* Build configuration list for PBXNativeTarget "QBImagePicker" */; - buildPhases = ( - AAA8FDFE1ACDA079002A9710 /* Sources */, - AAA8FDFF1ACDA079002A9710 /* Frameworks */, - AAA8FE001ACDA079002A9710 /* Headers */, - AAA8FE011ACDA079002A9710 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = QBImagePicker; - productName = QBImagePicker; - productReference = AAA8FE031ACDA079002A9710 /* QBImagePicker.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - AAA8FDFA1ACDA079002A9710 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = "Katsuma Tanaka"; - TargetAttributes = { - 340A78CB1D7909FB00241672 = { - CreatedOnToolsVersion = 7.3.1; - }; - AAA8FE021ACDA079002A9710 = { - CreatedOnToolsVersion = 6.2; - }; - }; - }; - buildConfigurationList = AAA8FDFD1ACDA079002A9710 /* Build configuration list for PBXProject "QBImagePicker" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - English, - en, - Base, - ja, - "zh-Hans", - es, - de, - pl, - fr, - ko, - ru, - it, - pt, - "zh-Hant", - tr, - ro, - uk, - sv, - nb, - vi, - da, - fi, - ); - mainGroup = AAA8FDF91ACDA079002A9710; - productRefGroup = AAA8FE041ACDA079002A9710 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - AAA8FE021ACDA079002A9710 /* QBImagePicker */, - 340A78CB1D7909FB00241672 /* Build QBImagePicker */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - AAA8FE011ACDA079002A9710 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - E521B0A21B01D9300079461F /* QBImagePicker.strings in Resources */, - AAF1CA231ACE5598005F6295 /* QBImagePicker.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 340A78CF1D790A0100241672 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Merge Script\n\n# 1\n# Set bash script to exit immediately if any commands fail.\nset -e\n\n# 2\n# Setup some constants for use later on.\nFRAMEWORK_NAME=\"QBImagePicker\"\nDEST_DIR=\"$(cd ../$(SRCROOT) && pwd)/ImageCropPickerSDK\"\n\n# 3\n# If remnants from a previous build exist, delete them.\nif [ -d \"${SRCROOT}/build\" ]; then\nrm -rf \"${SRCROOT}/build\"\nfi\n\n# 4\n# Build the framework for device and for simulator (using\n# all needed architectures).\nxcodebuild -target \"${FRAMEWORK_NAME}\" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk \"iphoneos\"\nxcodebuild -target \"${FRAMEWORK_NAME}\" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes -sdk \"iphonesimulator\"\n\n# 5\n# Remove .framework file if exists on Desktop from previous run.\nif [ -d \"$DEST_DIR/${FRAMEWORK_NAME}.framework\" ]; then\nrm -rf \"$DEST_DIR/${FRAMEWORK_NAME}.framework\"\nfi\n\n# 6\n# Copy the device version of framework to Desktop.\ncp -r \"${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework\" \"$DEST_DIR/${FRAMEWORK_NAME}.framework\"\n\n# 7\n# Replace the framework executable within the framework with\n# a new version created by merging the device and simulator\n# frameworks' executables with lipo.\nlipo -create -output \"$DEST_DIR/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}\" \"${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}\" \"${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}\"\n\n# 9\n# Delete the most recent build.\nif [ -d \"${SRCROOT}/build\" ]; then\nrm -rf \"${SRCROOT}/build\"\nfi"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - AAA8FDFE1ACDA079002A9710 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AAF1CA341ACE6FB5005F6295 /* QBAssetCell.m in Sources */, - AA3AD0701ACF9A3A00BF523E /* QBVideoIconView.m in Sources */, - 790A85101AE7D4D9008E2A80 /* QBSlomoIconView.m in Sources */, - AABBF0911ACEDDFF003188A3 /* QBCheckmarkView.m in Sources */, - AAF1CA301ACE6E46005F6295 /* QBAssetsViewController.m in Sources */, - AAF1CA1B1ACE5467005F6295 /* QBAlbumCell.m in Sources */, - AAA8FE221ACDA090002A9710 /* QBImagePickerController.m in Sources */, - AA3AD0741ACFA06700BF523E /* QBVideoIndicatorView.m in Sources */, - AAA8FE5C1ACDA554002A9710 /* QBAlbumsViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - AAF1CA3F1ACE8918005F6295 /* QBImagePicker.strings */ = { - isa = PBXVariantGroup; - children = ( - AAF1CA3E1ACE8918005F6295 /* en */, - AAF1CA401ACE8A8B005F6295 /* ja */, - E521B0A11B01D6810079461F /* zh-Hans */, - 07A50A481B331A840010E048 /* es */, - 74BB93661B2CE91A0044EB60 /* de */, - F167DB441C086AB90045AD5B /* pl */, - 5A63116E200FC8C0006D76A5 /* fr */, - 3A684B06251887B4006605D4 /* ko */, - FE931D551CEC597D00D343BD /* ru */, - D12C7DB1255B412500F13F68 /* it */, - D12C7DB2255B413200F13F68 /* pt */, - D12C7DB3255B413E00F13F68 /* zh-Hant */, - 4237D94D25F8C071008C19B7 /* tr */, - 3A21B6F126614081003AF608 /* ro */, - 7D92D893270E4FF700BFC37E /* uk */, - 7D92D894270E500300BFC37E /* sv */, - 6525CF3C27CFBCA8004F9AAE /* nb */, - 82C8A8C927C370E300A3B0EB /* vi */, - 1F83428028819165002788FE /* da */, - 1F83427F28819162002788FE /* fi */, - ); - name = QBImagePicker.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 340A78CC1D7909FC00241672 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 340A78CD1D7909FC00241672 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - AAA8FE171ACDA079002A9710 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BITCODE_GENERATION_MODE = bitcode; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - AAA8FE181ACDA079002A9710 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - BITCODE_GENERATION_MODE = bitcode; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - PROVISIONING_PROFILE = ""; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - AAA8FE1A1ACDA079002A9710 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = QBImagePicker/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "jp.questbeat.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - VALID_ARCHS = "arm64 armv7 armv7s i386 x86_64"; - }; - name = Debug; - }; - AAA8FE1B1ACDA079002A9710 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = QBImagePicker/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - ONLY_ACTIVE_ARCH = NO; - PRODUCT_BUNDLE_IDENTIFIER = "jp.questbeat.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - VALID_ARCHS = "arm64 armv7 armv7s i386 x86_64"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 340A78CE1D7909FC00241672 /* Build configuration list for PBXAggregateTarget "Build QBImagePicker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 340A78CC1D7909FC00241672 /* Debug */, - 340A78CD1D7909FC00241672 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AAA8FDFD1ACDA079002A9710 /* Build configuration list for PBXProject "QBImagePicker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AAA8FE171ACDA079002A9710 /* Debug */, - AAA8FE181ACDA079002A9710 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AAA8FE191ACDA079002A9710 /* Build configuration list for PBXNativeTarget "QBImagePicker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AAA8FE1A1ACDA079002A9710 /* Debug */, - AAA8FE1B1ACDA079002A9710 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = AAA8FDFA1ACDA079002A9710 /* Project object */; -} diff --git a/ios/QBImagePicker/QBImagePicker.xcodeproj/xcshareddata/xcschemes/QBImagePicker.xcscheme b/ios/QBImagePicker/QBImagePicker.xcodeproj/xcshareddata/xcschemes/QBImagePicker.xcscheme deleted file mode 100644 index 51050cace170472c2374b39f200310445c9dd13a..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker.xcodeproj/xcshareddata/xcschemes/QBImagePicker.xcscheme +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/QBImagePicker/QBImagePicker/Info.plist b/ios/QBImagePicker/QBImagePicker/Info.plist deleted file mode 100644 index a8f98d8fe18bf31413cde2b38b98940069be0354..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 3.4.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/ios/QBImagePicker/QBImagePicker/QBAlbumCell.h b/ios/QBImagePicker/QBImagePicker/QBAlbumCell.h deleted file mode 100644 index 14e5c8871f36d3879e653f4402146c54456fba9e..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAlbumCell.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// QBAlbumCell.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -@interface QBAlbumCell : UITableViewCell - -@property (weak, nonatomic) IBOutlet UIImageView *imageView1; -@property (weak, nonatomic) IBOutlet UIImageView *imageView2; -@property (weak, nonatomic) IBOutlet UIImageView *imageView3; -@property (weak, nonatomic) IBOutlet UILabel *titleLabel; -@property (weak, nonatomic) IBOutlet UILabel *countLabel; - -@property (nonatomic, assign) CGFloat borderWidth; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAlbumCell.m b/ios/QBImagePicker/QBImagePicker/QBAlbumCell.m deleted file mode 100644 index 59750fab83dba17399f4dfc9bb02525e92a0b567..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAlbumCell.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// QBAlbumCell.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBAlbumCell.h" - -@implementation QBAlbumCell - -- (void)setBorderWidth:(CGFloat)borderWidth -{ - _borderWidth = borderWidth; - - self.imageView1.layer.borderColor = [[UIColor whiteColor] CGColor]; - self.imageView1.layer.borderWidth = borderWidth; - - self.imageView2.layer.borderColor = [[UIColor whiteColor] CGColor]; - self.imageView2.layer.borderWidth = borderWidth; - - self.imageView3.layer.borderColor = [[UIColor whiteColor] CGColor]; - self.imageView3.layer.borderWidth = borderWidth; -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAlbumsViewController.h b/ios/QBImagePicker/QBImagePicker/QBAlbumsViewController.h deleted file mode 100644 index 43610b44063c2fbd711010a9dcd319947ccac67b..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAlbumsViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// QBAlbumsViewController.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -@class QBImagePickerController; - -@interface QBAlbumsViewController : UITableViewController - -@property (nonatomic, weak) QBImagePickerController *imagePickerController; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAlbumsViewController.m b/ios/QBImagePicker/QBImagePicker/QBAlbumsViewController.m deleted file mode 100644 index dec556cac7b16c2ce91d322d134ac4760b8cc17c..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAlbumsViewController.m +++ /dev/null @@ -1,473 +0,0 @@ -// -// QBAlbumsViewController.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBAlbumsViewController.h" -#import -#import - -// Views -#import "QBAlbumCell.h" - -// ViewControllers -#import "QBImagePickerController.h" -#import "QBAssetsViewController.h" - -static CGSize CGSizeScale(CGSize size, CGFloat scale) { - return CGSizeMake(size.width * scale, size.height * scale); -} - -static bool isLimitedPermission() { - if (@available(iOS 14, *)) { - PHAuthorizationStatus accessLevel = [PHPhotoLibrary authorizationStatusForAccessLevel: PHAccessLevelReadWrite]; - return accessLevel == PHAuthorizationStatusLimited; - } - return false; -} - -static bool isDarkMode() { - if (@available(iOS 13.0, *)) { - UITraitCollection *current = UITraitCollection.currentTraitCollection; - return current.userInterfaceStyle == UIUserInterfaceStyleDark; - } - return false; -} - -@interface QBImagePickerController (Private) - -@property (nonatomic, strong) NSBundle *assetBundle; - -@end - -@interface QBAlbumsViewController () - -@property (nonatomic, strong) IBOutlet UIBarButtonItem *doneButton; - -@property (nonatomic, copy) NSArray *fetchResults; -@property (nonatomic, copy) NSArray *assetCollections; - -@end - -@implementation QBAlbumsViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - [self setUpToolbarItems]; - - // Fetch user albums and smart albums - PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; - PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; - self.fetchResults = @[smartAlbums, userAlbums]; - - [self updateAssetCollections]; - - // Register observer - [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self]; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - // Configure navigation item - self.navigationItem.title = NSLocalizedStringFromTableInBundle(@"albums.title", @"QBImagePicker", self.imagePickerController.assetBundle, nil); - self.navigationItem.prompt = self.imagePickerController.prompt; - - // Show/hide 'Done' button - if (self.imagePickerController.allowsMultipleSelection) { - [self.navigationItem setRightBarButtonItem:self.doneButton animated:NO]; - } else { - [self.navigationItem setRightBarButtonItem:nil animated:NO]; - } - - [self updateControlState]; - [self updateSelectionInfo]; -} - -- (void)dealloc -{ - // Deregister observer - [[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self]; -} - - -#pragma mark - Storyboard - -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender -{ - QBAssetsViewController *assetsViewController = segue.destinationViewController; - assetsViewController.imagePickerController = self.imagePickerController; - assetsViewController.assetCollection = self.assetCollections[self.tableView.indexPathForSelectedRow.row]; -} - - -#pragma mark - Actions - -- (IBAction)cancel:(id)sender -{ - if ([self.imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerControllerDidCancel:)]) { - [self.imagePickerController.delegate qb_imagePickerControllerDidCancel:self.imagePickerController]; - } -} - -- (IBAction)done:(id)sender -{ - if ([self.imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerController:didFinishPickingAssets:)]) { - [self.imagePickerController.delegate qb_imagePickerController:self.imagePickerController - didFinishPickingAssets:self.imagePickerController.selectedAssets.array]; - } -} - - -#pragma mark - Toolbar - -- (void)setUpToolbarItems -{ - // Space - UIBarButtonItem *leftSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL]; - UIBarButtonItem *rightSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL]; - - // Info label - NSDictionary *attributes = @{ NSForegroundColorAttributeName: [UIColor blackColor] }; - UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:NULL]; - infoButtonItem.enabled = NO; - [infoButtonItem setTitleTextAttributes:attributes forState:UIControlStateNormal]; - [infoButtonItem setTitleTextAttributes:attributes forState:UIControlStateDisabled]; - - self.toolbarItems = @[leftSpace, infoButtonItem, rightSpace]; -} - -- (void)updateSelectionInfo -{ - NSMutableOrderedSet *selectedAssets = self.imagePickerController.selectedAssets; - - if (selectedAssets.count > 0) { - NSBundle *bundle = self.imagePickerController.assetBundle; - NSString *format; - if (selectedAssets.count > 1) { - format = NSLocalizedStringFromTableInBundle(@"assets.toolbar.items-selected", @"QBImagePicker", bundle, nil); - } else { - format = NSLocalizedStringFromTableInBundle(@"assets.toolbar.item-selected", @"QBImagePicker", bundle, nil); - } - - NSString *title = [NSString stringWithFormat:format, selectedAssets.count]; - [(UIBarButtonItem *)self.toolbarItems[1] setTitle:title]; - } else { - [(UIBarButtonItem *)self.toolbarItems[1] setTitle:@""]; - } -} - - -#pragma mark - Fetching Asset Collections - -- (void)updateAssetCollections -{ - // Filter albums - NSArray *assetCollectionSubtypes = self.imagePickerController.assetCollectionSubtypes; - NSMutableDictionary *smartAlbums = [NSMutableDictionary dictionaryWithCapacity:assetCollectionSubtypes.count]; - NSMutableArray *userAlbums = [NSMutableArray array]; - - for (PHFetchResult *fetchResult in self.fetchResults) { - [fetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *assetCollection, NSUInteger index, BOOL *stop) { - PHAssetCollectionSubtype subtype = assetCollection.assetCollectionSubtype; - - if (subtype == PHAssetCollectionSubtypeAlbumRegular) { - [userAlbums addObject:assetCollection]; - } else if ([assetCollectionSubtypes containsObject:@(subtype)]) { - if (!smartAlbums[@(subtype)]) { - smartAlbums[@(subtype)] = [NSMutableArray array]; - } - [smartAlbums[@(subtype)] addObject:assetCollection]; - } - }]; - } - - NSMutableArray *assetCollections = [NSMutableArray array]; - - // Fetch smart albums - for (NSNumber *assetCollectionSubtype in assetCollectionSubtypes) { - NSArray *collections = smartAlbums[assetCollectionSubtype]; - - if (collections) { - [assetCollections addObjectsFromArray:collections]; - } - } - - // Fetch user albums - [userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *assetCollection, NSUInteger index, BOOL *stop) { - [assetCollections addObject:assetCollection]; - }]; - - self.assetCollections = assetCollections; -} - -- (UIImage *)placeholderImageWithSize:(CGSize)size -{ - UIGraphicsBeginImageContext(size); - CGContextRef context = UIGraphicsGetCurrentContext(); - - UIColor *backgroundColor = [UIColor colorWithRed:(239.0 / 255.0) green:(239.0 / 255.0) blue:(244.0 / 255.0) alpha:1.0]; - UIColor *iconColor = [UIColor colorWithRed:(179.0 / 255.0) green:(179.0 / 255.0) blue:(182.0 / 255.0) alpha:1.0]; - - // Background - CGContextSetFillColorWithColor(context, [backgroundColor CGColor]); - CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height)); - - // Icon (back) - CGRect backIconRect = CGRectMake(size.width * (16.0 / 68.0), - size.height * (20.0 / 68.0), - size.width * (32.0 / 68.0), - size.height * (24.0 / 68.0)); - - CGContextSetFillColorWithColor(context, [iconColor CGColor]); - CGContextFillRect(context, backIconRect); - - CGContextSetFillColorWithColor(context, [backgroundColor CGColor]); - CGContextFillRect(context, CGRectInset(backIconRect, 1.0, 1.0)); - - // Icon (front) - CGRect frontIconRect = CGRectMake(size.width * (20.0 / 68.0), - size.height * (24.0 / 68.0), - size.width * (32.0 / 68.0), - size.height * (24.0 / 68.0)); - - CGContextSetFillColorWithColor(context, [backgroundColor CGColor]); - CGContextFillRect(context, CGRectInset(frontIconRect, -1.0, -1.0)); - - CGContextSetFillColorWithColor(context, [iconColor CGColor]); - CGContextFillRect(context, frontIconRect); - - CGContextSetFillColorWithColor(context, [backgroundColor CGColor]); - CGContextFillRect(context, CGRectInset(frontIconRect, 1.0, 1.0)); - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - - -#pragma mark - Checking for Selection Limit - -- (BOOL)isMinimumSelectionLimitFulfilled -{ - return (self.imagePickerController.minimumNumberOfSelection <= self.imagePickerController.selectedAssets.count); -} - -- (BOOL)isMaximumSelectionLimitReached -{ - NSUInteger minimumNumberOfSelection = MAX(1, self.imagePickerController.minimumNumberOfSelection); - - if (minimumNumberOfSelection <= self.imagePickerController.maximumNumberOfSelection) { - return (self.imagePickerController.maximumNumberOfSelection <= self.imagePickerController.selectedAssets.count); - } - - return NO; -} - -- (void)updateControlState -{ - self.doneButton.enabled = [self isMinimumSelectionLimitFulfilled]; -} - -#pragma mark - Manage Limited Permission - --(void)managePermissionAction:(id)sender -{ - UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTableInBundle(@"permission.title", @"QBImagePicker", self.imagePickerController.assetBundle, nil) message:nil preferredStyle:UIAlertControllerStyleActionSheet]; - actionSheet.popoverPresentationController.sourceView = sender; - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTableInBundle(@"permission.cancel", @"QBImagePicker", self.imagePickerController.assetBundle, nil) style:UIAlertActionStyleCancel handler:nil]]; - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTableInBundle(@"permission.choose_more", @"QBImagePicker", self.imagePickerController.assetBundle, nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - // Open limited permission picker. - if (@available(iOS 14, *)) { - [[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self]; - } - }]]; - - [actionSheet addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTableInBundle(@"permission.change_settings", @"QBImagePicker", self.imagePickerController.assetBundle, nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - // Open application settings. - UIApplication *application = [UIApplication sharedApplication]; - NSURL *URL = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; - [application openURL:URL options:@{} completionHandler:nil]; - }]]; - - // Present action sheet. - [self presentViewController:actionSheet animated:YES completion:nil]; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ - return isLimitedPermission() ? 2 : 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - if (isLimitedPermission() && section == 0) { - return 1; - } - return self.assetCollections.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - if (isLimitedPermission()) { - if (indexPath.section == 0) { - CGRect frame = [tableView rectForRowAtIndexPath:indexPath]; - UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; - cell.tag = indexPath.row; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - UIButton *manageButton = [UIButton buttonWithType:UIButtonTypeSystem]; - if (isDarkMode()) { - [cell setBackgroundColor:[UIColor colorWithRed: 0.03 green: 0.03 blue: 0.03 alpha: 1.00]]; - [manageButton setBackgroundColor:[UIColor colorWithRed: 0.13 green: 0.13 blue: 0.13 alpha: 1.00]]; - [manageButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - } else { - [cell setBackgroundColor:[UIColor colorWithRed: 0.95 green: 0.95 blue: 0.95 alpha: 1.00]]; - [manageButton setBackgroundColor:[UIColor colorWithRed: 0.85 green: 0.85 blue: 0.85 alpha: 1.00]]; - [manageButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - } - [manageButton addTarget:self action:@selector(managePermissionAction:) forControlEvents:UIControlEventTouchUpInside]; - manageButton.layer.cornerRadius = 12; - manageButton.contentEdgeInsets = UIEdgeInsetsMake(4, 12, 4, 12); - [manageButton setTitle:NSLocalizedStringFromTableInBundle(@"permission.manage", @"QBImagePicker", self.imagePickerController.assetBundle, nil) forState:UIControlStateNormal]; - [manageButton sizeToFit]; - [cell setAccessoryView:manageButton]; - - UILabel *helpText = [[UILabel alloc] initWithFrame:CGRectMake(16,0,cell.contentView.frame.size.width - manageButton.frame.size.width + 24, frame.size.height)]; - helpText.font = [UIFont systemFontOfSize:13]; - [helpText setNumberOfLines:2]; - helpText.text = NSLocalizedStringFromTableInBundle(@"permission.help", @"QBImagePicker", self.imagePickerController.assetBundle, nil); - - [cell.contentView addSubview:helpText]; - - return cell; - } - } - - QBAlbumCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AlbumCell" forIndexPath:indexPath]; - cell.tag = indexPath.row; - cell.borderWidth = 1.0 / [[UIScreen mainScreen] scale]; - - // Thumbnail - PHAssetCollection *assetCollection = self.assetCollections[indexPath.row]; - - PHFetchOptions *options = [PHFetchOptions new]; - - switch (self.imagePickerController.mediaType) { - case QBImagePickerMediaTypeImage: - options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; - break; - - case QBImagePickerMediaTypeVideo: - options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeVideo]; - break; - - default: - break; - } - - PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options]; - PHImageManager *imageManager = [PHImageManager defaultManager]; - - if (fetchResult.count >= 3) { - cell.imageView3.hidden = NO; - - [imageManager requestImageForAsset:fetchResult[fetchResult.count - 3] - targetSize:CGSizeScale(cell.imageView3.frame.size, [[UIScreen mainScreen] scale]) - contentMode:PHImageContentModeAspectFill - options:nil - resultHandler:^(UIImage *result, NSDictionary *info) { - if (cell.tag == indexPath.row) { - cell.imageView3.image = result; - } - }]; - } else { - cell.imageView3.hidden = YES; - } - - if (fetchResult.count >= 2) { - cell.imageView2.hidden = NO; - - [imageManager requestImageForAsset:fetchResult[fetchResult.count - 2] - targetSize:CGSizeScale(cell.imageView2.frame.size, [[UIScreen mainScreen] scale]) - contentMode:PHImageContentModeAspectFill - options:nil - resultHandler:^(UIImage *result, NSDictionary *info) { - if (cell.tag == indexPath.row) { - cell.imageView2.image = result; - } - }]; - } else { - cell.imageView2.hidden = YES; - } - - if (fetchResult.count >= 1) { - [imageManager requestImageForAsset:fetchResult[fetchResult.count - 1] - targetSize:CGSizeScale(cell.imageView1.frame.size, [[UIScreen mainScreen] scale]) - contentMode:PHImageContentModeAspectFill - options:nil - resultHandler:^(UIImage *result, NSDictionary *info) { - if (cell.tag == indexPath.row) { - cell.imageView1.image = result; - } - }]; - } - - if (fetchResult.count == 0) { - cell.imageView3.hidden = NO; - cell.imageView2.hidden = NO; - - // Set placeholder image - UIImage *placeholderImage = [self placeholderImageWithSize:cell.imageView1.frame.size]; - cell.imageView1.image = placeholderImage; - cell.imageView2.image = placeholderImage; - cell.imageView3.image = placeholderImage; - } - - // Album title - cell.titleLabel.text = assetCollection.localizedTitle; - - // Number of photos - cell.countLabel.text = [NSString stringWithFormat:@"%lu", (long)fetchResult.count]; - - return cell; -} - - -#pragma mark - PHPhotoLibraryChangeObserver - -- (void)photoLibraryDidChange:(PHChange *)changeInstance -{ - dispatch_async(dispatch_get_main_queue(), ^{ - // Update fetch results - NSMutableArray *fetchResults = [self.fetchResults mutableCopy]; - - [self.fetchResults enumerateObjectsUsingBlock:^(PHFetchResult *fetchResult, NSUInteger index, BOOL *stop) { - PHFetchResultChangeDetails *changeDetails = [changeInstance changeDetailsForFetchResult:fetchResult]; - - if (changeDetails) { - [fetchResults replaceObjectAtIndex:index withObject:changeDetails.fetchResultAfterChanges]; - } - }]; - - if (![self.fetchResults isEqualToArray:fetchResults]) { - self.fetchResults = fetchResults; - - // Reload albums - [self updateAssetCollections]; - [self.tableView reloadData]; - } - }); -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAssetCell.h b/ios/QBImagePicker/QBImagePicker/QBAssetCell.h deleted file mode 100644 index cd2f4beb302a990c2195fca8059c4d997b4499ca..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAssetCell.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// QBAssetCell.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -@class QBVideoIndicatorView; - -@interface QBAssetCell : UICollectionViewCell - -@property (weak, nonatomic) IBOutlet UIImageView *imageView; -@property (weak, nonatomic) IBOutlet QBVideoIndicatorView *videoIndicatorView; - -@property (nonatomic, assign) BOOL showsOverlayViewWhenSelected; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAssetCell.m b/ios/QBImagePicker/QBImagePicker/QBAssetCell.m deleted file mode 100644 index c62c5626d362dcb233111936650b30440e12d160..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAssetCell.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// QBAssetCell.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBAssetCell.h" - -@interface QBAssetCell () - -@property (weak, nonatomic) IBOutlet UIView *overlayView; - -@end - -@implementation QBAssetCell - -- (void)setSelected:(BOOL)selected -{ - [super setSelected:selected]; - - // Show/hide overlay view - self.overlayView.hidden = !(selected && self.showsOverlayViewWhenSelected); -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAssetsViewController.h b/ios/QBImagePicker/QBImagePicker/QBAssetsViewController.h deleted file mode 100644 index ac1ff742a22b6a2be66dfa1a70a358ecccecb0d6..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAssetsViewController.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// QBAssetsViewController.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -@class QBImagePickerController; -@class PHAssetCollection; - -@interface QBAssetsViewController : UICollectionViewController - -@property (nonatomic, weak) QBImagePickerController *imagePickerController; -@property (nonatomic, strong) PHAssetCollection *assetCollection; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBAssetsViewController.m b/ios/QBImagePicker/QBImagePicker/QBAssetsViewController.m deleted file mode 100644 index dceb11aa030e478c46e5427e3704b3a914952b34..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBAssetsViewController.m +++ /dev/null @@ -1,719 +0,0 @@ -// -// QBAssetsViewController.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBAssetsViewController.h" -#import - -// Views -#import "QBImagePickerController.h" -#import "QBAssetCell.h" -#import "QBVideoIndicatorView.h" - -static CGSize CGSizeScale(CGSize size, CGFloat scale) { - return CGSizeMake(size.width * scale, size.height * scale); -} - -@interface QBImagePickerController (Private) - -@property (nonatomic, strong) NSBundle *assetBundle; - -@end - -@implementation NSIndexSet (Convenience) - -- (NSArray *)qb_indexPathsFromIndexesWithSection:(NSUInteger)section -{ - NSMutableArray *indexPaths = [NSMutableArray arrayWithCapacity:self.count]; - [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { - [indexPaths addObject:[NSIndexPath indexPathForItem:idx inSection:section]]; - }]; - return indexPaths; -} - -@end - -@implementation UICollectionView (Convenience) - -- (NSArray *)qb_indexPathsForElementsInRect:(CGRect)rect -{ - NSArray *allLayoutAttributes = [self.collectionViewLayout layoutAttributesForElementsInRect:rect]; - if (allLayoutAttributes.count == 0) { return nil; } - - NSMutableArray *indexPaths = [NSMutableArray arrayWithCapacity:allLayoutAttributes.count]; - for (UICollectionViewLayoutAttributes *layoutAttributes in allLayoutAttributes) { - NSIndexPath *indexPath = layoutAttributes.indexPath; - [indexPaths addObject:indexPath]; - } - return indexPaths; -} - -@end - -@interface QBAssetsViewController () - -@property (nonatomic, strong) IBOutlet UIBarButtonItem *doneButton; - -@property (nonatomic, strong) PHFetchResult *fetchResult; - -@property (nonatomic, strong) PHCachingImageManager *imageManager; -@property (nonatomic, assign) CGRect previousPreheatRect; - -@property (nonatomic, assign) BOOL disableScrollToBottom; -@property (nonatomic, strong) NSIndexPath *lastSelectedItemIndexPath; - -@end - -@implementation QBAssetsViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - [self setUpToolbarItems]; - [self resetCachedAssets]; - - // Register observer - [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self]; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - // Configure navigation item - self.navigationItem.title = self.assetCollection.localizedTitle; - self.navigationItem.prompt = self.imagePickerController.prompt; - - // Configure collection view - self.collectionView.allowsMultipleSelection = self.imagePickerController.allowsMultipleSelection; - - // Show/hide 'Done' button - if (self.imagePickerController.allowsMultipleSelection) { - [self.navigationItem setRightBarButtonItem:self.doneButton animated:NO]; - } else { - [self.navigationItem setRightBarButtonItem:nil animated:NO]; - } - - [self updateDoneButtonState]; - [self updateSelectionInfo]; - [self.collectionView reloadData]; - - // Scroll to bottom - if (self.fetchResult.count > 0 && !self.disableScrollToBottom) { - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:(self.fetchResult.count - 1) inSection:0]; - [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionTop animated:NO]; - } -} - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; - - self.disableScrollToBottom = YES; -} - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - self.disableScrollToBottom = NO; - - [self updateCachedAssets]; -} - -- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator -{ - // Save indexPath for the last item - NSIndexPath *indexPath = [[self.collectionView indexPathsForVisibleItems] lastObject]; - - // Update layout - [self.collectionViewLayout invalidateLayout]; - - // Restore scroll position - [coordinator animateAlongsideTransition:nil completion:^(id context) { - [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:NO]; - }]; -} - -- (void)dealloc -{ - // Deregister observer - [[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self]; -} - - -#pragma mark - Accessors - -- (void)setAssetCollection:(PHAssetCollection *)assetCollection -{ - _assetCollection = assetCollection; - - [self updateFetchRequest]; - [self.collectionView reloadData]; -} - -- (PHCachingImageManager *)imageManager -{ - if (_imageManager == nil) { - _imageManager = [PHCachingImageManager new]; - } - - return _imageManager; -} - -- (BOOL)isAutoDeselectEnabled -{ - return (self.imagePickerController.maximumNumberOfSelection == 1 - && self.imagePickerController.maximumNumberOfSelection >= self.imagePickerController.minimumNumberOfSelection); -} - - -#pragma mark - Actions - -- (IBAction)done:(id)sender -{ - if ([self.imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerController:didFinishPickingAssets:)]) { - [self.imagePickerController.delegate qb_imagePickerController:self.imagePickerController - didFinishPickingAssets:self.imagePickerController.selectedAssets.array]; - } -} - - -#pragma mark - Toolbar - -- (void)setUpToolbarItems -{ - // Space - UIBarButtonItem *leftSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL]; - UIBarButtonItem *rightSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL]; - - // Info label - UIColor *labelColor = [UIColor blackColor]; - if (@available(iOS 13.0, *)) { - labelColor = [UIColor labelColor]; - } - NSDictionary *attributes = @{ NSForegroundColorAttributeName: labelColor }; - UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:NULL]; - infoButtonItem.enabled = NO; - [infoButtonItem setTitleTextAttributes:attributes forState:UIControlStateNormal]; - [infoButtonItem setTitleTextAttributes:attributes forState:UIControlStateDisabled]; - - self.toolbarItems = @[leftSpace, infoButtonItem, rightSpace]; -} - -- (void)updateSelectionInfo -{ - NSMutableOrderedSet *selectedAssets = self.imagePickerController.selectedAssets; - - if (selectedAssets.count > 0) { - NSBundle *bundle = self.imagePickerController.assetBundle; - NSString *format; - if (selectedAssets.count > 1) { - format = NSLocalizedStringFromTableInBundle(@"assets.toolbar.items-selected", @"QBImagePicker", bundle, nil); - } else { - format = NSLocalizedStringFromTableInBundle(@"assets.toolbar.item-selected", @"QBImagePicker", bundle, nil); - } - - NSString *title = [NSString stringWithFormat:format, selectedAssets.count]; - [(UIBarButtonItem *)self.toolbarItems[1] setTitle:title]; - } else { - [(UIBarButtonItem *)self.toolbarItems[1] setTitle:@""]; - } -} - - -#pragma mark - Fetching Assets - -- (void)updateFetchRequest -{ - if (self.assetCollection) { - PHFetchOptions *options = [PHFetchOptions new]; - - switch (self.imagePickerController.mediaType) { - case QBImagePickerMediaTypeImage: - options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; - break; - - case QBImagePickerMediaTypeVideo: - options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeVideo]; - break; - - default: - break; - } - - - if ([self.imagePickerController.sortOrder isEqualToString:@"asc"]) { - options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending: YES]]; - } - - if ([self.imagePickerController.sortOrder isEqualToString:@"desc"]) { - options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending: NO]]; - } - - self.fetchResult = [PHAsset fetchAssetsInAssetCollection:self.assetCollection options:options]; - - if ([self isAutoDeselectEnabled] && self.imagePickerController.selectedAssets.count > 0) { - // Get index of previous selected asset - PHAsset *asset = [self.imagePickerController.selectedAssets firstObject]; - NSInteger assetIndex = [self.fetchResult indexOfObject:asset]; - self.lastSelectedItemIndexPath = [NSIndexPath indexPathForItem:assetIndex inSection:0]; - } - } else { - self.fetchResult = nil; - } -} - - -#pragma mark - Checking for Selection Limit - -- (BOOL)isMinimumSelectionLimitFulfilled -{ - return (self.imagePickerController.minimumNumberOfSelection <= self.imagePickerController.selectedAssets.count); -} - -- (BOOL)isMaximumSelectionLimitReached -{ - NSUInteger minimumNumberOfSelection = MAX(1, self.imagePickerController.minimumNumberOfSelection); - - if (minimumNumberOfSelection <= self.imagePickerController.maximumNumberOfSelection) { - return (self.imagePickerController.maximumNumberOfSelection <= self.imagePickerController.selectedAssets.count); - } - - return NO; -} - -- (void)updateDoneButtonState -{ - self.doneButton.enabled = [self isMinimumSelectionLimitFulfilled]; -} - - -#pragma mark - Asset Caching - -- (void)resetCachedAssets -{ - [self.imageManager stopCachingImagesForAllAssets]; - self.previousPreheatRect = CGRectZero; -} - -- (void)updateCachedAssets -{ - BOOL isViewVisible = [self isViewLoaded] && self.view.window != nil; - if (!isViewVisible) { return; } - - // The preheat window is twice the height of the visible rect - CGRect preheatRect = self.collectionView.bounds; - preheatRect = CGRectInset(preheatRect, 0.0, -0.5 * CGRectGetHeight(preheatRect)); - - // If scrolled by a "reasonable" amount... - CGFloat delta = ABS(CGRectGetMidY(preheatRect) - CGRectGetMidY(self.previousPreheatRect)); - - if (delta > CGRectGetHeight(self.collectionView.bounds) / 3.0) { - // Compute the assets to start caching and to stop caching - NSMutableArray *addedIndexPaths = [NSMutableArray array]; - NSMutableArray *removedIndexPaths = [NSMutableArray array]; - - [self computeDifferenceBetweenRect:self.previousPreheatRect andRect:preheatRect addedHandler:^(CGRect addedRect) { - NSArray *indexPaths = [self.collectionView qb_indexPathsForElementsInRect:addedRect]; - [addedIndexPaths addObjectsFromArray:indexPaths]; - } removedHandler:^(CGRect removedRect) { - NSArray *indexPaths = [self.collectionView qb_indexPathsForElementsInRect:removedRect]; - [removedIndexPaths addObjectsFromArray:indexPaths]; - }]; - - NSArray *assetsToStartCaching = [self assetsAtIndexPaths:addedIndexPaths]; - NSArray *assetsToStopCaching = [self assetsAtIndexPaths:removedIndexPaths]; - - CGSize itemSize = [(UICollectionViewFlowLayout *)self.collectionViewLayout itemSize]; - CGSize targetSize = CGSizeScale(itemSize, [[UIScreen mainScreen] scale]); - - [self.imageManager startCachingImagesForAssets:assetsToStartCaching - targetSize:targetSize - contentMode:PHImageContentModeAspectFill - options:nil]; - [self.imageManager stopCachingImagesForAssets:assetsToStopCaching - targetSize:targetSize - contentMode:PHImageContentModeAspectFill - options:nil]; - - self.previousPreheatRect = preheatRect; - } -} - -- (void)computeDifferenceBetweenRect:(CGRect)oldRect andRect:(CGRect)newRect addedHandler:(void (^)(CGRect addedRect))addedHandler removedHandler:(void (^)(CGRect removedRect))removedHandler -{ - if (CGRectIntersectsRect(newRect, oldRect)) { - CGFloat oldMaxY = CGRectGetMaxY(oldRect); - CGFloat oldMinY = CGRectGetMinY(oldRect); - CGFloat newMaxY = CGRectGetMaxY(newRect); - CGFloat newMinY = CGRectGetMinY(newRect); - - if (newMaxY > oldMaxY) { - CGRect rectToAdd = CGRectMake(newRect.origin.x, oldMaxY, newRect.size.width, (newMaxY - oldMaxY)); - addedHandler(rectToAdd); - } - if (oldMinY > newMinY) { - CGRect rectToAdd = CGRectMake(newRect.origin.x, newMinY, newRect.size.width, (oldMinY - newMinY)); - addedHandler(rectToAdd); - } - if (newMaxY < oldMaxY) { - CGRect rectToRemove = CGRectMake(newRect.origin.x, newMaxY, newRect.size.width, (oldMaxY - newMaxY)); - removedHandler(rectToRemove); - } - if (oldMinY < newMinY) { - CGRect rectToRemove = CGRectMake(newRect.origin.x, oldMinY, newRect.size.width, (newMinY - oldMinY)); - removedHandler(rectToRemove); - } - } else { - addedHandler(newRect); - removedHandler(oldRect); - } -} - -- (NSArray *)assetsAtIndexPaths:(NSArray *)indexPaths -{ - if (indexPaths.count == 0) { return nil; } - - NSMutableArray *assets = [NSMutableArray arrayWithCapacity:indexPaths.count]; - for (NSIndexPath *indexPath in indexPaths) { - if (indexPath.item < self.fetchResult.count) { - PHAsset *asset = self.fetchResult[indexPath.item]; - [assets addObject:asset]; - } - } - return assets; -} - - -#pragma mark - PHPhotoLibraryChangeObserver - -- (void)photoLibraryDidChange:(PHChange *)changeInstance -{ - dispatch_async(dispatch_get_main_queue(), ^{ - PHFetchResultChangeDetails *collectionChanges = [changeInstance changeDetailsForFetchResult:self.fetchResult]; - - if (collectionChanges) { - // Get the new fetch result - self.fetchResult = [collectionChanges fetchResultAfterChanges]; - - if (![collectionChanges hasIncrementalChanges] || [collectionChanges hasMoves]) { - // We need to reload all if the incremental diffs are not available - [self.collectionView reloadData]; - } else { - // If we have incremental diffs, tell the collection view to animate insertions and deletions - [self.collectionView performBatchUpdates:^{ - NSIndexSet *removedIndexes = [collectionChanges removedIndexes]; - if ([removedIndexes count]) { - [self.collectionView deleteItemsAtIndexPaths:[removedIndexes qb_indexPathsFromIndexesWithSection:0]]; - } - - NSIndexSet *insertedIndexes = [collectionChanges insertedIndexes]; - if ([insertedIndexes count]) { - [self.collectionView insertItemsAtIndexPaths:[insertedIndexes qb_indexPathsFromIndexesWithSection:0]]; - } - } completion:NULL]; - - NSIndexSet *changedIndexes = [collectionChanges changedIndexes]; - if ([changedIndexes count]) { - [self.collectionView reloadItemsAtIndexPaths:[changedIndexes qb_indexPathsFromIndexesWithSection:0]]; - } - } - - [self resetCachedAssets]; - - // Update the selection to remove any assets that have been removed from the collection - NSMutableSet *removedAssets = [NSMutableSet new]; - for (PHAsset *asset in self.imagePickerController.selectedAssets) { - if(![self.fetchResult containsObject:asset]) { - [removedAssets addObject:asset]; - } - } - [self removeAssetsFromSelection:removedAssets]; - - // Update the footer to show the current photo/video counts - NSArray *footers = - [self.collectionView visibleSupplementaryViewsOfKind:UICollectionElementKindSectionFooter]; - if (footers.count) { - [self updateFooterView:footers[0]]; - } - } - }); -} - - -#pragma mark - UIScrollViewDelegate - -- (void)scrollViewDidScroll:(UIScrollView *)scrollView -{ - [self updateCachedAssets]; -} - - -#pragma mark - UICollectionViewDataSource - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView -{ - return 1; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section -{ - return self.fetchResult.count; -} - -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath -{ - QBAssetCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"AssetCell" forIndexPath:indexPath]; - cell.tag = indexPath.item; - cell.showsOverlayViewWhenSelected = self.imagePickerController.allowsMultipleSelection; - cell.isAccessibilityElement = true; - - // Image - PHAsset *asset = self.fetchResult[indexPath.item]; - CGSize itemSize = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout itemSize]; - CGSize targetSize = CGSizeScale(itemSize, [[UIScreen mainScreen] scale]); - - [self.imageManager requestImageForAsset:asset - targetSize:targetSize - contentMode:PHImageContentModeAspectFill - options:nil - resultHandler:^(UIImage *result, NSDictionary *info) { - if (cell.tag == indexPath.item) { - cell.imageView.image = result; - } - }]; - - // Video indicator - if (asset.mediaType == PHAssetMediaTypeVideo) { - cell.videoIndicatorView.hidden = NO; - - NSInteger minutes = (NSInteger)(asset.duration / 60.0); - NSInteger seconds = (NSInteger)ceil(asset.duration - 60.0 * (double)minutes); - cell.videoIndicatorView.timeLabel.text = [NSString stringWithFormat:@"%02ld:%02ld", (long)minutes, (long)seconds]; - - if (asset.mediaSubtypes & PHAssetMediaSubtypeVideoHighFrameRate) { - cell.videoIndicatorView.videoIcon.hidden = YES; - cell.videoIndicatorView.slomoIcon.hidden = NO; - } - else { - cell.videoIndicatorView.videoIcon.hidden = NO; - cell.videoIndicatorView.slomoIcon.hidden = YES; - } - } else { - cell.videoIndicatorView.hidden = YES; - } - - // Selection state - if ([self.imagePickerController.selectedAssets containsObject:asset]) { - [cell setSelected:YES]; - [collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone]; - } - - return cell; -} - -- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath -{ - if (kind == UICollectionElementKindSectionFooter) { - UICollectionReusableView *footerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter - withReuseIdentifier:@"FooterView" - forIndexPath:indexPath]; - [self updateFooterView:footerView]; - - return footerView; - } - - return nil; -} - -- (void)updateFooterView:(UICollectionReusableView *)footerView { - // Number of assets - UILabel *label = (UILabel *)[footerView viewWithTag:1]; - - NSBundle *bundle = self.imagePickerController.assetBundle; - NSUInteger numberOfPhotos = [self.fetchResult countOfAssetsWithMediaType:PHAssetMediaTypeImage]; - NSUInteger numberOfVideos = [self.fetchResult countOfAssetsWithMediaType:PHAssetMediaTypeVideo]; - - switch (self.imagePickerController.mediaType) { - case QBImagePickerMediaTypeAny: - { - NSString *format; - if (numberOfPhotos == 1) { - if (numberOfVideos == 1) { - format = NSLocalizedStringFromTableInBundle(@"assets.footer.photo-and-video", @"QBImagePicker", bundle, nil); - } else { - format = NSLocalizedStringFromTableInBundle(@"assets.footer.photo-and-videos", @"QBImagePicker", bundle, nil); - } - } else if (numberOfVideos == 1) { - format = NSLocalizedStringFromTableInBundle(@"assets.footer.photos-and-video", @"QBImagePicker", bundle, nil); - } else { - format = NSLocalizedStringFromTableInBundle(@"assets.footer.photos-and-videos", @"QBImagePicker", bundle, nil); - } - - label.text = [NSString stringWithFormat:format, numberOfPhotos, numberOfVideos]; - } - break; - - case QBImagePickerMediaTypeImage: - { - NSString *key = (numberOfPhotos == 1) ? @"assets.footer.photo" : @"assets.footer.photos"; - NSString *format = NSLocalizedStringFromTableInBundle(key, @"QBImagePicker", bundle, nil); - - label.text = [NSString stringWithFormat:format, numberOfPhotos]; - } - break; - - case QBImagePickerMediaTypeVideo: - { - NSString *key = (numberOfVideos == 1) ? @"assets.footer.video" : @"assets.footer.videos"; - NSString *format = NSLocalizedStringFromTableInBundle(key, @"QBImagePicker", bundle, nil); - - label.text = [NSString stringWithFormat:format, numberOfVideos]; - } - break; - } -} - - -#pragma mark - UICollectionViewDelegate - -- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath -{ - if ([self.imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerController:shouldSelectAsset:)]) { - PHAsset *asset = self.fetchResult[indexPath.item]; - return [self.imagePickerController.delegate qb_imagePickerController:self.imagePickerController shouldSelectAsset:asset]; - } - - if ([self isAutoDeselectEnabled]) { - return YES; - } - - return ![self isMaximumSelectionLimitReached]; -} - -- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath -{ - QBImagePickerController *imagePickerController = self.imagePickerController; - NSMutableOrderedSet *selectedAssets = imagePickerController.selectedAssets; - - PHAsset *asset = self.fetchResult[indexPath.item]; - - if (imagePickerController.allowsMultipleSelection) { - if ([self isAutoDeselectEnabled] && selectedAssets.count > 0) { - // Remove previous selected asset from set - [selectedAssets removeObjectAtIndex:0]; - - // Deselect previous selected asset - if (self.lastSelectedItemIndexPath) { - [collectionView deselectItemAtIndexPath:self.lastSelectedItemIndexPath animated:NO]; - } - } - - // Add asset to set - [selectedAssets addObject:asset]; - - self.lastSelectedItemIndexPath = indexPath; - - [self updateDoneButtonState]; - - if (imagePickerController.showsNumberOfSelectedAssets) { - [self updateSelectionInfo]; - - if (selectedAssets.count == 1) { - // Show toolbar - [self.navigationController setToolbarHidden:NO animated:YES]; - } - } - } else { - if ([imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerController:didFinishPickingAssets:)]) { - [imagePickerController.delegate qb_imagePickerController:imagePickerController didFinishPickingAssets:@[asset]]; - } - } - - if ([imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerController:didSelectAsset:)]) { - [imagePickerController.delegate qb_imagePickerController:imagePickerController didSelectAsset:asset]; - } -} - -- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath -{ - if (!self.imagePickerController.allowsMultipleSelection) { - return; - } - - QBImagePickerController *imagePickerController = self.imagePickerController; - NSMutableOrderedSet *selectedAssets = imagePickerController.selectedAssets; - - PHAsset *asset = self.fetchResult[indexPath.item]; - - // Remove asset from set - [selectedAssets removeObject:asset]; - - self.lastSelectedItemIndexPath = nil; - - [self updateDoneButtonState]; - - if (imagePickerController.showsNumberOfSelectedAssets) { - [self updateSelectionInfo]; - - if (selectedAssets.count == 0) { - // Hide toolbar - [self.navigationController setToolbarHidden:YES animated:YES]; - } - } - - if ([imagePickerController.delegate respondsToSelector:@selector(qb_imagePickerController:didDeselectAsset:)]) { - [imagePickerController.delegate qb_imagePickerController:imagePickerController didDeselectAsset:asset]; - } -} - -- (void)removeAssetsFromSelection:(NSSet *)assets -{ - if (assets.count == 0) { - return; - } - - QBImagePickerController *imagePickerController = self.imagePickerController; - NSMutableOrderedSet *selectedAssets = imagePickerController.selectedAssets; - - // Remove assets from set - [selectedAssets minusSet:assets]; - - self.lastSelectedItemIndexPath = nil; - - [self updateDoneButtonState]; - - if (self.imagePickerController.showsNumberOfSelectedAssets) { - [self updateSelectionInfo]; - - if (selectedAssets.count == 0) { - // Hide toolbar - [self.navigationController setToolbarHidden:YES animated:YES]; - } - } -} - - -#pragma mark - UICollectionViewDelegateFlowLayout - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath -{ - NSUInteger numberOfColumns; - if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) { - numberOfColumns = self.imagePickerController.numberOfColumnsInPortrait; - } else { - numberOfColumns = self.imagePickerController.numberOfColumnsInLandscape; - } - - CGFloat width = (CGRectGetWidth(self.view.frame) - 2.0 * (numberOfColumns - 1)) / numberOfColumns; - - return CGSizeMake(width, width); -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBCheckmarkView.h b/ios/QBImagePicker/QBImagePicker/QBCheckmarkView.h deleted file mode 100644 index fd7b745f4511cca81e35b1b771c12120112951e2..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBCheckmarkView.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// QBCheckmarkView.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -IB_DESIGNABLE -@interface QBCheckmarkView : UIView - -@property (nonatomic, assign) IBInspectable CGFloat borderWidth; -@property (nonatomic, assign) IBInspectable CGFloat checkmarkLineWidth; - -@property (nonatomic, strong) IBInspectable UIColor *borderColor; -@property (nonatomic, strong) IBInspectable UIColor *bodyColor; -@property (nonatomic, strong) IBInspectable UIColor *checkmarkColor; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBCheckmarkView.m b/ios/QBImagePicker/QBImagePicker/QBCheckmarkView.m deleted file mode 100644 index aa25ac8c1e13c5d1362ddee4675f6f5972035720..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBCheckmarkView.m +++ /dev/null @@ -1,54 +0,0 @@ -// -// QBCheckmarkView.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBCheckmarkView.h" - -@implementation QBCheckmarkView - -- (void)awakeFromNib -{ - [super awakeFromNib]; - - // Set default values - self.borderWidth = 1.0; - self.checkmarkLineWidth = 1.2; - - self.borderColor = [UIColor whiteColor]; - self.bodyColor = [UIColor colorWithRed:(20.0 / 255.0) green:(111.0 / 255.0) blue:(223.0 / 255.0) alpha:1.0]; - self.checkmarkColor = [UIColor whiteColor]; - - // Set shadow - self.layer.shadowColor = [[UIColor grayColor] CGColor]; - self.layer.shadowOffset = CGSizeMake(0, 0); - self.layer.shadowOpacity = 0.6; - self.layer.shadowRadius = 2.0; -} - -- (void)drawRect:(CGRect)rect -{ - // Border - [self.borderColor setFill]; - [[UIBezierPath bezierPathWithOvalInRect:self.bounds] fill]; - - // Body - [self.bodyColor setFill]; - [[UIBezierPath bezierPathWithOvalInRect:CGRectInset(self.bounds, self.borderWidth, self.borderWidth)] fill]; - - // Checkmark - UIBezierPath *checkmarkPath = [UIBezierPath bezierPath]; - checkmarkPath.lineWidth = self.checkmarkLineWidth; - - [checkmarkPath moveToPoint:CGPointMake(CGRectGetWidth(self.bounds) * (6.0 / 24.0), CGRectGetHeight(self.bounds) * (12.0 / 24.0))]; - [checkmarkPath addLineToPoint:CGPointMake(CGRectGetWidth(self.bounds) * (10.0 / 24.0), CGRectGetHeight(self.bounds) * (16.0 / 24.0))]; - [checkmarkPath addLineToPoint:CGPointMake(CGRectGetWidth(self.bounds) * (18.0 / 24.0), CGRectGetHeight(self.bounds) * (8.0 / 24.0))]; - - [self.checkmarkColor setStroke]; - [checkmarkPath stroke]; -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBImagePicker.h b/ios/QBImagePicker/QBImagePicker/QBImagePicker.h deleted file mode 100644 index 54ccdce326ac54d8d8125c6b6ef623a6be4c5ae7..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBImagePicker.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// QBImagePicker.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -//! Project version number for QBImagePicker. -FOUNDATION_EXPORT double QBImagePickerVersionNumber; - -//! Project version string for QBImagePicker. -FOUNDATION_EXPORT const unsigned char QBImagePickerVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import -#import diff --git a/ios/QBImagePicker/QBImagePicker/QBImagePicker.storyboard b/ios/QBImagePicker/QBImagePicker/QBImagePicker.storyboard deleted file mode 100644 index a80edff90571226e3bf18fd6185297cf1fc03faa..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBImagePicker.storyboard +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/QBImagePicker/QBImagePicker/QBImagePickerController.h b/ios/QBImagePicker/QBImagePicker/QBImagePickerController.h deleted file mode 100644 index 6289eef8d73b9a537c83eb06782414ef4057599e..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBImagePickerController.h +++ /dev/null @@ -1,52 +0,0 @@ -// -// QBImagePickerController.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import -#import - -@class QBImagePickerController; - -@protocol QBImagePickerControllerDelegate - -@optional -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didFinishPickingAssets:(NSArray *)assets; -- (void)qb_imagePickerControllerDidCancel:(QBImagePickerController *)imagePickerController; - -- (BOOL)qb_imagePickerController:(QBImagePickerController *)imagePickerController shouldSelectAsset:(PHAsset *)asset; -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didSelectAsset:(PHAsset *)asset; -- (void)qb_imagePickerController:(QBImagePickerController *)imagePickerController didDeselectAsset:(PHAsset *)asset; - -@end - -typedef NS_ENUM(NSUInteger, QBImagePickerMediaType) { - QBImagePickerMediaTypeAny = 0, - QBImagePickerMediaTypeImage, - QBImagePickerMediaTypeVideo -}; - -@interface QBImagePickerController : UIViewController - -@property (nonatomic, weak) id delegate; - -@property (nonatomic, strong, readonly) NSMutableOrderedSet *selectedAssets; - -@property (nonatomic, copy) NSArray *assetCollectionSubtypes; -@property (nonatomic, assign) QBImagePickerMediaType mediaType; - -@property (nonatomic, assign) BOOL allowsMultipleSelection; -@property (nonatomic, assign) NSUInteger minimumNumberOfSelection; -@property (nonatomic, assign) NSUInteger maximumNumberOfSelection; -@property (nonatomic, strong) NSString* sortOrder; - -@property (nonatomic, copy) NSString *prompt; -@property (nonatomic, assign) BOOL showsNumberOfSelectedAssets; - -@property (nonatomic, assign) NSUInteger numberOfColumnsInPortrait; -@property (nonatomic, assign) NSUInteger numberOfColumnsInLandscape; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBImagePickerController.m b/ios/QBImagePicker/QBImagePicker/QBImagePickerController.m deleted file mode 100644 index 99577c54a41b098f87b04482f351784906d6ee55..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBImagePickerController.m +++ /dev/null @@ -1,77 +0,0 @@ -// -// QBImagePickerController.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/03. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBImagePickerController.h" -#import - -// ViewControllers -#import "QBAlbumsViewController.h" - -@interface QBImagePickerController () - -@property (nonatomic, strong) UINavigationController *albumsNavigationController; - -@property (nonatomic, strong) NSBundle *assetBundle; - -@end - -@implementation QBImagePickerController - -- (instancetype)init -{ - self = [super init]; - - if (self) { - // Set default values - self.assetCollectionSubtypes = @[ - @(PHAssetCollectionSubtypeSmartAlbumUserLibrary), - @(PHAssetCollectionSubtypeAlbumMyPhotoStream), - @(PHAssetCollectionSubtypeSmartAlbumPanoramas), - @(PHAssetCollectionSubtypeSmartAlbumVideos), - @(PHAssetCollectionSubtypeSmartAlbumBursts) - ]; - self.minimumNumberOfSelection = 1; - self.numberOfColumnsInPortrait = 4; - self.numberOfColumnsInLandscape = 7; - - _selectedAssets = [NSMutableOrderedSet orderedSet]; - - // Get asset bundle - self.assetBundle = [NSBundle bundleForClass:[self class]]; - NSString *bundlePath = [self.assetBundle pathForResource:@"QBImagePicker" ofType:@"bundle"]; - if (bundlePath) { - self.assetBundle = [NSBundle bundleWithPath:bundlePath]; - } - - [self setUpAlbumsViewController]; - - // Set instance - QBAlbumsViewController *albumsViewController = (QBAlbumsViewController *)self.albumsNavigationController.topViewController; - albumsViewController.imagePickerController = self; - } - - return self; -} - -- (void)setUpAlbumsViewController -{ - // Add QBAlbumsViewController as a child - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"QBImagePicker" bundle:self.assetBundle]; - UINavigationController *navigationController = [storyboard instantiateViewControllerWithIdentifier:@"QBAlbumsNavigationController"]; - - [self addChildViewController:navigationController]; - - navigationController.view.frame = self.view.bounds; - [self.view addSubview:navigationController.view]; - - [navigationController didMoveToParentViewController:self]; - - self.albumsNavigationController = navigationController; -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBSlomoIconView.h b/ios/QBImagePicker/QBImagePicker/QBSlomoIconView.h deleted file mode 100644 index 55d7ce2d2b3514e6ad1dbaf7fe0ca80818b98316..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBSlomoIconView.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QBSlomoIconView.h -// QBImagePicker -// -// Created by Julien Chaumond on 22/04/2015. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -IB_DESIGNABLE -@interface QBSlomoIconView : UIView - -@property (nonatomic, strong) IBInspectable UIColor *iconColor; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBSlomoIconView.m b/ios/QBImagePicker/QBImagePicker/QBSlomoIconView.m deleted file mode 100644 index ba6e86706e7089babe99e05bb37abd604bd97328..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBSlomoIconView.m +++ /dev/null @@ -1,36 +0,0 @@ -// -// QBSlomoIconView.m -// QBImagePicker -// -// Created by Julien Chaumond on 22/04/2015. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBSlomoIconView.h" - -@implementation QBSlomoIconView - -- (void)awakeFromNib -{ - [super awakeFromNib]; - - // Set default values - self.iconColor = [UIColor whiteColor]; -} - -- (void)drawRect:(CGRect)rect -{ - [self.iconColor setStroke]; - - CGFloat width = 2.2; - CGRect insetRect = CGRectInset(rect, width / 2, width / 2); - - // Draw dashed circle - UIBezierPath* circlePath = [UIBezierPath bezierPathWithOvalInRect:insetRect]; - circlePath.lineWidth = width; - CGFloat ovalPattern[] = {0.75, 0.75}; - [circlePath setLineDash:ovalPattern count:2 phase:0]; - [circlePath stroke]; -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBVideoIconView.h b/ios/QBImagePicker/QBImagePicker/QBVideoIconView.h deleted file mode 100644 index d1cf6d45ce571b961adc0e55085b51cc78b7cb6b..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBVideoIconView.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// QBVideoIconView.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/04. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -IB_DESIGNABLE -@interface QBVideoIconView : UIView - -@property (nonatomic, strong) IBInspectable UIColor *iconColor; - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBVideoIconView.m b/ios/QBImagePicker/QBImagePicker/QBVideoIconView.m deleted file mode 100644 index 898449529c5e8fa75ef1a5110eb548db1512cc7e..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBVideoIconView.m +++ /dev/null @@ -1,38 +0,0 @@ -// -// QBVideoIconView.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/04. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBVideoIconView.h" - -@implementation QBVideoIconView - -- (void)awakeFromNib -{ - [super awakeFromNib]; - - // Set default values - self.iconColor = [UIColor whiteColor]; -} - -- (void)drawRect:(CGRect)rect -{ - [self.iconColor setFill]; - - // Draw triangle - UIBezierPath *trianglePath = [UIBezierPath bezierPath]; - [trianglePath moveToPoint:CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMinY(self.bounds))]; - [trianglePath addLineToPoint:CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds))]; - [trianglePath addLineToPoint:CGPointMake(CGRectGetMaxX(self.bounds) - CGRectGetMidY(self.bounds), CGRectGetMidY(self.bounds))]; - [trianglePath closePath]; - [trianglePath fill]; - - // Draw rounded square - UIBezierPath *squarePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(CGRectGetMinX(self.bounds), CGRectGetMinY(self.bounds), CGRectGetWidth(self.bounds) - CGRectGetMidY(self.bounds) - 1.0, CGRectGetHeight(self.bounds)) cornerRadius:2.0]; - [squarePath fill]; -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBVideoIndicatorView.h b/ios/QBImagePicker/QBImagePicker/QBVideoIndicatorView.h deleted file mode 100644 index 80eeb0948c677a3c4c95343d5fd110e1d47c8ce4..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBVideoIndicatorView.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// QBVideoIndicatorView.h -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/04. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import - -#import "QBVideoIconView.h" -#import "QBSlomoIconView.h" - -@interface QBVideoIndicatorView : UIView - -@property (nonatomic, weak) IBOutlet UILabel *timeLabel; -@property (nonatomic, weak) IBOutlet QBVideoIconView *videoIcon; -@property (nonatomic, weak) IBOutlet QBSlomoIconView *slomoIcon; - - -@end diff --git a/ios/QBImagePicker/QBImagePicker/QBVideoIndicatorView.m b/ios/QBImagePicker/QBImagePicker/QBVideoIndicatorView.m deleted file mode 100644 index fcdbf32696cfe421857f8ed128b5a4c5272a974c..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/QBVideoIndicatorView.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// QBVideoIndicatorView.m -// QBImagePicker -// -// Created by Katsuma Tanaka on 2015/04/04. -// Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -// - -#import "QBVideoIndicatorView.h" - -@implementation QBVideoIndicatorView - -- (void)awakeFromNib -{ - [super awakeFromNib]; - - // Add gradient layer - CAGradientLayer *gradientLayer = [CAGradientLayer layer]; - gradientLayer.frame = self.bounds; - gradientLayer.colors = @[ - (__bridge id)[[UIColor clearColor] CGColor], - (__bridge id)[[UIColor blackColor] CGColor] - ]; - - [self.layer insertSublayer:gradientLayer atIndex:0]; -} - -@end diff --git a/ios/QBImagePicker/QBImagePicker/da.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/da.lproj/QBImagePicker.strings deleted file mode 100644 index 8642f4c40eccce8a81caf2819e410ed659b13597..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/da.lproj/QBImagePicker.strings +++ /dev/null @@ -1,25 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker -*/ - -"albums.title" = "Billeder"; - -"assets.footer.photo" = "%ld Billede"; -"assets.footer.photos" = "%ld Billeder"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Videoer"; -"assets.footer.photo-and-video" = "%ld Billede, %ld Video"; -"assets.footer.photos-and-video" = "%ld Billeder, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Billede, %ld Videoer"; -"assets.footer.photos-and-videos" = "%ld Billeder, %ld Videoer"; - -"assets.toolbar.item-selected" = "%ld Valgt objekt"; -"assets.toolbar.items-selected" = "%ld Udvalgte genstande"; - -"permission.help" = "Du har givet adgang til et begrænset antal udvalgte billeder og videoer."; -"permission.manage" = "HÅNDTERE"; -"permission.title" = "For at få adgang til alle dine billeder i appen skal du give adgang til hele dit bibliotek i din enheds indstillinger."; -"permission.choose_more" = "Vælg flere billeder"; -"permission.change_settings" = "Ændre indstillinger"; -"permission.cancel" = "Annuller"; diff --git a/ios/QBImagePicker/QBImagePicker/de.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/de.lproj/QBImagePicker.strings deleted file mode 100644 index 5d92830b956ce458964b2c93359e9e86fc11f174..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/de.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "Fotos"; - -"assets.footer.photo" = "%ld Foto"; -"assets.footer.photos" = "%ld Fotos"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Videos"; -"assets.footer.photo-and-video" = "%ld Foto, %ld Video"; -"assets.footer.photos-and-video" = "%ld Fotos, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Foto, %ld Videos"; -"assets.footer.photos-and-videos" = "%ld Fotos, %ld Videos"; - -"assets.toolbar.item-selected" = "%ld Element ausgewählt"; -"assets.toolbar.items-selected" = "%ld Elemente ausgewählt"; - -"permission.help" = "Sie haben einer begrenzten Anzahl ausgewählter Fotos und Videos die Erlaubnis erteilt."; -"permission.manage" = "VERWALTEN"; -"permission.title" = "Um auf alle Ihre Fotos in der App zuzugreifen, geben Sie in den Geräteeinstellungen Zugriff auf Ihre vollständige Bibliothek."; -"permission.choose_more" = "Weitere Fotos auswählen"; -"permission.change_settings" = "Einstellungen ändern"; -"permission.cancel" = "Abbrechen"; diff --git a/ios/QBImagePicker/QBImagePicker/en.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/en.lproj/QBImagePicker.strings deleted file mode 100644 index 927c12d10cfa95df03e830973807d31bc733709f..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/en.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "Photos"; - -"assets.footer.photo" = "%ld Photo"; -"assets.footer.photos" = "%ld Photos"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Videos"; -"assets.footer.photo-and-video" = "%ld Photo, %ld Video"; -"assets.footer.photos-and-video" = "%ld Photos, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Photo, %ld Videos"; -"assets.footer.photos-and-videos" = "%ld Photos, %ld Videos"; - -"assets.toolbar.item-selected" = "%ld Item Selected"; -"assets.toolbar.items-selected" = "%ld Items Selected"; - -"permission.help" = "You have given permission to a limited number of selected photos and videos."; -"permission.manage" = "MANAGE"; -"permission.title" = "To access all your photos in the app, give access to your full library in the device settings."; -"permission.choose_more" = "Select More Photos"; -"permission.change_settings" = "Change Settings"; -"permission.cancel" = "Cancel"; diff --git a/ios/QBImagePicker/QBImagePicker/es.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/es.lproj/QBImagePicker.strings deleted file mode 100644 index 7a5e8707400015588a94498c6d12f8b19c32b850..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/es.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "Fotos"; - -"assets.footer.photo" = "%ld Foto"; -"assets.footer.photos" = "%ld Fotos"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Videos"; -"assets.footer.photo-and-video" = "%ld Foto, %ld Video"; -"assets.footer.photos-and-video" = "%ld Fotos, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Foto, %ld Videos"; -"assets.footer.photos-and-videos" = "%ld Fotos, %ld Videos"; - -"assets.toolbar.item-selected" = "%ld items seleccionados"; -"assets.toolbar.items-selected" = "%ld items seleccionados"; - -"permission.help" = "Ha otorgado permiso a un número limitado de fotos y videos seleccionados."; -"permission.manage" = "ADMINISTRAR"; -"permission.title" = "Para acceder a todas sus fotos en la aplicación, dé acceso a su biblioteca completa en la configuración del dispositivo."; -"permission.choose_more" = "Seleccionar más fotos"; -"permission.change_settings" = "Cambiar configuración"; -"permission.cancel" = "Cancelar"; diff --git a/ios/QBImagePicker/QBImagePicker/fi.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/fi.lproj/QBImagePicker.strings deleted file mode 100644 index 57fabe1695c32eee84f82c4310ee7801916cb440..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/fi.lproj/QBImagePicker.strings +++ /dev/null @@ -1,25 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker -*/ - -"albums.title" = "Kuvia"; - -"assets.footer.photo" = "%ld Kuva"; -"assets.footer.photos" = "%ld Kuvia"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Videoita"; -"assets.footer.photo-and-video" = "%ld Kuva, %ld Video"; -"assets.footer.photos-and-video" = "%ld Kuvia, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Kuva, %ld Videoita"; -"assets.footer.photos-and-videos" = "%ld Kuvia, %ld Videoita"; - -"assets.toolbar.item-selected" = "%ld Valittu objekti"; -"assets.toolbar.items-selected" = "%ld Valitut kohteet"; - -"permission.help" = "Olet myöntänyt pääsyn rajoitettuun määrään valittuja kuvia ja videoita."; -"permission.manage" = "KÄSITTELE"; -"permission.title" = "Jos haluat käyttää kaikkia sovelluksessa olevia kuviasi, anna käyttöoikeus koko kirjastoosi laitteesi asetuksista."; -"permission.choose_more" = "Valitse lisää kuvia"; -"permission.change_settings" = "Vaihda asetuksia"; -"permission.cancel" = "Peruuttaa"; diff --git a/ios/QBImagePicker/QBImagePicker/fr.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/fr.lproj/QBImagePicker.strings deleted file mode 100644 index 3c435329227241db5cc575fc39cceae3937affda..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/fr.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Gareth McCall on 2018/01/17. - MIT License - Copyright (c) 2018 Ivan Pusic, et al -*/ - -"albums.title" = "Photos"; - -"assets.footer.photo" = "%ld Photo"; -"assets.footer.photos" = "%ld Photos"; -"assets.footer.video" = "%ld Vidéo"; -"assets.footer.videos" = "%ld Vidéos"; -"assets.footer.photo-and-video" = "%ld Photo, %ld Vidéo"; -"assets.footer.photos-and-video" = "%ld Photos, %ld Vidéo"; -"assets.footer.photo-and-videos" = "%ld Photo, %ld Vidéos"; -"assets.footer.photos-and-videos" = "%ld Photos, %ld Vidéos"; - -"assets.toolbar.item-selected" = "%ld Élément Sélectionné"; -"assets.toolbar.items-selected" = "%ld Éléments Sélectionnés"; - -"permission.help" = "Vous avez autorisé un nombre limité de photos et de vidéos sélectionnées."; -"permission.manage" = "GÉRER"; -"permission.title" = "Pour accéder à toutes vos photos dans l'application, donnez accès à votre bibliothèque complète dans les paramètres de l'appareil."; -"permission.choose_more" = "Sélectionner plus de photos" ; -"permission.change_settings" = "Modifier les paramètres" ; -"permission.cancel" = "Annuler" ; diff --git a/ios/QBImagePicker/QBImagePicker/it.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/it.lproj/QBImagePicker.strings deleted file mode 100644 index 4076c0b923c31d67b3b7a753ca77e8a9a7b09479..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/it.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Seungyeob Song on 2020/11/10. - Copyright (c) 2020 Seungyeob Song. All rights reserved. -*/ - -"albums.title" = "Foto"; - -"assets.footer.photo" = "%ld Foto"; -"assets.footer.photos" = "%ld Foto"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Video"; -"assets.footer.photo-and-video" = "%ld Foto, %ld Video"; -"assets.footer.photos-and-video" = "%ld Foto, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Foto, %ld Video"; -"assets.footer.photos-and-videos" = "%ld Foto, %ld Video"; - -"assets.toolbar.item-selected" = "%ld Elemento Selezionato"; -"assets.toolbar.items-selected" = "%ld Elementi Selezionati"; - -"permission.help" = "Hai autorizzato un numero limitato di foto e video selezionati."; -"permission.manage" = "GESTISCI"; -"permission.title" = "Per accedere a tutte le tue foto nell'app, concedi l'accesso alla tua libreria completa nelle impostazioni del dispositivo."; -"permission.choose_more" = "Seleziona altre foto"; -"permission.change_settings" = "Cambia impostazioni"; -"permission.cancel" = "Annulla"; diff --git a/ios/QBImagePicker/QBImagePicker/ja.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/ja.lproj/QBImagePicker.strings deleted file mode 100644 index 1b46c694b5e3112e5c7af7a11b968db809bc9ea4..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/ja.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "アルバム"; - -"assets.footer.photo" = "写真: %ld枚"; -"assets.footer.photos" = "写真: %ld枚"; -"assets.footer.video" = "ビデオ: %ld本"; -"assets.footer.videos" = "ビデオ: %ld本"; -"assets.footer.photo-and-video" = "写真: %ld枚、ビデオ%ld本"; -"assets.footer.photos-and-video" = "写真: %ld枚、ビデオ%ld本"; -"assets.footer.photo-and-videos" = "写真: %ld枚、ビデオ%ld本"; -"assets.footer.photos-and-videos" = "写真: %ld枚、ビデオ%ld本"; - -"assets.toolbar.item-selected" = "%ld 項目を選択中"; -"assets.toolbar.items-selected" = "%ld 項目を選択中"; - -"permission.help" = "選択した限られた数の写真とビデオに許可を与えました。"; -"permission.manage" = "管理"; -"permission.title" = "アプリ内のすべての写真にアクセスするには、デバイス設定でライブラリ全体へのアクセスを許可します。"; -"permission.choose_more" = "写真をもっと選択"; -"permission.change_settings" = "設定の変更"; -"permission.cancel" = "キャンセル"; diff --git a/ios/QBImagePicker/QBImagePicker/ko.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/ko.lproj/QBImagePicker.strings deleted file mode 100644 index 4776131aca5f557437e437cbaa8422e4b6538567..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/ko.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "사진"; - -"assets.footer.photo" = "%ld 사진"; -"assets.footer.photos" = "%ld 사진"; -"assets.footer.video" = "%ld 비디오"; -"assets.footer.videos" = "%ld 비디오"; -"assets.footer.photo-and-video" = "%ld 사진, %ld 비디오"; -"assets.footer.photos-and-video" = "%ld 사진, %ld 비디오"; -"assets.footer.photo-and-videos" = "%ld 사진, %ld 비디오"; -"assets.footer.photos-and-videos" = "%ld 사진, %ld 비디오"; - -"assets.toolbar.item-selected" = "%ld 선택된 아이템"; -"assets.toolbar.items-selected" = "%ld 선택된 아이템"; - -"permission.help" = "선택한 사진 및 비디오의 제한된 수에 대한 권한을 부여했습니다."; -"permission.manage" = "관리"; -"permission.title" = "앱에 있는 모든 사진에 접근하려면 기기 설정에서 전체 보관함에 접근 권한을 부여하십시오."; -"permission.choose_more" = "추가 사진 선택"; -"permission.change_settings" = "설정 변경"; -"permission.cancel" = "취소"; diff --git a/ios/QBImagePicker/QBImagePicker/nb.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/nb.lproj/QBImagePicker.strings deleted file mode 100644 index 2e60950b8b417cb212f4e51e0bbf9973e4cdaef8..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/nb.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "Bilder"; - -"assets.footer.photo" = "%ld bilde"; -"assets.footer.photos" = "%ld bilder"; -"assets.footer.video" = "%ld video"; -"assets.footer.videos" = "%ld videoer"; -"assets.footer.photo-and-video" = "%ld bilde, %ld video"; -"assets.footer.photos-and-video" = "%ld bilder, %ld video"; -"assets.footer.photo-and-videos" = "%ld bilde, %ld videoer"; -"assets.footer.photos-and-videos" = "%ld bilder, %ld videoer"; - -"assets.toolbar.item-selected" = "%ld objekt valgt"; -"assets.toolbar.items-selected" = "%ld objekter valgt"; - -"permission.help" = "Du har gitt tilgang til et begrenset utvalg av bilder og videoer."; -"permission.manage" = "ENDRE"; -"permission.title" = "For å gi tilgang til alle bildene dine i appen, må du gi full tilgang til biblioteket fra enhetsinnstillingene."; -"permission.choose_more" = "Velg flere bilder"; -"permission.change_settings" = "Endre innstillinger"; -"permission.cancel" = "Avbryt"; diff --git a/ios/QBImagePicker/QBImagePicker/pl.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/pl.lproj/QBImagePicker.strings deleted file mode 100644 index cb839ba4e010832cfc389cfe12d6aa7b42f0c22c..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/pl.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. - */ - -"albums.title" = "Zdjęcia"; - -"assets.footer.photo" = "%ld zdjęcie"; -"assets.footer.photos" = "Zdjęć: %ld"; -"assets.footer.video" = "%ld wideo"; -"assets.footer.videos" = "Wideo: %ld"; -"assets.footer.photo-and-video" = "%ld zdjęcie, %ld wideo"; -"assets.footer.photos-and-video" = "Zdjęć: %ld, %ld wideo"; -"assets.footer.photo-and-videos" = "%ld zdjęcie, %ld wideo"; -"assets.footer.photos-and-videos" = "Zdjęć: %ld, %ld wideo"; - -"assets.toolbar.item-selected" = "%ld zaznaczona rzecz"; -"assets.toolbar.items-selected" = "Zaznaczonych rzeczy: %ld"; - -"permission.help" = "Zezwolono na ograniczoną liczbę wybranych zdjęć i filmów."; -"permission.manage" = "ZARZĄDZAJ"; -"permission.title" = "Aby uzyskać dostęp do wszystkich swoich zdjęć w aplikacji, zezwól na dostęp do pełnej biblioteki w ustawieniach urządzenia."; -"permission.choose_more" = "Wybierz więcej zdjęć"; -"permission.change_settings" = "Zmień ustawienia"; -"permission.cancel" = "Anuluj"; diff --git a/ios/QBImagePicker/QBImagePicker/pt.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/pt.lproj/QBImagePicker.strings deleted file mode 100644 index 53507b094c2f7ae66b972aee559bbddd8d232410..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/pt.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Seungyeob Song on 2020/11/10. - Copyright (c) 2020 Seungyeob Song. All rights reserved. -*/ - -"albums.title" = "Fotos"; - -"assets.footer.photo" = "%ld Foto"; -"assets.footer.photos" = "%ld Fotos"; -"assets.footer.video" = "%ld Vídeo"; -"assets.footer.videos" = "%ld Vídeos"; -"assets.footer.photo-and-video" = "%ld Foto, %ld Vídeo"; -"assets.footer.photos-and-video" = "%ld Fotos, %ld Vídeo"; -"assets.footer.photo-and-videos" = "%ld Foto, %ld Vídeos"; -"assets.footer.photos-and-videos" = "%ld Fotos, %ld Vídeos"; - -"assets.toolbar.item-selected" = "%ld Item Selecionado"; -"assets.toolbar.items-selected" = "%ld Itens Selecionados"; - -"permission.help" = "Você deu permissão a um número limitado de fotos e vídeos selecionados."; -"permission.manage" = "GERENCIAR"; -"permission.title" = "Para acessar todas as suas fotos no aplicativo, dê acesso à sua biblioteca completa nas configurações do dispositivo."; -"permission.choose_more" = "Selecionar mais fotos"; -"permission.change_settings" = "Alterar configurações"; -"permission.cancel" = "Cancelar"; diff --git a/ios/QBImagePicker/QBImagePicker/ro.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/ro.lproj/QBImagePicker.strings deleted file mode 100644 index 0ce8c628ef7a3526a16c9d66214e055d6c13b001..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/ro.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Anton Cojocaru on 2021/05/28. - Copyright (c) 2021 Anton Cojocaru. All rights reserved. -*/ - -"albums.title" = "Poze"; - -"assets.footer.photo" = "%ld Poză"; -"assets.footer.photos" = "%ld Poze"; -"assets.footer.video" = "%ld Clip"; -"assets.footer.videos" = "%ld Clipuri"; -"assets.footer.photo-and-video" = "%ld Poză, %ld Clip"; -"assets.footer.photos-and-video" = "%ld Poze, %ld Clip"; -"assets.footer.photo-and-videos" = "%ld Poză, %ld Clipuri"; -"assets.footer.photos-and-videos" = "%ld Poze, %ld Clipuri"; - -"assets.toolbar.item-selected" = "%ld Element Selectat"; -"assets.toolbar.items-selected" = "%ld Elemente Selectate"; - -"permission.help" = "Ați acordat permisiunea unui număr limitat de fotografii și videoclipuri selectate."; -"permission.manage" = "GESTIONARE"; -"permission.title" = "Pentru a vă accesa toate fotografiile din aplicație, acordați acces la biblioteca completă în setările dispozitivului."; -"permission.choose_more" = "Selectați mai multe fotografii"; -"permission.change_settings" = "Schimbați setările"; -"permission.cancel" = "Anulați"; diff --git a/ios/QBImagePicker/QBImagePicker/ru.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/ru.lproj/QBImagePicker.strings deleted file mode 100644 index 23ae5fd2f2d36c55d4b5237f13f9352c3b275322..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/ru.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Yaroslav Bunyaev on 2020/10/04. - Copyright (c) 2020 Yaroslav Bunyaev. All rights reserved. -*/ - -"albums.title" = "Фотографии"; - -"assets.footer.photo" = "%ld Фото"; -"assets.footer.photos" = "%ld Фото"; -"assets.footer.video" = "%ld Видео"; -"assets.footer.videos" = "%ld Видео"; -"assets.footer.photo-and-video" = "%ld Фото, %ld Видео"; -"assets.footer.photos-and-video" = "%ld Фото, %ld Видео"; -"assets.footer.photo-and-videos" = "%ld Фото, %ld Видео"; -"assets.footer.photos-and-videos" = "%ld Фото, %ld Видео"; - -"assets.toolbar.item-selected" = "%ld Элемент выбран"; -"assets.toolbar.items-selected" = "%ld Элементы выбраны"; - -"permission.help" = "Вы дали разрешение на ограниченное количество выбранных фотографий и видео."; -"permission.manage" = "УПРАВЛЕНИЕ"; -"permission.title" = "Чтобы получить доступ ко всем своим фотографиям в приложении, предоставьте доступ к полной библиотеке в настройках устройства."; -"permission.choose_more" = "Выбрать больше фотографий"; -"permission.change_settings" = "Изменить настройки"; -"permission.cancel" = "Отменить"; diff --git a/ios/QBImagePicker/QBImagePicker/sv.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/sv.lproj/QBImagePicker.strings deleted file mode 100644 index 6eaa9fcb309a3457ad0073d55058370c67e536a9..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/sv.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Marina Skripnik on 2021/10/07. - Copyright (c) 2021 Marina Skripnik. All rights reserved. -*/ - -"albums.title" = "Bilder"; - -"assets.footer.photo" = "%ld Bild"; -"assets.footer.photos" = "%ld Bilder"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Videor"; -"assets.footer.photo-and-video" = "%ld Bild, %ld Video"; -"assets.footer.photos-and-video" = "%ld Bilder, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Bild, %ld Videor"; -"assets.footer.photos-and-videos" = "%ld Bilder, %ld Videor"; - -"assets.toolbar.item-selected" = "%ld Markerad Objekt"; -"assets.toolbar.items-selected" = "%ld Markerade Objekt"; - -"permission.help" = "Du har gett åtkomst till ett begränsat antal utvalda bilder och videor."; -"permission.manage" = "HANTERA"; -"permission.title" = "För att komma åt alla dina foton i appen, ge åtkomst till ditt fulla bibliotek i enhetens inställningar."; -"permission.choose_more" = "Välj fler foton"; -"permission.change_settings" = "Ändra inställningar"; -"permission.cancel" = "Avbryt"; diff --git a/ios/QBImagePicker/QBImagePicker/tr.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/tr.lproj/QBImagePicker.strings deleted file mode 100644 index 5b96cd736b7f5ecfa98f65d464551ac716fcbda5..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/tr.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "Fotoğraflar"; - -"assets.footer.photo" = "%ld Fotoğraf"; -"assets.footer.photos" = "%ld Fotoğraf"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Video"; -"assets.footer.photo-and-video" = "%ld Fotoğraf, %ld Video"; -"assets.footer.photos-and-video" = "%ld Fotoğraf, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Fotoğraf, %ld Video"; -"assets.footer.photos-and-videos" = "%ld Fotoğraf, %ld Video"; - -"assets.toolbar.item-selected" = "%ld Adet Seçildi"; -"assets.toolbar.items-selected" = "%ld Adet Seçildi"; - -"permission.help" = "Sınırlı sayıda seçili fotoğraf ve videoya izin verdiniz."; -"permission.manage" = "YÖNET"; -"permission.title" = "Uygulamadaki tüm fotoğraflarınıza erişmek için cihaz ayarlarından tam kitaplığınıza erişim izni verin."; -"permission.choose_more" = "Daha Fazla Fotoğraf Seç"; -"permission.change_settings" = "Ayarları Değiştir"; -"permission.cancel" = "İptal"; diff --git a/ios/QBImagePicker/QBImagePicker/uk.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/uk.lproj/QBImagePicker.strings deleted file mode 100644 index 25aebb66210ec1a1aad5c96493688b5837011bb4..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/uk.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Marina Skripnik on 2021/10/07. - Copyright (c) 2021 Marina Skripnik. All rights reserved. -*/ - -"albums.title" = "Фотографії"; - -"assets.footer.photo" = "%ld Фото"; -"assets.footer.photos" = "%ld Фото"; -"assets.footer.video" = "%ld Відео"; -"assets.footer.videos" = "%ld Відео"; -"assets.footer.photo-and-video" = "%ld Фото, %ld Відео"; -"assets.footer.photos-and-video" = "%ld Фото, %ld Відео"; -"assets.footer.photo-and-videos" = "%ld Фото, %ld Відео"; -"assets.footer.photos-and-videos" = "%ld Фото, %ld Відео"; - -"assets.toolbar.item-selected" = "Вибрано %ld Елемент"; -"assets.toolbar.items-selected" = "Вибрано %ld Елементи"; - -"permission.help" = "Ви дали дозвіл на обмежену кількість вибраних фотографій і відео."; -"permission.manage" = "КЕРУВАТИ"; -"permission.title" = "Щоб отримати доступ до всіх своїх фотографій у програмі, надайте доступ до повної бібліотеки в налаштуваннях пристрою."; -"permission.choose_more" = "Вибрати більше фотографій"; -"permission.change_settings" = "Змінити налаштування"; -"permission.cancel" = "Скасувати"; diff --git a/ios/QBImagePicker/QBImagePicker/vi.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/vi.lproj/QBImagePicker.strings deleted file mode 100644 index 1814808e4335e240ffd17543075d869f60a47eb6..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/vi.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Pham Ngoc Thach on 2022/08/26. - Copyright (c) 2022 Pham Ngoc Thach. All rights reserved. -*/ - -"albums.title" = "Ảnh"; - -"assets.footer.photo" = "%ld Ảnh"; -"assets.footer.photos" = "%ld Ảnh"; -"assets.footer.video" = "%ld Video"; -"assets.footer.videos" = "%ld Video"; -"assets.footer.photo-and-video" = "%ld Ảnh, %ld Video"; -"assets.footer.photos-and-video" = "%ld Ảnh, %ld Video"; -"assets.footer.photo-and-videos" = "%ld Ảnh, %ld Video"; -"assets.footer.photos-and-videos" = "%ld Ảnh, %ld Video"; - -"assets.toolbar.item-selected" = "Đã chọn %ld mục"; -"assets.toolbar.items-selected" = "Đã chọn %ld mục"; - -"permission.help" = "Bạn đã cấp quyền truy cập vào số lượng ảnh và video có hạn."; -"permission.manage" = "QUẢN LÝ"; -"permission.title" = "Để truy cập tất cả ảnh trong ứng dụng, hãy cấp quyền truy cập vào toàn bộ thư viện của bạn trong cài đặt thiết bị."; -"permission.choose_more" = "Chọn Nhiều Ảnh"; -"permission.change_settings" = "Đổi Cài đặt"; -"permission.cancel" = "Hủy bỏ"; \ No newline at end of file diff --git a/ios/QBImagePicker/QBImagePicker/zh-Hans.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/zh-Hans.lproj/QBImagePicker.strings deleted file mode 100644 index 92d96003fd2337c1a48a1ad5403927f34aacdc68..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/zh-Hans.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Katsuma Tanaka on 2015/04/03. - Copyright (c) 2015 Katsuma Tanaka. All rights reserved. -*/ - -"albums.title" = "照片"; - -"assets.footer.photo" = "共%ld张照片"; -"assets.footer.photos" = "共%ld张照片"; -"assets.footer.video" = "共%ld个视频"; -"assets.footer.videos" = "共%ld个视频"; -"assets.footer.photo-and-video" = "共%ld 张照片, %ld 个视频"; -"assets.footer.photos-and-video" = "共%ld 张照片, %ld 个视频"; -"assets.footer.photo-and-videos" = "共%ld 张照片, %ld 个视频"; -"assets.footer.photos-and-videos" = "共%ld 张照片, %ld 个视频"; - -"assets.toolbar.item-selected" = "选择了%ld项"; -"assets.toolbar.items-selected" = "选择了%ld项"; - -"permission.help" = "您已授予有限数量的选定照片和视频的权限。"; -"permission.manage" = "管理"; -"permission.title" = "要访问您在应用程序中的所有照片,请在设备设置中授予访问您的完整图库的权限。"; -"permission.choose_more" = "选择更多照片"; -"permission.change_settings" = "更改设置"; -"permission.cancel" = "取消"; diff --git a/ios/QBImagePicker/QBImagePicker/zh-Hant.lproj/QBImagePicker.strings b/ios/QBImagePicker/QBImagePicker/zh-Hant.lproj/QBImagePicker.strings deleted file mode 100644 index ad172166f88d33fc055cd5be25bb10775171c22f..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePicker/zh-Hant.lproj/QBImagePicker.strings +++ /dev/null @@ -1,28 +0,0 @@ -/* - QBImagePicker.strings - QBImagePicker - - Created by Seungyeob Song on 2020/11/10. - Copyright (c) 2020 Seungyeob Song. All rights reserved. -*/ - -"albums.title" = "照片"; - -"assets.footer.photo" = "共%ld張照片"; -"assets.footer.photos" = "共%ld張照片"; -"assets.footer.video" = "共%ld個視頻"; -"assets.footer.videos" = "共%ld個視頻"; -"assets.footer.photo-and-video" = "共%ld 張照片, %ld 個視頻"; -"assets.footer.photos-and-video" = "共%ld 張照片, %ld 個視頻"; -"assets.footer.photo-and-videos" = "共%ld 張照片, %ld 個視頻"; -"assets.footer.photos-and-videos" = "共%ld 張照片, %ld 個視頻"; - -"assets.toolbar.item-selected" = "選擇了%ld項"; -"assets.toolbar.items-selected" = "選擇了%ld項"; - -"permission.help" = "您已授予有限數量的選定照片和視頻的權限。"; -"permission.manage" = "管理"; -"permission.title" = "要訪問您在應用程序中的所有照片,請在設備設置中授予訪問您的完整圖庫的權限。"; -"permission.choose_more" = "選擇更多照片"; -"permission.change_settings" = "更改設置"; -"permission.cancel" = "取消"; diff --git a/ios/QBImagePicker/QBImagePickerController.podspec b/ios/QBImagePicker/QBImagePickerController.podspec deleted file mode 100644 index d3e284411534d8235500a21b7ddf4a310b640754..0000000000000000000000000000000000000000 --- a/ios/QBImagePicker/QBImagePickerController.podspec +++ /dev/null @@ -1,16 +0,0 @@ -Pod::Spec.new do |s| - s.name = "QBImagePickerController" - s.version = "3.4.0" - s.summary = "A clone of UIImagePickerController with multiple selection support." - s.homepage = "https://github.com/questbeat/QBImagePicker" - s.license = "MIT" - s.author = { "questbeat" => "questbeat@gmail.com" } - s.source = { :git => "https://github.com/questbeat/QBImagePicker.git", :tag => s.version.to_s } - s.social_media_url = "https://twitter.com/questbeat" - s.source_files = "QBImagePicker/*.{h,m}" - s.exclude_files = "QBImagePicker/QBImagePicker.h" - s.resource_bundles = { "QBImagePicker" => "QBImagePicker/*.{lproj,storyboard}" } - s.platform = :ios, "8.0" - s.requires_arc = true - s.frameworks = "Photos" -end diff --git a/ios/imageCropPicker.xcodeproj/project.pbxproj b/ios/imageCropPicker.xcodeproj/project.pbxproj deleted file mode 100644 index 81be6da6f2cee8984adf9215082db1081d324e84..0000000000000000000000000000000000000000 --- a/ios/imageCropPicker.xcodeproj/project.pbxproj +++ /dev/null @@ -1,343 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3400A8161CEB54F3008A0BC7 /* ImageCropPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400A8151CEB54F3008A0BC7 /* ImageCropPicker.m */; }; - 3408F5F11E0DE76F00E97159 /* Compression.m in Sources */ = {isa = PBXBuildFile; fileRef = 3408F5F01E0DE76F00E97159 /* Compression.m */; }; - 34963AB11D6B96A800F9CA2F /* UIImage+Resize.m in Sources */ = {isa = PBXBuildFile; fileRef = 34963A941D6B919800F9CA2F /* UIImage+Resize.m */; }; - 34EC4AB51D78FEC6001E9E86 /* QBImagePicker.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 34434E2E1D6F5EA300BF5063 /* QBImagePicker.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 34434E2D1D6F5EA300BF5063 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 34434E261D6F5EA300BF5063 /* QBImagePicker.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = AAA8FE031ACDA079002A9710; - remoteInfo = QBImagePicker; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 3400A8081CEB54A6008A0BC7 /* libimageCropPicker.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libimageCropPicker.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 3400A8141CEB54F3008A0BC7 /* ImageCropPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageCropPicker.h; sourceTree = ""; }; - 3400A8151CEB54F3008A0BC7 /* ImageCropPicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageCropPicker.m; sourceTree = ""; }; - 3408F5EF1E0DE76F00E97159 /* Compression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Compression.h; sourceTree = ""; }; - 3408F5F01E0DE76F00E97159 /* Compression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Compression.m; sourceTree = ""; }; - 34434E261D6F5EA300BF5063 /* QBImagePicker.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = QBImagePicker.xcodeproj; path = QBImagePicker/QBImagePicker.xcodeproj; sourceTree = ""; }; - 347ACA051E4B2B2F0068D500 /* libRCTImage.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libRCTImage.a; path = "../../../../Library/Developer/Xcode/DerivedData/example-grvsvunjwoajzcfynrlckgmefufr/Build/Products/Debug-iphonesimulator/libRCTImage.a"; sourceTree = ""; }; - 34963A931D6B919800F9CA2F /* UIImage+Resize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Resize.h"; sourceTree = ""; }; - 34963A941D6B919800F9CA2F /* UIImage+Resize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Resize.m"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 3400A8051CEB54A6008A0BC7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 34EC4AB51D78FEC6001E9E86 /* QBImagePicker.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3400A7FF1CEB54A6008A0BC7 = { - isa = PBXGroup; - children = ( - 34ECC8E3204DEEA90053BBC0 /* src */, - 34434E251D6F5E5600BF5063 /* Libraries */, - 3400A8091CEB54A6008A0BC7 /* Products */, - 347ACA041E4B2B2F0068D500 /* Frameworks */, - ); - sourceTree = ""; - }; - 3400A8091CEB54A6008A0BC7 /* Products */ = { - isa = PBXGroup; - children = ( - 3400A8081CEB54A6008A0BC7 /* libimageCropPicker.a */, - ); - name = Products; - sourceTree = ""; - }; - 34434E251D6F5E5600BF5063 /* Libraries */ = { - isa = PBXGroup; - children = ( - 34434E261D6F5EA300BF5063 /* QBImagePicker.xcodeproj */, - ); - name = Libraries; - sourceTree = ""; - }; - 34434E271D6F5EA300BF5063 /* Products */ = { - isa = PBXGroup; - children = ( - 34434E2E1D6F5EA300BF5063 /* QBImagePicker.framework */, - ); - name = Products; - sourceTree = ""; - }; - 347ACA041E4B2B2F0068D500 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 347ACA051E4B2B2F0068D500 /* libRCTImage.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 34ECC8E3204DEEA90053BBC0 /* src */ = { - isa = PBXGroup; - children = ( - 3408F5EF1E0DE76F00E97159 /* Compression.h */, - 3408F5F01E0DE76F00E97159 /* Compression.m */, - 3400A8141CEB54F3008A0BC7 /* ImageCropPicker.h */, - 3400A8151CEB54F3008A0BC7 /* ImageCropPicker.m */, - 34963A931D6B919800F9CA2F /* UIImage+Resize.h */, - 34963A941D6B919800F9CA2F /* UIImage+Resize.m */, - ); - path = src; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 3400A8071CEB54A6008A0BC7 /* imageCropPicker */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3400A8111CEB54A6008A0BC7 /* Build configuration list for PBXNativeTarget "imageCropPicker" */; - buildPhases = ( - 3400A8041CEB54A6008A0BC7 /* Sources */, - 3400A8051CEB54A6008A0BC7 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = imageCropPicker; - productName = picker; - productReference = 3400A8081CEB54A6008A0BC7 /* libimageCropPicker.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 3400A8001CEB54A6008A0BC7 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0730; - ORGANIZATIONNAME = "Ivan Pusic"; - TargetAttributes = { - 3400A8071CEB54A6008A0BC7 = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 3400A8031CEB54A6008A0BC7 /* Build configuration list for PBXProject "imageCropPicker" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - English, - en, - de, - es, - fr, - ja, - pl, - "zh-Hans", - nb, - vi, - da, - fi, - ); - mainGroup = 3400A7FF1CEB54A6008A0BC7; - productRefGroup = 3400A8091CEB54A6008A0BC7 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 34434E271D6F5EA300BF5063 /* Products */; - ProjectRef = 34434E261D6F5EA300BF5063 /* QBImagePicker.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 3400A8071CEB54A6008A0BC7 /* imageCropPicker */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 34434E2E1D6F5EA300BF5063 /* QBImagePicker.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = QBImagePicker.framework; - remoteRef = 34434E2D1D6F5EA300BF5063 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXSourcesBuildPhase section */ - 3400A8041CEB54A6008A0BC7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3408F5F11E0DE76F00E97159 /* Compression.m in Sources */, - 34963AB11D6B96A800F9CA2F /* UIImage+Resize.m in Sources */, - 3400A8161CEB54F3008A0BC7 /* ImageCropPicker.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 3400A80F1CEB54A6008A0BC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 3400A8101CEB54A6008A0BC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 3400A8121CEB54A6008A0BC7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - EMBEDDED_CONTENT_CONTAINS_SWIFT = NO; - FRAMEWORK_SEARCH_PATHS = ""; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../../react-native/React/**", - "$(SRCROOT)/../../react-native/Libraries/Image/**", - ); - LD_RUNPATH_SEARCH_PATHS = ""; - ONLY_ACTIVE_ARCH = NO; - OTHER_LDFLAGS = ( - "-ObjC", - "$(inherited)", - ); - PRODUCT_NAME = imageCropPicker; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - 3400A8131CEB54A6008A0BC7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - EMBEDDED_CONTENT_CONTAINS_SWIFT = NO; - FRAMEWORK_SEARCH_PATHS = ""; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../../react-native/React/**", - "$(SRCROOT)/../../react-native/Libraries/Image/**", - ); - LD_RUNPATH_SEARCH_PATHS = ""; - OTHER_LDFLAGS = ( - "-ObjC", - "$(inherited)", - ); - PRODUCT_NAME = imageCropPicker; - SKIP_INSTALL = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 3400A8031CEB54A6008A0BC7 /* Build configuration list for PBXProject "imageCropPicker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3400A80F1CEB54A6008A0BC7 /* Debug */, - 3400A8101CEB54A6008A0BC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3400A8111CEB54A6008A0BC7 /* Build configuration list for PBXNativeTarget "imageCropPicker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3400A8121CEB54A6008A0BC7 /* Debug */, - 3400A8131CEB54A6008A0BC7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 3400A8001CEB54A6008A0BC7 /* Project object */; -} diff --git a/ios/src/Compression.h b/ios/src/Compression.h deleted file mode 100644 index 4825b4873ef9f74d3970655c9d7372d4d509773c..0000000000000000000000000000000000000000 --- a/ios/src/Compression.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Compression.h -// imageCropPicker -// -// Created by Ivan Pusic on 12/24/16. -// Copyright © 2016 Ivan Pusic. All rights reserved. -// - -#import -#import -#import - -@interface ImageResult : NSObject - -@property NSData *data; -@property NSNumber *width; -@property NSNumber *height; -@property NSString *mime; -@property UIImage *image; - -@end - -@interface VideoResult : NSObject - -@end - -@interface Compression : NSObject - -- (ImageResult*) compressImage:(UIImage*)image withOptions:(NSDictionary*)options; -- (void)compressVideo:(NSURL*)inputURL - outputURL:(NSURL*)outputURL - withOptions:(NSDictionary*)options - handler:(void (^)(AVAssetExportSession*))handler; - -@property NSDictionary *exportPresets; - -@end diff --git a/ios/src/Compression.m b/ios/src/Compression.m deleted file mode 100644 index b9d1396a67213e2bd83aa92bc18ae0fcc305e2a2..0000000000000000000000000000000000000000 --- a/ios/src/Compression.m +++ /dev/null @@ -1,132 +0,0 @@ -// -// Compression.m -// imageCropPicker -// -// Created by Ivan Pusic on 12/24/16. -// Copyright © 2016 Ivan Pusic. All rights reserved. -// - -#import "Compression.h" - -@implementation Compression - -- (instancetype)init { - NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:@{ - @"640x480": AVAssetExportPreset640x480, - @"960x540": AVAssetExportPreset960x540, - @"1280x720": AVAssetExportPreset1280x720, - @"1920x1080": AVAssetExportPreset1920x1080, - @"LowQuality": AVAssetExportPresetLowQuality, - @"MediumQuality": AVAssetExportPresetMediumQuality, - @"HighestQuality": AVAssetExportPresetHighestQuality, - @"Passthrough": AVAssetExportPresetPassthrough, - }]; - - if (@available(iOS 9.0, *)) { - [dic addEntriesFromDictionary:@{@"3840x2160": AVAssetExportPreset3840x2160}]; - } else { - // Fallback on earlier versions - } - - self.exportPresets = dic; - - return self; -} - -- (ImageResult*) compressImageDimensions:(UIImage*)image - compressImageMaxWidth:(CGFloat)maxWidth - compressImageMaxHeight:(CGFloat)maxHeight - intoResult:(ImageResult*)result { - - CGFloat oldWidth = image.size.width; - CGFloat oldHeight = image.size.height; - - int newWidth = 0; - int newHeight = 0; - - if (maxWidth < maxHeight) { - newWidth = maxWidth; - newHeight = (oldHeight / oldWidth) * newWidth; - } else { - newHeight = maxHeight; - newWidth = (oldWidth / oldHeight) * newHeight; - } - CGSize newSize = CGSizeMake(newWidth, newHeight); - - UIGraphicsBeginImageContext(newSize); - [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; - UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - result.width = [NSNumber numberWithFloat:newWidth]; - result.height = [NSNumber numberWithFloat:newHeight]; - result.image = resizedImage; - return result; -} - -- (ImageResult*) compressImage:(UIImage*)image - withOptions:(NSDictionary*)options { - - ImageResult *result = [[ImageResult alloc] init]; - result.width = @(image.size.width); - result.height = @(image.size.height); - result.image = image; - result.mime = @"image/jpeg"; - - NSNumber *compressImageMaxWidth = [options valueForKey:@"compressImageMaxWidth"]; - NSNumber *compressImageMaxHeight = [options valueForKey:@"compressImageMaxHeight"]; - - // determine if it is necessary to resize image - BOOL shouldResizeWidth = (compressImageMaxWidth != nil && [compressImageMaxWidth floatValue] < image.size.width); - BOOL shouldResizeHeight = (compressImageMaxHeight != nil && [compressImageMaxHeight floatValue] < image.size.height); - - if (shouldResizeWidth || shouldResizeHeight) { - CGFloat maxWidth = compressImageMaxWidth != nil ? [compressImageMaxWidth floatValue] : image.size.width; - CGFloat maxHeight = compressImageMaxHeight != nil ? [compressImageMaxHeight floatValue] : image.size.height; - - [self compressImageDimensions:image - compressImageMaxWidth:maxWidth - compressImageMaxHeight:maxHeight - intoResult:result]; - } - - // parse desired image quality - NSNumber *compressQuality = [options valueForKey:@"compressImageQuality"]; - if (compressQuality == nil) { - compressQuality = [NSNumber numberWithFloat:0.8]; - } - - // convert image to jpeg representation - result.data = UIImageJPEGRepresentation(result.image, [compressQuality floatValue]); - - return result; -} - -- (void)compressVideo:(NSURL*)inputURL - outputURL:(NSURL*)outputURL - withOptions:(NSDictionary*)options - handler:(void (^)(AVAssetExportSession*))handler { - - NSString *presetKey = [options valueForKey:@"compressVideoPreset"]; - if (presetKey == nil) { - presetKey = @"MediumQuality"; - } - - NSString *preset = [self.exportPresets valueForKey:presetKey]; - if (preset == nil) { - preset = AVAssetExportPresetMediumQuality; - } - - [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil]; - AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil]; - AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:preset]; - exportSession.shouldOptimizeForNetworkUse = YES; - exportSession.outputURL = outputURL; - exportSession.outputFileType = AVFileTypeMPEG4; - - [exportSession exportAsynchronouslyWithCompletionHandler:^(void) { - handler(exportSession); - }]; -} - -@end diff --git a/ios/src/ImageCropPicker.h b/ios/src/ImageCropPicker.h deleted file mode 100644 index daa298629011214b857c64c92c6812296dbbfe2e..0000000000000000000000000000000000000000 --- a/ios/src/ImageCropPicker.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// ImageManager.h -// -// Created by Ivan Pusic on 5/4/16. -// Copyright © 2016 Facebook. All rights reserved. -// - -#ifndef RN_IMAGE_CROP_PICKER_h -#define RN_IMAGE_CROP_PICKER_h - -#import - -#if __has_include() -#import -#import -#import -#import -#import -#else -#import "RCTBridgeModule.h" -#import "RCTImageURLLoader.h" -#import "RCTImageShadowView.h" -#import "RCTImageView.h" -#import "RCTImageLoaderProtocol.h" -#endif - -#if __has_include("QBImagePicker.h") -#import "QBImagePicker.h" -#elif __has_include() -#import -#elif __has_include("QBImagePickerController.h") // local QBImagePickerController subspec -#import "QBImagePickerController.h" -#else -#import -#import "QBImagePicker/QBImagePicker.h" -#endif - - -#import - -#import "UIImage+Resize.h" -#import "UIImage+Extension.h" -#import "Compression.h" -#import - -@interface ImageCropPicker : NSObject< -UIImagePickerControllerDelegate, -UINavigationControllerDelegate, -RCTBridgeModule, -QBImagePickerControllerDelegate, -TOCropViewControllerDelegate> - -typedef enum selectionMode { - CAMERA, - CROPPING, - PICKER -} SelectionMode; - -@property (nonatomic, strong) NSMutableDictionary *croppingFile; -@property (nonatomic, strong) NSDictionary *defaultOptions; -@property (nonatomic, strong) Compression *compression; -@property (nonatomic, retain) NSMutableDictionary *options; -@property (nonatomic, strong) RCTPromiseResolveBlock resolve; -@property (nonatomic, strong) RCTPromiseRejectBlock reject; -@property SelectionMode currentSelectionMode; - -@end - -#endif diff --git a/ios/src/ImageCropPicker.m b/ios/src/ImageCropPicker.m deleted file mode 100644 index 9f20973f1d641a8c3b96e825c1a4888eb80b55f9..0000000000000000000000000000000000000000 --- a/ios/src/ImageCropPicker.m +++ /dev/null @@ -1,935 +0,0 @@ -// -// ImageManager.m -// -// Created by Ivan Pusic on 5/4/16. -// Copyright © 2016 Facebook. All rights reserved. -// - -#import - -#import "ImageCropPicker.h" - -#define ERROR_PICKER_CANNOT_RUN_CAMERA_ON_SIMULATOR_KEY @"E_PICKER_CANNOT_RUN_CAMERA_ON_SIMULATOR" -#define ERROR_PICKER_CANNOT_RUN_CAMERA_ON_SIMULATOR_MSG @"Cannot run camera on simulator" - -#define ERROR_NO_CAMERA_PERMISSION_KEY @"E_NO_CAMERA_PERMISSION" -#define ERROR_NO_CAMERA_PERMISSION_MSG @"User did not grant camera permission." - -#define ERROR_NO_LIBRARY_PERMISSION_KEY @"E_NO_LIBRARY_PERMISSION" -#define ERROR_NO_LIBRARY_PERMISSION_MSG @"User did not grant library permission." - -#define ERROR_PICKER_CANCEL_KEY @"E_PICKER_CANCELLED" -#define ERROR_PICKER_CANCEL_MSG @"User cancelled image selection" - -#define ERROR_PICKER_NO_DATA_KEY @"E_NO_IMAGE_DATA_FOUND" -#define ERROR_PICKER_NO_DATA_MSG @"Cannot find image data" - -#define ERROR_CROPPER_IMAGE_NOT_FOUND_KEY @"E_CROPPER_IMAGE_NOT_FOUND" -#define ERROR_CROPPER_IMAGE_NOT_FOUND_MSG @"Can't find the image at the specified path" - -#define ERROR_CLEANUP_ERROR_KEY @"E_ERROR_WHILE_CLEANING_FILES" -#define ERROR_CLEANUP_ERROR_MSG @"Error while cleaning up tmp files" - -#define ERROR_CANNOT_SAVE_IMAGE_KEY @"E_CANNOT_SAVE_IMAGE" -#define ERROR_CANNOT_SAVE_IMAGE_MSG @"Cannot save image. Unable to write to tmp location." - -#define ERROR_CANNOT_PROCESS_VIDEO_KEY @"E_CANNOT_PROCESS_VIDEO" -#define ERROR_CANNOT_PROCESS_VIDEO_MSG @"Cannot process video data" - -@implementation ImageResult -@end - -@implementation ImageCropPicker - -RCT_EXPORT_MODULE(); - -@synthesize bridge = _bridge; - -- (instancetype)init -{ - if (self = [super init]) { - self.defaultOptions = @{ - @"multiple": @NO, - @"cropping": @NO, - @"cropperCircleOverlay": @NO, - @"writeTempFile": @YES, - @"includeBase64": @NO, - @"includeExif": @NO, - @"compressVideo": @YES, - @"minFiles": @1, - @"maxFiles": @5, - @"width": @200, - @"waitAnimationEnd": @YES, - @"height": @200, - @"useFrontCamera": @NO, - @"avoidEmptySpaceAroundImage": @YES, - @"compressImageQuality": @0.8, - @"compressVideoPreset": @"MediumQuality", - @"loadingLabelText": @"Processing assets...", - @"mediaType": @"any", - @"showsSelectedCount": @YES, - @"forceJpg": @NO, - @"sortOrder": @"none", - @"cropperCancelText": @"Cancel", - @"cropperChooseText": @"Choose", - @"cropperRotateButtonsHidden": @NO - }; - self.compression = [[Compression alloc] init]; - } - - return self; -} - -+ (BOOL)requiresMainQueueSetup { - return YES; -} - -- (void (^ __nullable)(void))waitAnimationEnd:(void (^ __nullable)(void))completion { - if ([[self.options objectForKey:@"waitAnimationEnd"] boolValue]) { - return completion; - } - - if (completion != nil) { - completion(); - } - - return nil; -} - -- (void)checkCameraPermissions:(void(^)(BOOL granted))callback -{ - AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; - if (status == AVAuthorizationStatusAuthorized) { - callback(YES); - return; - } else if (status == AVAuthorizationStatusNotDetermined){ - [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { - callback(granted); - return; - }]; - } else { - callback(NO); - } -} - -- (void) setConfiguration:(NSDictionary *)options - resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject { - - self.resolve = resolve; - self.reject = reject; - self.options = [NSMutableDictionary dictionaryWithDictionary:self.defaultOptions]; - for (NSString *key in options.keyEnumerator) { - [self.options setValue:options[key] forKey:key]; - } -} - -- (UIViewController*) getRootVC { - UIViewController *root = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; - while (root.presentedViewController != nil) { - root = root.presentedViewController; - } - - return root; -} - -RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options - resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject) { - - [self setConfiguration:options resolver:resolve rejecter:reject]; - self.currentSelectionMode = CAMERA; - -#if TARGET_IPHONE_SIMULATOR - self.reject(ERROR_PICKER_CANNOT_RUN_CAMERA_ON_SIMULATOR_KEY, ERROR_PICKER_CANNOT_RUN_CAMERA_ON_SIMULATOR_MSG, nil); - return; -#else - [self checkCameraPermissions:^(BOOL granted) { - if (!granted) { - self.reject(ERROR_NO_CAMERA_PERMISSION_KEY, ERROR_NO_CAMERA_PERMISSION_MSG, nil); - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - - UIImagePickerController *picker = [[UIImagePickerController alloc] init]; - picker.delegate = self; - picker.allowsEditing = NO; - picker.sourceType = UIImagePickerControllerSourceTypeCamera; - - NSString *mediaType = [self.options objectForKey:@"mediaType"]; - - if ([mediaType isEqualToString:@"video"]) { - NSArray *availableTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; - - if ([availableTypes containsObject:(NSString *)kUTTypeMovie]) { - picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeMovie, nil]; - picker.videoQuality = UIImagePickerControllerQualityTypeHigh; - } - } - - if ([[self.options objectForKey:@"useFrontCamera"] boolValue]) { - picker.cameraDevice = UIImagePickerControllerCameraDeviceFront; - } - - [[self getRootVC] presentViewController:picker animated:YES completion:nil]; - }); - }]; -#endif -} - -- (void)viewDidLoad { - [self viewDidLoad]; -} - -- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; - - if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) { - NSURL *url = [info objectForKey:UIImagePickerControllerMediaURL]; - AVURLAsset *asset = [AVURLAsset assetWithURL:url]; - NSString *fileName = [[asset.URL path] lastPathComponent]; - - [self handleVideo:asset - withFileName:fileName - withLocalIdentifier:nil - completion:^(NSDictionary* video) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (video == nil) { - [picker dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_CANNOT_PROCESS_VIDEO_KEY, ERROR_CANNOT_PROCESS_VIDEO_MSG, nil); - }]]; - return; - } - - [picker dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.resolve(video); - }]]; - }); - } - ]; - } else { - UIImage *chosenImage = [info objectForKey:UIImagePickerControllerOriginalImage]; - - NSDictionary *exif; - if([[self.options objectForKey:@"includeExif"] boolValue]) { - exif = [info objectForKey:UIImagePickerControllerMediaMetadata]; - } - - [self processSingleImagePick:chosenImage withExif:exif withViewController:picker withSourceURL:self.croppingFile[@"sourceURL"] withLocalIdentifier:self.croppingFile[@"localIdentifier"] withFilename:self.croppingFile[@"filename"] withCreationDate:self.croppingFile[@"creationDate"] withModificationDate:self.croppingFile[@"modificationDate"]]; - } -} - -- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { - [picker dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_PICKER_CANCEL_KEY, ERROR_PICKER_CANCEL_MSG, nil); - }]]; -} - -- (NSString*) getTmpDirectory { - NSString *TMP_DIRECTORY = @"react-native-image-crop-picker/"; - NSString *tmpFullPath = [NSTemporaryDirectory() stringByAppendingString:TMP_DIRECTORY]; - - BOOL isDir; - BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:tmpFullPath isDirectory:&isDir]; - if (!exists) { - [[NSFileManager defaultManager] createDirectoryAtPath: tmpFullPath - withIntermediateDirectories:YES attributes:nil error:nil]; - } - - return tmpFullPath; -} - -- (BOOL)cleanTmpDirectory { - NSString* tmpDirectoryPath = [self getTmpDirectory]; - NSArray* tmpDirectory = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tmpDirectoryPath error:NULL]; - - for (NSString *file in tmpDirectory) { - BOOL deleted = [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@%@", tmpDirectoryPath, file] error:NULL]; - - if (!deleted) { - return NO; - } - } - - return YES; -} - -RCT_EXPORT_METHOD(cleanSingle:(NSString *) path - resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject) { - - BOOL deleted = [[NSFileManager defaultManager] removeItemAtPath:path error:NULL]; - - if (!deleted) { - reject(ERROR_CLEANUP_ERROR_KEY, ERROR_CLEANUP_ERROR_MSG, nil); - } else { - resolve(nil); - } -} - -RCT_REMAP_METHOD(clean, resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject) { - if (![self cleanTmpDirectory]) { - reject(ERROR_CLEANUP_ERROR_KEY, ERROR_CLEANUP_ERROR_MSG, nil); - } else { - resolve(nil); - } -} - -RCT_EXPORT_METHOD(openPicker:(NSDictionary *)options - resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject) { - - [self setConfiguration:options resolver:resolve rejecter:reject]; - self.currentSelectionMode = PICKER; - - [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { - if (status != PHAuthorizationStatusAuthorized) { - self.reject(ERROR_NO_LIBRARY_PERMISSION_KEY, ERROR_NO_LIBRARY_PERMISSION_MSG, nil); - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - // init picker - QBImagePickerController *imagePickerController = - [QBImagePickerController new]; - imagePickerController.delegate = self; - imagePickerController.allowsMultipleSelection = [[self.options objectForKey:@"multiple"] boolValue]; - imagePickerController.minimumNumberOfSelection = abs([[self.options objectForKey:@"minFiles"] intValue]); - imagePickerController.maximumNumberOfSelection = abs([[self.options objectForKey:@"maxFiles"] intValue]); - imagePickerController.showsNumberOfSelectedAssets = [[self.options objectForKey:@"showsSelectedCount"] boolValue]; - imagePickerController.sortOrder = [self.options objectForKey:@"sortOrder"]; - - NSArray *smartAlbums = [self.options objectForKey:@"smartAlbums"]; - if (smartAlbums != nil) { - NSDictionary *albums = @{ - //user albums - @"Regular" : @(PHAssetCollectionSubtypeAlbumRegular), - @"SyncedEvent" : @(PHAssetCollectionSubtypeAlbumSyncedEvent), - @"SyncedFaces" : @(PHAssetCollectionSubtypeAlbumSyncedFaces), - @"SyncedAlbum" : @(PHAssetCollectionSubtypeAlbumSyncedAlbum), - @"Imported" : @(PHAssetCollectionSubtypeAlbumImported), - - //cloud albums - @"PhotoStream" : @(PHAssetCollectionSubtypeAlbumMyPhotoStream), - @"CloudShared" : @(PHAssetCollectionSubtypeAlbumCloudShared), - - //smart albums - @"Generic" : @(PHAssetCollectionSubtypeSmartAlbumGeneric), - @"Panoramas" : @(PHAssetCollectionSubtypeSmartAlbumPanoramas), - @"Videos" : @(PHAssetCollectionSubtypeSmartAlbumVideos), - @"Favorites" : @(PHAssetCollectionSubtypeSmartAlbumFavorites), - @"Timelapses" : @(PHAssetCollectionSubtypeSmartAlbumTimelapses), - @"AllHidden" : @(PHAssetCollectionSubtypeSmartAlbumAllHidden), - @"RecentlyAdded" : @(PHAssetCollectionSubtypeSmartAlbumRecentlyAdded), - @"Bursts" : @(PHAssetCollectionSubtypeSmartAlbumBursts), - @"SlomoVideos" : @(PHAssetCollectionSubtypeSmartAlbumSlomoVideos), - @"UserLibrary" : @(PHAssetCollectionSubtypeSmartAlbumUserLibrary), - @"SelfPortraits" : @(PHAssetCollectionSubtypeSmartAlbumSelfPortraits), - @"Screenshots" : @(PHAssetCollectionSubtypeSmartAlbumScreenshots), - @"DepthEffect" : @(PHAssetCollectionSubtypeSmartAlbumDepthEffect), - @"LivePhotos" : @(PHAssetCollectionSubtypeSmartAlbumLivePhotos), - @"Animated" : @(PHAssetCollectionSubtypeSmartAlbumAnimated), - @"LongExposure" : @(PHAssetCollectionSubtypeSmartAlbumLongExposures), - }; - - NSMutableArray *albumsToShow = [NSMutableArray arrayWithCapacity:smartAlbums.count]; - for (NSString* smartAlbum in smartAlbums) { - if ([albums objectForKey:smartAlbum] != nil) { - [albumsToShow addObject:[albums objectForKey:smartAlbum]]; - } - } - imagePickerController.assetCollectionSubtypes = albumsToShow; - } - - if ([[self.options objectForKey:@"cropping"] boolValue]) { - imagePickerController.mediaType = QBImagePickerMediaTypeImage; - } else { - NSString *mediaType = [self.options objectForKey:@"mediaType"]; - - if ([mediaType isEqualToString:@"photo"]) { - imagePickerController.mediaType = QBImagePickerMediaTypeImage; - } else if ([mediaType isEqualToString:@"video"]) { - imagePickerController.mediaType = QBImagePickerMediaTypeVideo; - } else { - imagePickerController.mediaType = QBImagePickerMediaTypeAny; - } - } - - [imagePickerController setModalPresentationStyle: UIModalPresentationFullScreen]; - [[self getRootVC] presentViewController:imagePickerController animated:YES completion:nil]; - }); - }]; -} - -RCT_EXPORT_METHOD(openCropper:(NSDictionary *)options - resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject) { - - [self setConfiguration:options resolver:resolve rejecter:reject]; - self.currentSelectionMode = CROPPING; - - NSString *path = [options objectForKey:@"path"]; - - [[self.bridge moduleForName:@"ImageLoader" lazilyLoadIfNecessary:YES] loadImageWithURLRequest:[RCTConvert NSURLRequest:path] callback:^(NSError *error, UIImage *image) { - if (error) { - self.reject(ERROR_CROPPER_IMAGE_NOT_FOUND_KEY, ERROR_CROPPER_IMAGE_NOT_FOUND_MSG, nil); - } else { - [self cropImage:[image fixOrientation]]; - } - }]; -} - -- (void)showActivityIndicator:(void (^)(UIActivityIndicatorView*, UIView*))handler { - dispatch_async(dispatch_get_main_queue(), ^{ - UIView *mainView = [[self getRootVC] view]; - - // create overlay - UIView *loadingView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; - loadingView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; - loadingView.clipsToBounds = YES; - - // create loading spinner - UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; - activityView.frame = CGRectMake(65, 40, activityView.bounds.size.width, activityView.bounds.size.height); - activityView.center = loadingView.center; - [loadingView addSubview:activityView]; - - // create message - UILabel *loadingLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 115, 130, 22)]; - loadingLabel.backgroundColor = [UIColor clearColor]; - loadingLabel.textColor = [UIColor whiteColor]; - loadingLabel.adjustsFontSizeToFitWidth = YES; - CGPoint loadingLabelLocation = loadingView.center; - loadingLabelLocation.y += [activityView bounds].size.height; - loadingLabel.center = loadingLabelLocation; - loadingLabel.textAlignment = NSTextAlignmentCenter; - loadingLabel.text = [self.options objectForKey:@"loadingLabelText"]; - [loadingLabel setFont:[UIFont boldSystemFontOfSize:18]]; - [loadingView addSubview:loadingLabel]; - - // show all - [mainView addSubview:loadingView]; - [activityView startAnimating]; - - handler(activityView, loadingView); - }); -} - -- (void) handleVideo:(AVAsset*)asset withFileName:(NSString*)fileName withLocalIdentifier:(NSString*)localIdentifier completion:(void (^)(NSDictionary* image))completion { - NSURL *sourceURL = [(AVURLAsset *)asset URL]; - - // create temp file - NSString *tmpDirFullPath = [self getTmpDirectory]; - NSString *filePath = [tmpDirFullPath stringByAppendingString:[[NSUUID UUID] UUIDString]]; - filePath = [filePath stringByAppendingString:@".mp4"]; - NSURL *outputURL = [NSURL fileURLWithPath:filePath]; - - [self.compression compressVideo:sourceURL outputURL:outputURL withOptions:self.options handler:^(AVAssetExportSession *exportSession) { - if (exportSession.status == AVAssetExportSessionStatusCompleted) { - AVAsset *compressedAsset = [AVAsset assetWithURL:outputURL]; - AVAssetTrack *track = [[compressedAsset tracksWithMediaType:AVMediaTypeVideo] firstObject]; - - NSNumber *fileSizeValue = nil; - [outputURL getResourceValue:&fileSizeValue - forKey:NSURLFileSizeKey - error:nil]; - - AVURLAsset *durationFromUrl = [AVURLAsset assetWithURL:outputURL]; - CMTime time = [durationFromUrl duration]; - int milliseconds = ceil(time.value/time.timescale) * 1000; - - completion([self createAttachmentResponse:[outputURL absoluteString] - withExif:nil - withSourceURL:[sourceURL absoluteString] - withLocalIdentifier:localIdentifier - withFilename:fileName - withWidth:[NSNumber numberWithFloat:track.naturalSize.width] - withHeight:[NSNumber numberWithFloat:track.naturalSize.height] - withMime:@"video/mp4" - withSize:fileSizeValue - withDuration:[NSNumber numberWithFloat:milliseconds] - withData:nil - withRect:CGRectNull - withCreationDate:nil - withModificationDate:nil - ]); - } else { - completion(nil); - } - }]; -} - -- (void) getVideoAsset:(PHAsset*)forAsset completion:(void (^)(NSDictionary* image))completion { - PHImageManager *manager = [PHImageManager defaultManager]; - PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init]; - options.version = PHVideoRequestOptionsVersionOriginal; - options.networkAccessAllowed = YES; - options.deliveryMode = PHVideoRequestOptionsDeliveryModeHighQualityFormat; - - [manager - requestAVAssetForVideo:forAsset - options:options - resultHandler:^(AVAsset * asset, AVAudioMix * audioMix, - NSDictionary *info) { - [self handleVideo:asset - withFileName:[forAsset valueForKey:@"filename"] - withLocalIdentifier:forAsset.localIdentifier - completion:completion - ]; - }]; -} - -- (NSDictionary*) createAttachmentResponse:(NSString*)filePath withExif:(NSDictionary*) exif withSourceURL:(NSString*)sourceURL withLocalIdentifier:(NSString*)localIdentifier withFilename:(NSString*)filename withWidth:(NSNumber*)width withHeight:(NSNumber*)height withMime:(NSString*)mime withSize:(NSNumber*)size withDuration:(NSNumber*)duration withData:(NSString*)data withRect:(CGRect)cropRect withCreationDate:(NSDate*)creationDate withModificationDate:(NSDate*)modificationDate { - return @{ - @"path": (filePath && ![filePath isEqualToString:(@"")]) ? filePath : [NSNull null], - @"sourceURL": (sourceURL) ? sourceURL : [NSNull null], - @"localIdentifier": (localIdentifier) ? localIdentifier : [NSNull null], - @"filename": (filename) ? filename : [NSNull null], - @"width": width, - @"height": height, - @"mime": mime, - @"size": size, - @"data": (data) ? data : [NSNull null], - @"exif": (exif) ? exif : [NSNull null], - @"cropRect": CGRectIsNull(cropRect) ? [NSNull null] : [ImageCropPicker cgRectToDictionary:cropRect], - @"creationDate": (creationDate) ? [NSString stringWithFormat:@"%.0f", [creationDate timeIntervalSince1970]] : [NSNull null], - @"modificationDate": (modificationDate) ? [NSString stringWithFormat:@"%.0f", [modificationDate timeIntervalSince1970]] : [NSNull null], - @"duration": (duration) ? duration : [NSNull null] - }; -} - -// See https://stackoverflow.com/questions/4147311/finding-image-type-from-nsdata-or-uiimage -- (NSString *)determineMimeTypeFromImageData:(NSData *)data { - uint8_t c; - [data getBytes:&c length:1]; - - switch (c) { - case 0xFF: - return @"image/jpeg"; - case 0x89: - return @"image/png"; - case 0x47: - return @"image/gif"; - case 0x49: - case 0x4D: - return @"image/tiff"; - case 0x00: - return @"image/heic"; - } - return @""; -} - -- (void)qb_imagePickerController: -(QBImagePickerController *)imagePickerController - didFinishPickingAssets:(NSArray *)assets { - - PHImageManager *manager = [PHImageManager defaultManager]; - PHImageRequestOptions* options = [[PHImageRequestOptions alloc] init]; - options.synchronous = NO; - options.networkAccessAllowed = YES; - - if ([[[self options] objectForKey:@"multiple"] boolValue]) { - NSMutableArray *selections = [[NSMutableArray alloc] init]; - - [self showActivityIndicator:^(UIActivityIndicatorView *indicatorView, UIView *overlayView) { - NSLock *lock = [[NSLock alloc] init]; - __block int processed = 0; - - for (PHAsset *phAsset in assets) { - - if (phAsset.mediaType == PHAssetMediaTypeVideo) { - [self getVideoAsset:phAsset completion:^(NSDictionary* video) { - dispatch_async(dispatch_get_main_queue(), ^{ - [lock lock]; - - if (video == nil) { - [indicatorView stopAnimating]; - [overlayView removeFromSuperview]; - [imagePickerController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_CANNOT_PROCESS_VIDEO_KEY, ERROR_CANNOT_PROCESS_VIDEO_MSG, nil); - }]]; - return; - } - - [selections addObject:video]; - processed++; - [lock unlock]; - - if (processed == [assets count]) { - [indicatorView stopAnimating]; - [overlayView removeFromSuperview]; - [imagePickerController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.resolve(selections); - }]]; - return; - } - }); - }]; - } else { - [phAsset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) { - [manager - requestImageDataForAsset:phAsset - options:options - resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { - - NSURL *sourceURL = contentEditingInput.fullSizeImageURL; - - dispatch_async(dispatch_get_main_queue(), ^{ - [lock lock]; - @autoreleasepool { - UIImage *imgT = [UIImage imageWithData:imageData]; - - Boolean forceJpg = [[self.options valueForKey:@"forceJpg"] boolValue]; - - NSNumber *compressQuality = [self.options valueForKey:@"compressImageQuality"]; - Boolean isLossless = (compressQuality == nil || [compressQuality floatValue] >= 0.8); - - NSNumber *maxWidth = [self.options valueForKey:@"compressImageMaxWidth"]; - Boolean useOriginalWidth = (maxWidth == nil || [maxWidth integerValue] >= imgT.size.width); - - NSNumber *maxHeight = [self.options valueForKey:@"compressImageMaxHeight"]; - Boolean useOriginalHeight = (maxHeight == nil || [maxHeight integerValue] >= imgT.size.height); - - NSString *mimeType = [self determineMimeTypeFromImageData:imageData]; - Boolean isKnownMimeType = [mimeType length] > 0; - - ImageResult *imageResult = [[ImageResult alloc] init]; - if (isLossless && useOriginalWidth && useOriginalHeight && isKnownMimeType && !forceJpg) { - // Use original, unmodified image - imageResult.data = imageData; - imageResult.width = @(imgT.size.width); - imageResult.height = @(imgT.size.height); - imageResult.mime = mimeType; - imageResult.image = imgT; - } else { - imageResult = [self.compression compressImage:[imgT fixOrientation] withOptions:self.options]; - } - - NSString *filePath = @""; - if([[self.options objectForKey:@"writeTempFile"] boolValue]) { - - filePath = [self persistFile:imageResult.data]; - - if (filePath == nil) { - [indicatorView stopAnimating]; - [overlayView removeFromSuperview]; - [imagePickerController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_CANNOT_SAVE_IMAGE_KEY, ERROR_CANNOT_SAVE_IMAGE_MSG, nil); - }]]; - return; - } - } - - NSDictionary* exif = nil; - if([[self.options objectForKey:@"includeExif"] boolValue]) { - exif = [[CIImage imageWithData:imageData] properties]; - } - - [selections addObject:[self createAttachmentResponse:filePath - withExif: exif - withSourceURL:[sourceURL absoluteString] - withLocalIdentifier: phAsset.localIdentifier - withFilename: [phAsset valueForKey:@"filename"] - withWidth:imageResult.width - withHeight:imageResult.height - withMime:imageResult.mime - withSize:[NSNumber numberWithUnsignedInteger:imageResult.data.length] - withDuration: nil - withData:[[self.options objectForKey:@"includeBase64"] boolValue] ? [imageResult.data base64EncodedStringWithOptions:0]: nil - withRect:CGRectNull - withCreationDate:phAsset.creationDate - withModificationDate:phAsset.modificationDate - ]]; - } - processed++; - [lock unlock]; - - if (processed == [assets count]) { - - [indicatorView stopAnimating]; - [overlayView removeFromSuperview]; - [imagePickerController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.resolve(selections); - }]]; - return; - } - }); - }]; - }]; - } - } - }]; - } else { - PHAsset *phAsset = [assets objectAtIndex:0]; - - [self showActivityIndicator:^(UIActivityIndicatorView *indicatorView, UIView *overlayView) { - if (phAsset.mediaType == PHAssetMediaTypeVideo) { - [self getVideoAsset:phAsset completion:^(NSDictionary* video) { - dispatch_async(dispatch_get_main_queue(), ^{ - [indicatorView stopAnimating]; - [overlayView removeFromSuperview]; - [imagePickerController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - if (video != nil) { - self.resolve(video); - } else { - self.reject(ERROR_CANNOT_PROCESS_VIDEO_KEY, ERROR_CANNOT_PROCESS_VIDEO_MSG, nil); - } - }]]; - }); - }]; - } else { - [phAsset requestContentEditingInputWithOptions:nil completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) { - [manager - requestImageDataForAsset:phAsset - options:options - resultHandler:^(NSData *imageData, NSString *dataUTI, - UIImageOrientation orientation, - NSDictionary *info) { - NSURL *sourceURL = contentEditingInput.fullSizeImageURL; - NSDictionary* exif; - if([[self.options objectForKey:@"includeExif"] boolValue]) { - exif = [[CIImage imageWithData:imageData] properties]; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [indicatorView stopAnimating]; - [overlayView removeFromSuperview]; - - [self processSingleImagePick:[UIImage imageWithData:imageData] - withExif: exif - withViewController:imagePickerController - withSourceURL:[sourceURL absoluteString] - withLocalIdentifier:phAsset.localIdentifier - withFilename:[phAsset valueForKey:@"filename"] - withCreationDate:phAsset.creationDate - withModificationDate:phAsset.modificationDate]; - }); - }]; - }]; - } - }]; - } -} - -- (void)qb_imagePickerControllerDidCancel:(QBImagePickerController *)imagePickerController { - [imagePickerController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_PICKER_CANCEL_KEY, ERROR_PICKER_CANCEL_MSG, nil); - }]]; -} - -// when user selected single image, with camera or from photo gallery, -// this method will take care of attaching image metadata, and sending image to cropping controller -// or to user directly -- (void) processSingleImagePick:(UIImage*)image withExif:(NSDictionary*) exif withViewController:(UIViewController*)viewController withSourceURL:(NSString*)sourceURL withLocalIdentifier:(NSString*)localIdentifier withFilename:(NSString*)filename withCreationDate:(NSDate*)creationDate withModificationDate:(NSDate*)modificationDate { - - if (image == nil) { - [viewController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_PICKER_NO_DATA_KEY, ERROR_PICKER_NO_DATA_MSG, nil); - }]]; - return; - } - - NSLog(@"id: %@ filename: %@", localIdentifier, filename); - - if ([[[self options] objectForKey:@"cropping"] boolValue]) { - self.croppingFile = [[NSMutableDictionary alloc] init]; - self.croppingFile[@"sourceURL"] = sourceURL; - self.croppingFile[@"localIdentifier"] = localIdentifier; - self.croppingFile[@"filename"] = filename; - self.croppingFile[@"creationDate"] = creationDate; - self.croppingFile[@"modifcationDate"] = modificationDate; - NSLog(@"CroppingFile %@", self.croppingFile); - - [self cropImage:[image fixOrientation]]; - } else { - ImageResult *imageResult = [self.compression compressImage:[image fixOrientation] withOptions:self.options]; - NSString *filePath = [self persistFile:imageResult.data]; - if (filePath == nil) { - [viewController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_CANNOT_SAVE_IMAGE_KEY, ERROR_CANNOT_SAVE_IMAGE_MSG, nil); - }]]; - return; - } - - // Wait for viewController to dismiss before resolving, or we lose the ability to display - // Alert.alert in the .then() handler. - [viewController dismissViewControllerAnimated:YES completion:[self waitAnimationEnd:^{ - self.resolve([self createAttachmentResponse:filePath - withExif:exif - withSourceURL:sourceURL - withLocalIdentifier:localIdentifier - withFilename:filename - withWidth:imageResult.width - withHeight:imageResult.height - withMime:imageResult.mime - withSize:[NSNumber numberWithUnsignedInteger:imageResult.data.length] - withDuration: nil - withData:[[self.options objectForKey:@"includeBase64"] boolValue] ? [imageResult.data base64EncodedStringWithOptions:0] : nil - withRect:CGRectNull - withCreationDate:creationDate - withModificationDate:modificationDate - ]); - }]]; - } -} - -- (void)dismissCropper:(UIViewController *)controller selectionDone:(BOOL)selectionDone completion:(void (^)(void))completion { - switch (self.currentSelectionMode) { - case CROPPING: - [controller dismissViewControllerAnimated:YES completion:completion]; - break; - case PICKER: - if (selectionDone) { - [controller.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:completion]; - } else { - // if user opened picker, tried to crop image, and cancelled cropping - // return him to the image selection instead of returning him to the app - [controller.presentingViewController dismissViewControllerAnimated:YES completion:completion]; - } - break; - case CAMERA: - [controller.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:completion]; - break; - } -} - -// The original image has been cropped. -- (void)imageCropViewController:(UIViewController *)controller - didCropImage:(UIImage *)croppedImage - usingCropRect:(CGRect)cropRect { - - // we have correct rect, but not correct dimensions - // so resize image - CGSize desiredImageSize = CGSizeMake([[[self options] objectForKey:@"width"] intValue], - [[[self options] objectForKey:@"height"] intValue]); - - UIImage *resizedImage = [croppedImage resizedImageToFitInSize:desiredImageSize scaleIfSmaller:YES]; - ImageResult *imageResult = [self.compression compressImage:resizedImage withOptions:self.options]; - - NSString *filePath = [self persistFile:imageResult.data]; - if (filePath == nil) { - [self dismissCropper:controller selectionDone:YES completion:[self waitAnimationEnd:^{ - self.reject(ERROR_CANNOT_SAVE_IMAGE_KEY, ERROR_CANNOT_SAVE_IMAGE_MSG, nil); - }]]; - return; - } - - NSDictionary* exif = nil; - if([[self.options objectForKey:@"includeExif"] boolValue]) { - exif = [[CIImage imageWithData:imageResult.data] properties]; - } - - [self dismissCropper:controller selectionDone:YES completion:[self waitAnimationEnd:^{ - self.resolve([self createAttachmentResponse:filePath - withExif: exif - withSourceURL: self.croppingFile[@"sourceURL"] - withLocalIdentifier: self.croppingFile[@"localIdentifier"] - withFilename: self.croppingFile[@"filename"] - withWidth:imageResult.width - withHeight:imageResult.height - withMime:imageResult.mime - withSize:[NSNumber numberWithUnsignedInteger:imageResult.data.length] - withDuration: nil - withData:[[self.options objectForKey:@"includeBase64"] boolValue] ? [imageResult.data base64EncodedStringWithOptions:0] : nil - withRect:cropRect - withCreationDate:self.croppingFile[@"creationDate"] - withModificationDate:self.croppingFile[@"modificationDate"] - ]); - }]]; -} - -// at the moment it is not possible to upload image by reading PHAsset -// we are saving image and saving it to the tmp location where we are allowed to access image later -- (NSString*) persistFile:(NSData*)data { - // create temp file - NSString *tmpDirFullPath = [self getTmpDirectory]; - NSString *filePath = [tmpDirFullPath stringByAppendingString:[[NSUUID UUID] UUIDString]]; - filePath = [filePath stringByAppendingString:@".jpg"]; - - // save cropped file - BOOL status = [data writeToFile:filePath atomically:YES]; - if (!status) { - return nil; - } - - return filePath; -} - -+ (NSDictionary *)cgRectToDictionary:(CGRect)rect { - return @{ - @"x": [NSNumber numberWithFloat: rect.origin.x], - @"y": [NSNumber numberWithFloat: rect.origin.y], - @"width": [NSNumber numberWithFloat: CGRectGetWidth(rect)], - @"height": [NSNumber numberWithFloat: CGRectGetHeight(rect)] - }; -} - -// Assumes input like "#00FF00" (#RRGGBB). -+ (UIColor *)colorFromHexString:(NSString *)hexString { - unsigned rgbValue = 0; - NSScanner *scanner = [NSScanner scannerWithString:hexString]; - [scanner setScanLocation:1]; // bypass '#' character - [scanner scanHexInt:&rgbValue]; - return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0]; -} - -#pragma mark - TOCCropViewController Implementation -- (void)cropImage:(UIImage *)image { - dispatch_async(dispatch_get_main_queue(), ^{ - TOCropViewController *cropVC; - if ([[[self options] objectForKey:@"cropperCircleOverlay"] boolValue]) { - cropVC = [[TOCropViewController alloc] initWithCroppingStyle:TOCropViewCroppingStyleCircular image:image]; - } else { - cropVC = [[TOCropViewController alloc] initWithImage:image]; - CGFloat widthRatio = [[self.options objectForKey:@"width"] floatValue]; - CGFloat heightRatio = [[self.options objectForKey:@"height"] floatValue]; - if (widthRatio > 0 && heightRatio > 0){ - CGSize aspectRatio = CGSizeMake(widthRatio, heightRatio); - cropVC.customAspectRatio = aspectRatio; - - } - cropVC.aspectRatioLockEnabled = ![[self.options objectForKey:@"freeStyleCropEnabled"] boolValue]; - cropVC.resetAspectRatioEnabled = !cropVC.aspectRatioLockEnabled; - } - - cropVC.title = [[self options] objectForKey:@"cropperToolbarTitle"]; - cropVC.delegate = self; - - NSString* rawDoneButtonColor = [self.options objectForKey:@"cropperChooseColor"]; - NSString* rawCancelButtonColor = [self.options objectForKey:@"cropperCancelColor"]; - - if (rawDoneButtonColor) { - cropVC.doneButtonColor = [ImageCropPicker colorFromHexString: rawDoneButtonColor]; - } - if (rawCancelButtonColor) { - cropVC.cancelButtonColor = [ImageCropPicker colorFromHexString: rawCancelButtonColor]; - } - - cropVC.doneButtonTitle = [self.options objectForKey:@"cropperChooseText"]; - cropVC.cancelButtonTitle = [self.options objectForKey:@"cropperCancelText"]; - cropVC.rotateButtonsHidden = [[self.options objectForKey:@"cropperRotateButtonsHidden"] boolValue]; - - cropVC.modalPresentationStyle = UIModalPresentationFullScreen; - if (@available(iOS 15.0, *)) { - cropVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - } - - [[self getRootVC] presentViewController:cropVC animated:FALSE completion:nil]; - }); -} -#pragma mark - TOCropViewController Delegate -- (void)cropViewController:(TOCropViewController *)cropViewController didCropToImage:(UIImage *)image withRect:(CGRect)cropRect angle:(NSInteger)angle { - [self imageCropViewController:cropViewController didCropImage:image usingCropRect:cropRect]; -} - -- (void)cropViewController:(TOCropViewController *)cropViewController didFinishCancelled:(BOOL)cancelled { - [self dismissCropper:cropViewController selectionDone:NO completion:[self waitAnimationEnd:^{ - if (self.currentSelectionMode == CROPPING) { - self.reject(ERROR_PICKER_CANCEL_KEY, ERROR_PICKER_CANCEL_MSG, nil); - } - }]]; -} - -@end diff --git a/ios/src/UIImage+Extension.h b/ios/src/UIImage+Extension.h deleted file mode 100644 index 137248a2c799d82093753349818a3935fe2a90a5..0000000000000000000000000000000000000000 --- a/ios/src/UIImage+Extension.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// UIImage+Extension.h -// Pods -// -// Created by Ivan Pusic on 09/05/2020. -// - -#ifndef UIImage_Extension_h -#define UIImage_Extension_h - -#import - -@interface UIImage (fixOrientation) - -- (UIImage *)fixOrientation; - -@end - -#endif /* UIImage_Extension_h */ diff --git a/ios/src/UIImage+Extension.m b/ios/src/UIImage+Extension.m deleted file mode 100644 index 68de553d63cbc405fd2a27ca3c641e1356df850a..0000000000000000000000000000000000000000 --- a/ios/src/UIImage+Extension.m +++ /dev/null @@ -1,94 +0,0 @@ -// -// UIImage+Extension.m -// DoubleConversion -// -// Created by Ivan Pusic on 09/05/2020. -// - -#import "UIImage+Extension.h" - -@implementation UIImage (fixOrientation) - -- (UIImage *)fixOrientation -{ - // No-op if the orientation is already correct. - if (self.imageOrientation == UIImageOrientationUp) { - return self; - } - - // We need to calculate the proper transformation to make the image upright. - // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. - CGAffineTransform transform = CGAffineTransformIdentity; - - switch (self.imageOrientation) { - case UIImageOrientationDown: - case UIImageOrientationDownMirrored: - transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); - transform = CGAffineTransformRotate(transform, M_PI); - break; - - case UIImageOrientationLeft: - case UIImageOrientationLeftMirrored: - transform = CGAffineTransformTranslate(transform, self.size.width, 0); - transform = CGAffineTransformRotate(transform, M_PI_2); - break; - - case UIImageOrientationRight: - case UIImageOrientationRightMirrored: - transform = CGAffineTransformTranslate(transform, 0, self.size.height); - transform = CGAffineTransformRotate(transform, -M_PI_2); - break; - case UIImageOrientationUp: - case UIImageOrientationUpMirrored: - break; - } - - switch (self.imageOrientation) { - case UIImageOrientationUpMirrored: - case UIImageOrientationDownMirrored: - transform = CGAffineTransformTranslate(transform, self.size.width, 0); - transform = CGAffineTransformScale(transform, -1, 1); - break; - - case UIImageOrientationLeftMirrored: - case UIImageOrientationRightMirrored: - transform = CGAffineTransformTranslate(transform, self.size.height, 0); - transform = CGAffineTransformScale(transform, -1, 1); - break; - case UIImageOrientationUp: - case UIImageOrientationDown: - case UIImageOrientationLeft: - case UIImageOrientationRight: - break; - } - - // Now we draw the underlying CGImage into a new context, applying the transform - // calculated above. - CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, - CGImageGetBitsPerComponent(self.CGImage), 0, - CGImageGetColorSpace(self.CGImage), - CGImageGetBitmapInfo(self.CGImage)); - CGContextConcatCTM(ctx, transform); - switch (self.imageOrientation) { - case UIImageOrientationLeft: - case UIImageOrientationLeftMirrored: - case UIImageOrientationRight: - case UIImageOrientationRightMirrored: - CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height, self.size.width), self.CGImage); - break; - - default: - CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.width, self.size.height), self.CGImage); - break; - } - - // And now we just create a new UIImage from the drawing context. - CGImageRef cgimg = CGBitmapContextCreateImage(ctx); - UIImage *img = [UIImage imageWithCGImage:cgimg]; - CGContextRelease(ctx); - CGImageRelease(cgimg); - - return img; -} - -@end diff --git a/ios/src/UIImage+Resize.h b/ios/src/UIImage+Resize.h deleted file mode 100644 index d3e1b1eb547a1196ab918b7f2028a13b8b930d9e..0000000000000000000000000000000000000000 --- a/ios/src/UIImage+Resize.h +++ /dev/null @@ -1,37 +0,0 @@ -/*********************************************************************************** - * - * Copyright (c) 2010 Olivier Halligon - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - *********************************************************************************** - * - * Any comment or suggestion welcome. Referencing this project in your AboutBox is appreciated. - * Please tell me if you use this class so we can cross-reference our projects. - * - ***********************************************************************************/ - - -#import -#import - -@interface UIImage(ResizeCategory) --(UIImage*)resizedImageToSize:(CGSize)dstSize; --(UIImage*)resizedImageToFitInSize:(CGSize)boundingSize scaleIfSmaller:(BOOL)scale; -@end diff --git a/ios/src/UIImage+Resize.m b/ios/src/UIImage+Resize.m deleted file mode 100644 index 60e4ea9a6b9dd6990b6f7603c5ac93066ad4c1bf..0000000000000000000000000000000000000000 --- a/ios/src/UIImage+Resize.m +++ /dev/null @@ -1,153 +0,0 @@ -// -// UIImage+Resize.m -// -// Created by Olivier Halligon on 12/08/09. -// Copyright 2009 AliSoftware. All rights reserved. -// - -#import "UIImage+Resize.h" - -@implementation UIImage (ResizeCategory) - --(UIImage*)resizedImageToSize:(CGSize)dstSize -{ - CGImageRef imgRef = self.CGImage; - // the below values are regardless of orientation : for UIImages from Camera, width>height (landscape) - CGSize srcSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); // not equivalent to self.size (which is dependant on the imageOrientation)! - - /* Don't resize if we already meet the required destination size. */ - if (CGSizeEqualToSize(srcSize, dstSize)) { - return self; - } - - CGFloat scaleRatio = dstSize.width / srcSize.width; - UIImageOrientation orient = self.imageOrientation; - CGAffineTransform transform = CGAffineTransformIdentity; - switch(orient) { - - case UIImageOrientationUp: //EXIF = 1 - transform = CGAffineTransformIdentity; - break; - - case UIImageOrientationUpMirrored: //EXIF = 2 - transform = CGAffineTransformMakeTranslation(srcSize.width, 0.0); - transform = CGAffineTransformScale(transform, -1.0, 1.0); - break; - - case UIImageOrientationDown: //EXIF = 3 - transform = CGAffineTransformMakeTranslation(srcSize.width, srcSize.height); - transform = CGAffineTransformRotate(transform, M_PI); - break; - - case UIImageOrientationDownMirrored: //EXIF = 4 - transform = CGAffineTransformMakeTranslation(0.0, srcSize.height); - transform = CGAffineTransformScale(transform, 1.0, -1.0); - break; - - case UIImageOrientationLeftMirrored: //EXIF = 5 - dstSize = CGSizeMake(dstSize.height, dstSize.width); - transform = CGAffineTransformMakeTranslation(srcSize.height, srcSize.width); - transform = CGAffineTransformScale(transform, -1.0, 1.0); - transform = CGAffineTransformRotate(transform, 3.0 * M_PI_2); - break; - - case UIImageOrientationLeft: //EXIF = 6 - dstSize = CGSizeMake(dstSize.height, dstSize.width); - transform = CGAffineTransformMakeTranslation(0.0, srcSize.width); - transform = CGAffineTransformRotate(transform, 3.0 * M_PI_2); - break; - - case UIImageOrientationRightMirrored: //EXIF = 7 - dstSize = CGSizeMake(dstSize.height, dstSize.width); - transform = CGAffineTransformMakeScale(-1.0, 1.0); - transform = CGAffineTransformRotate(transform, M_PI_2); - break; - - case UIImageOrientationRight: //EXIF = 8 - dstSize = CGSizeMake(dstSize.height, dstSize.width); - transform = CGAffineTransformMakeTranslation(srcSize.height, 0.0); - transform = CGAffineTransformRotate(transform, M_PI_2); - break; - - default: - [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; - - } - - ///////////////////////////////////////////////////////////////////////////// - // The actual resize: draw the image on a new context, applying a transform matrix - UIGraphicsBeginImageContextWithOptions(dstSize, NO, self.scale); - - CGContextRef context = UIGraphicsGetCurrentContext(); - - if (!context) { - return nil; - } - - if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { - CGContextScaleCTM(context, -scaleRatio, scaleRatio); - CGContextTranslateCTM(context, -srcSize.height, 0); - } else { - CGContextScaleCTM(context, scaleRatio, -scaleRatio); - CGContextTranslateCTM(context, 0, -srcSize.height); - } - - CGContextConcatCTM(context, transform); - - // we use srcSize (and not dstSize) as the size to specify is in user space (and we use the CTM to apply a scaleRatio) - CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, srcSize.width, srcSize.height), imgRef); - UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return resizedImage; -} - - - -///////////////////////////////////////////////////////////////////////////// - - - --(UIImage*)resizedImageToFitInSize:(CGSize)boundingSize scaleIfSmaller:(BOOL)scale -{ - // get the image size (independant of imageOrientation) - CGImageRef imgRef = self.CGImage; - CGSize srcSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); // not equivalent to self.size (which depends on the imageOrientation)! - - // adjust boundingSize to make it independant on imageOrientation too for farther computations - UIImageOrientation orient = self.imageOrientation; - switch (orient) { - case UIImageOrientationLeft: - case UIImageOrientationRight: - case UIImageOrientationLeftMirrored: - case UIImageOrientationRightMirrored: - boundingSize = CGSizeMake(boundingSize.height, boundingSize.width); - break; - default: - // NOP - break; - } - - // Compute the target CGRect in order to keep aspect-ratio - CGSize dstSize; - - if ( !scale && (srcSize.width < boundingSize.width) && (srcSize.height < boundingSize.height) ) { - //NSLog(@"Image is smaller, and we asked not to scale it in this case (scaleIfSmaller:NO)"); - dstSize = srcSize; // no resize (we could directly return 'self' here, but we draw the image anyway to take image orientation into account) - } else { - CGFloat wRatio = boundingSize.width / srcSize.width; - CGFloat hRatio = boundingSize.height / srcSize.height; - - if (wRatio < hRatio) { - //NSLog(@"Width imposed, Height scaled ; ratio = %f",wRatio); - dstSize = CGSizeMake(boundingSize.width, floorf(srcSize.height * wRatio)); - } else { - //NSLog(@"Height imposed, Width scaled ; ratio = %f",hRatio); - dstSize = CGSizeMake(floorf(srcSize.width * hRatio), boundingSize.height); - } - } - - return [self resizedImageToSize:dstSize]; -} - -@end diff --git a/js/NativeRNCImageCropPicker.ts b/js/NativeRNCImageCropPicker.ts new file mode 100644 index 0000000000000000000000000000000000000000..ce1958a7f93982416ce0b3aaa04c2788f5b98d78 --- /dev/null +++ b/js/NativeRNCImageCropPicker.ts @@ -0,0 +1,108 @@ +import type { TurboModule } from "react-native/library/TurboModule/RCTExport"; +import { TurboModuleRegistry } from "react-native"; + +type ImageOrVideo = Image | Video; +type SmartAlbums = | 'Regular' | 'SyncedEvent' | 'SyncedFaces'; +type CompressVideoPresets = | 'LowQuality' | 'MediumQuality' | 'HighestQuality' | 'Passthrough'; +type Options = AnyOptions | VideoOptions | ImageOptions; +type MediaType = 'photo' | 'video' | 'any'; +type AnyOptions = Omit & Omit & { + mediaType?: 'any'; +} +type VideoOptions = CommonOptions & { + mediaType: 'video'; + compressVideoPreset?: CompressVideoPresets; +} + +type CropperOptions = ImageOptions & { + path: string; +} + +type ImageOptions = CommonOptions & { + mediaType: MediaType; + width?: number; + height?: number; + includeBase64?: boolean; + includeExif?: boolean; + forceJpg?: boolean; + cropping?: boolean; + avoidEmptySpaceAroundImage?: boolean; + cropperActiveWidgetColor?: string; + cropperStatusBarColor?: string; + cropperToolbarColor?: string; + cropperToolbarWidgetColor?: string; + cropperToolbarTitle?: string; + freeStyleCropEnabled?: boolean; + cropperTintColor?: string; + cropperCircleOverlay?: boolean; + cropperCancelText?: string; + cropperCancelColor?: string; + cropperChooseText?: string; + cropperChooseColor?: string; + cropperRotateButtonHidden?: boolean + showCropGuidelines?: boolean; + showCropFrame?: boolean; + enableRotationGesture?: boolean; + disableCropperColorSetters?: boolean; + compressImageMaxWidth?: number; + compressImageMaxHeight?: number; + compressImageQuality?: number; +} + +export interface CommonOptions { + multiple?: boolean; + minFiles?: number; + maxFiles?: number; + waitAnimationEnd?: boolean; + smartAlbums?: SmartAlbums[]; + useFrontCamera?: boolean; + loadingLabelText?: string; + showsSelectedCount?: boolean; + sortOrder?: 'none' | 'asc' | 'desc'; + hideBottomControls?: boolean; + writeTempFile?: boolean; +} + +export interface CropRect { + x: number; + y: number; + width: number; + height: number; +} + +interface ImageVideoCommon { + path: string; + size: number; + width: number; + height: number; + mime: string; + exif?: Exif; + localIdentifier?: string; + sourceURL?: string; + filename?: string; + creationDate?: string; + modificationDate?: string; +} + +export interface Exif { + +} + +interface Image extends ImageVideoCommon { + data?: string | null; + cropRect?: CropRect | null; +} + +interface Video extends ImageVideoCommon { + duration: number | null; +} + +export interface Spec extends TurboModule { + openPicker(options: Options): Promise; + openCamera(options: Options): Promise; + openCropper(options: CropperOptions): Promise; + clean(): Promise; + cleanSingle(path: string): Promise; +} + +export default TurboModuleRegistry.getEnforcing('ImageCropPicker') \ No newline at end of file diff --git a/js/index.js b/js/index.js new file mode 100644 index 0000000000000000000000000000000000000000..bf94720df8a1ea6f2480774e6ab14078a372f91d --- /dev/null +++ b/js/index.js @@ -0,0 +1,31 @@ +import React from 'react'; +import ImageCropPicker from './NativeRNCImageCropPicker'; + +const ImagePicker = { + async openPicker(options) { + const res = await ImageCropPicker.openPicker(options); + return res; + }, + async openCamera(options) { + const res = await ImageCropPicker.openCamera(options); + return res; + }, + async openCropper(options) { + const res = await ImageCropPicker.openCropper(options); + return res; + }, + async cleanSingle(path) { + ImageCropPicker.cleanSingle(path); + }, + async clean() { + ImageCropPicker.clean(); + }, +}; + +export default ImagePicker; + +export const openPicker = ImagePicker.openPicker; +export const openCamera = ImagePicker.openCamera; +export const openCropper = ImagePicker.openCropper; +export const clean = ImagePicker.clean; +export const cleanSingle = ImagePicker.cleanSingle; \ No newline at end of file diff --git a/package.json b/package.json index 3b1735597328313b6f1b17927047b28e6a8c8155..e2779d8d90c20550ed20afabfd01783236679b4f 100644 --- a/package.json +++ b/package.json @@ -1,34 +1,48 @@ { - "name": "react-native-image-crop-picker", - "version": "0.40.3", - "description": "Select single or multiple images, with cropping option", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "prepublish": "rm -rf android/build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ivpusic/react-native-image-crop-picker.git" - }, - "keywords": [ - "react", - "native", - "react-native", - "image", - "picker", - "crop", - "cropping", - "multiple", - "camera" - ], - "author": "Ivan Pusic", - "license": "MIT", - "bugs": { - "url": "https://github.com/ivpusic/react-native-image-crop-picker/issues" - }, - "homepage": "https://github.com/ivpusic/react-native-image-crop-picker#readme", - "peerDependencies": { - "react-native": ">=0.40.0" - } + "name": "@react-native-ohos/react-native-image-crop-picker", + "version": "0.40.3", + "description": "Select single or multiple images, with cropping option", + "main": "js/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "codegen-lib": "react-native codegen-lib-harmony --no-safety-check --npm-package-name react-native-image-crop-picker --cpp-output-path ./harmony/image_crop_picker/src/main/cpp/generated --ets-output-path ./harmony/image_crop_picker/src/main/ets/generated --turbo-modules-spec-paths ./js/NativeRNCImageCropPicker.ts" + }, + "repository": { + "type": "git", + "url": "git+https://gitee.com/openharmony-sig/rntpc_react-native-image-crop-picker.git" + }, + "keywords": [ + "react", + "native", + "react-native", + "image", + "picker", + "crop", + "cropping", + "multiple", + "camera", + "harmony" + ], + "author": "Ivan Pusic", + "license": "MIT", + "bugs": { + "url": "https://gitee.com/openharmony-sig/rntpc_react-native-image-crop-picker/issues" + }, + "homepage": "https://gitee.com/openharmony-sig/rntpc_react-native-image-crop-picker#readme", + "dependencies": { + "react-native-image-crop-picker": "^0.40.3" + }, + "devDependencies": { + "react-native-harmony-cli": "npm:@react-native-oh/react-native-harmony-cli@^0.0.27" + }, + "peerDependencies": { + "react-native": ">=0.40.0" + }, + "harmony": { + "alias": "react-native-image-crop-picker" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + } }