├── .eslintrc ├── .gitattributes ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── android ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── masteratul │ │ └── downloadmanager │ │ ├── Downloader.java │ │ ├── ReactNativeDownloadManagerModule.java │ │ └── ReactNativeDownloadManagerPackage.java │ └── res │ └── values │ └── strings.xml ├── index.js ├── package.json └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | # "off" or 0 - turn the rule off 2 | # "warn" or 1 - turn the rule on as a warning(doesn’ t affect exit code) 3 | # "error" or 2 - turn the rule on as an error(exit code is 1 when triggered) 4 | { 5 | "parser": "babel-eslint", 6 | "env": { 7 | "browser": true 8 | }, 9 | "plugins": [ 10 | "react", 11 | "react-native" 12 | ], 13 | "parserOptions": { 14 | "ecmaFeatures": { 15 | "jsx": true 16 | }, 17 | "sourceType": "module" 18 | }, 19 | "extends": ["eslint:recommended", "plugin:react/recommended"], 20 | "rules": { 21 | "react/no-did-mount-set-state": 2, 22 | "react/no-did-update-set-state": 2, 23 | "react/no-direct-mutation-state": 2, 24 | "react/jsx-uses-vars": 2, 25 | "no-unused-vars": ["error", { 26 | "varsIgnorePattern": "React" 27 | }], 28 | "comma-spacing": ["error", { 29 | "before": false, 30 | "after": true }], 31 | "no-undef": 2, 32 | "semi": 2, 33 | "react/prop-types": 2, 34 | "react/jsx-no-bind": 2, 35 | "react/jsx-no-duplicate-props": 2, 36 | "space-before-blocks": 2, 37 | "space-before-function-paren": 2, 38 | "space-in-parens": 2, 39 | "space-infix-ops": 2, 40 | "space-unary-ops": 2, 41 | "spaced-comment": 2, 42 | "rest-spread-spacing": 2, 43 | "semi-spacing": 2, 44 | "no-unneeded-ternary": 2, 45 | "eqeqeq": 2, 46 | "dot-location": 2, 47 | "no-extra-bind": 2, 48 | "keyword-spacing": 2, 49 | "key-spacing": 2, 50 | "indent": ["error", 2], 51 | "react/jsx-indent": [2, 2], 52 | "func-call-spacing": 2, 53 | "array-bracket-spacing": 2, 54 | "block-spacing": 2, 55 | "brace-style": 2, 56 | "arrow-body-style": 2, 57 | "arrow-parens": 2, 58 | "arrow-spacing": 2, 59 | "react/self-closing-comp": 2, 60 | "jsx-quotes": ["error", "prefer-single"], 61 | "object-curly-spacing": 2, 62 | "quotes": ["error", "single"], 63 | "no-console": 0 64 | }, 65 | "globals": { 66 | "global": false, 67 | "it": false, 68 | "xit": false, 69 | "expect": false, 70 | "describe": false, 71 | "require": false, 72 | "module": false, 73 | "Promise": false, 74 | "__DEV__": false 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # OSX 3 | # 4 | .DS_Store 5 | 6 | # node.js 7 | # 8 | node_modules/ 9 | npm-debug.log 10 | yarn-error.log 11 | 12 | 13 | # Xcode 14 | # 15 | build/ 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | xcuserdata 25 | *.xccheckout 26 | *.moved-aside 27 | DerivedData 28 | *.hmap 29 | *.ipa 30 | *.xcuserstate 31 | project.xcworkspace 32 | 33 | 34 | # Android/IntelliJ 35 | # 36 | build/ 37 | .idea 38 | .gradle 39 | local.properties 40 | *.iml 41 | 42 | # BUCK 43 | buck-out/ 44 | \.buckd/ 45 | *.keystore 46 | 47 | 48 | node_modules 49 | .git 50 | cache 51 | npm-debug.log 52 | coverage 53 | .DS_Store 54 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .git 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Atul 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-simple-download-manager 2 | 3 | A simple straightforward react native module that lets you schedule downloads onto your download manager for android. 4 | 5 | - Support custom headers for authentication 6 | - File download scheduler 7 | - Cancel file downlaod 8 | - Check status of the download 9 | 10 | TODO - ios module 11 | 12 | ### Installation: 13 | 14 | `yarn add react-native-simple-download-manager` 15 | 16 | or 17 | 18 | `npm i react-native-simple-download-manager --save` 19 | 20 | ### Mostly automatic installation 21 | 22 | `react-native link react-native-simple-download-manager` 23 | 24 | ### Manual installation 25 | 26 | #### Android 27 | 28 | 1. Open up `android/app/src/main/java/[...]/MainApplication.java` 29 | 30 | - Add `import com.masteratul.downloadmanager.ReactNativeDownloadManagerPackage;` to the imports at the top of the file 31 | - Add `new ReactNativeDownloadManagerPackage()` to the list returned by the `getPackages()` method 32 | 33 | 2. Append the following lines to `android/settings.gradle`: 34 | ``` 35 | include ':react-native-simple-download-manager' 36 | project(':react-native-simple-download-manager').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-simple-download-manager/android') 37 | ``` 38 | 3. Insert the following lines inside the dependencies block in `android/app/build.gradle`: 39 | ``` 40 | compile project(':react-native-simple-download-manager') 41 | ``` 42 | 43 | ### Usage 44 | 45 | ```js 46 | const downloadManager = require("react-native-simple-download-manager"); 47 | 48 | const url = "http://url/to/file.ext?query=parmas"; 49 | const headers = { Authorization: "Bearer abcsdsjkdjskjdkskjd" }; 50 | const config = { 51 | downloadTitle: "Title that should appear in Native Download manager", 52 | downloadDescription: 53 | "Description that should appear in Native Download manager", 54 | saveAsName: "File name to save", 55 | allowedInRoaming: true, 56 | allowedInMetered: true, 57 | showInDownloads: true, 58 | external: false, //when false basically means use the default Download path (version ^1.3) 59 | path: "Download/" //if "external" is true then use this path (version ^1.3) 60 | }; 61 | 62 | downloadManager 63 | .download((url = ""), (headers = {}), (config = {})) 64 | .then(response => { 65 | console.log("Download success!"); 66 | }) 67 | .catch(err => { 68 | console.log("Download failed!"); 69 | }); 70 | ``` 71 | 72 | ### Advanced Usage 73 | 74 | The module currently supports 75 | 76 | - download, 77 | - queueDownload, 78 | - attachOnCompleteListener, 79 | - cancel, 80 | - checkStatus 81 | 82 | You can check https://github.com/master-atul/react-native-simple-download-manager/blob/master/index.js 83 | 84 | ### Contributors 85 | 86 | - [Atul R](https://github.com/master-atul) 87 | - [Shivam Barsaley](https://github.com/shivambarsaley) 88 | - [ibrahimtelman](https://github.com/ibrahimtelman) 89 | - [KingDark](https://github.com/kingdark1234) 90 | 91 | Peace ! ✌🏻🌮 92 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | buildscript { 3 | repositories { 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.3.1' 9 | } 10 | } 11 | 12 | apply plugin: 'com.android.library' 13 | 14 | android { 15 | compileSdkVersion 23 16 | buildToolsVersion "23.0.1" 17 | 18 | defaultConfig { 19 | minSdkVersion 16 20 | targetSdkVersion 22 21 | versionCode 1 22 | versionName "1.0" 23 | } 24 | lintOptions { 25 | abortOnError false 26 | } 27 | } 28 | 29 | repositories { 30 | mavenCentral() 31 | } 32 | 33 | dependencies { 34 | implementation 'com.facebook.react:react-native:+' 35 | } 36 | 37 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/a7ul/react-native-simple-download-manager/032170d235a14d83558027b4f44deece95ae3754/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Dec 08 22:03:56 IST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip 7 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/src/main/java/com/masteratul/downloadmanager/Downloader.java: -------------------------------------------------------------------------------- 1 | package com.masteratul.downloadmanager; 2 | 3 | import android.app.DownloadManager; 4 | import android.content.Context; 5 | import android.database.Cursor; 6 | import android.net.Uri; 7 | import android.os.Environment; 8 | 9 | import com.facebook.react.bridge.ReadableMap; 10 | import com.facebook.react.bridge.ReadableMapKeySetIterator; 11 | import com.facebook.react.bridge.WritableMap; 12 | import com.facebook.react.bridge.WritableNativeMap; 13 | 14 | import java.util.HashMap; 15 | 16 | import static android.content.Context.DOWNLOAD_SERVICE; 17 | 18 | public class Downloader { 19 | 20 | private DownloadManager downloadManager; 21 | private Context context; 22 | 23 | public Downloader(Context ctx) { 24 | context = ctx; 25 | downloadManager = (DownloadManager) ctx.getSystemService(DOWNLOAD_SERVICE); 26 | } 27 | 28 | public DownloadManager.Request createRequest(String url, ReadableMap headers, ReadableMap requestConfig) { 29 | String downloadTitle = requestConfig.getString("downloadTitle"); 30 | String downloadDescription = requestConfig.getString("downloadTitle"); 31 | String saveAsName = requestConfig.getString("saveAsName"); 32 | 33 | Boolean external = requestConfig.getBoolean("external"); 34 | String external_path = requestConfig.getString("path"); 35 | 36 | Boolean allowedInRoaming = requestConfig.getBoolean("allowedInRoaming"); 37 | Boolean allowedInMetered = requestConfig.getBoolean("allowedInMetered"); 38 | Boolean showInDownloads = requestConfig.getBoolean("showInDownloads"); 39 | 40 | Uri downloadUri = Uri.parse(url); 41 | DownloadManager.Request request = new DownloadManager.Request(downloadUri); 42 | 43 | ReadableMapKeySetIterator iterator = headers.keySetIterator(); 44 | while (iterator.hasNextKey()) { 45 | String key = iterator.nextKey(); 46 | request.addRequestHeader(key, headers.getString(key)); 47 | } 48 | 49 | 50 | 51 | if(external){ 52 | request.setDestinationInExternalPublicDir(external_path, saveAsName); 53 | 54 | }else{ 55 | request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, saveAsName); 56 | 57 | } 58 | 59 | request.setTitle(downloadTitle); 60 | request.setDescription(downloadDescription); 61 | request.setAllowedOverRoaming(allowedInRoaming); 62 | request.setAllowedOverMetered(allowedInMetered); 63 | request.setVisibleInDownloadsUi(showInDownloads); 64 | request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); 65 | request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 66 | return request; 67 | } 68 | 69 | public long queueDownload(DownloadManager.Request request) { 70 | return downloadManager.enqueue(request); 71 | } 72 | 73 | public WritableMap checkDownloadStatus(long downloadId) { 74 | 75 | DownloadManager.Query downloadQuery = new DownloadManager.Query(); 76 | downloadQuery.setFilterById(downloadId); 77 | Cursor cursor = downloadManager.query(downloadQuery); 78 | HashMap result = new HashMap<>(); 79 | if (cursor.moveToFirst()) { 80 | result = getDownloadStatus(cursor, downloadId); 81 | } else { 82 | result.put("status", "UNKNOWN"); 83 | result.put("reason", "COULD_NOT_FIND"); 84 | result.put("downloadId", String.valueOf(downloadId)); 85 | } 86 | WritableMap wmap = new WritableNativeMap(); 87 | for (HashMap.Entry entry : result.entrySet()) { 88 | wmap.putString(entry.getKey(), entry.getValue()); 89 | } 90 | return wmap; 91 | } 92 | 93 | public int cancelDownload(long downloadId) { 94 | return downloadManager.remove(downloadId); 95 | } 96 | 97 | 98 | private HashMap getDownloadStatus(Cursor cursor, long downloadId) { 99 | 100 | int columnStatusIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 101 | int STATUS = cursor.getInt(columnStatusIndex); 102 | int columnReasonIndex = cursor.getColumnIndex(DownloadManager.COLUMN_REASON); 103 | int REASON = cursor.getInt(columnReasonIndex); 104 | int filenameIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI); 105 | String filename = cursor.getString(filenameIndex); 106 | 107 | String statusText = ""; 108 | String reasonText = ""; 109 | 110 | switch (STATUS) { 111 | case DownloadManager.STATUS_FAILED: 112 | statusText = "STATUS_FAILED"; 113 | switch (REASON) { 114 | case DownloadManager.ERROR_CANNOT_RESUME: 115 | reasonText = "ERROR_CANNOT_RESUME"; 116 | break; 117 | case DownloadManager.ERROR_DEVICE_NOT_FOUND: 118 | reasonText = "ERROR_DEVICE_NOT_FOUND"; 119 | break; 120 | case DownloadManager.ERROR_FILE_ALREADY_EXISTS: 121 | reasonText = "ERROR_FILE_ALREADY_EXISTS"; 122 | break; 123 | case DownloadManager.ERROR_FILE_ERROR: 124 | reasonText = "ERROR_FILE_ERROR"; 125 | break; 126 | case DownloadManager.ERROR_HTTP_DATA_ERROR: 127 | reasonText = "ERROR_HTTP_DATA_ERROR"; 128 | break; 129 | case DownloadManager.ERROR_INSUFFICIENT_SPACE: 130 | reasonText = "ERROR_INSUFFICIENT_SPACE"; 131 | break; 132 | case DownloadManager.ERROR_TOO_MANY_REDIRECTS: 133 | reasonText = "ERROR_TOO_MANY_REDIRECTS"; 134 | break; 135 | case DownloadManager.ERROR_UNHANDLED_HTTP_CODE: 136 | reasonText = "ERROR_UNHANDLED_HTTP_CODE"; 137 | break; 138 | default: 139 | reasonText = "ERROR_UNKNOWN"; 140 | break; 141 | } 142 | break; 143 | case DownloadManager.STATUS_PAUSED: 144 | statusText = "STATUS_PAUSED"; 145 | switch (REASON) { 146 | case DownloadManager.PAUSED_QUEUED_FOR_WIFI: 147 | reasonText = "PAUSED_QUEUED_FOR_WIFI"; 148 | break; 149 | case DownloadManager.PAUSED_UNKNOWN: 150 | reasonText = "PAUSED_UNKNOWN"; 151 | break; 152 | case DownloadManager.PAUSED_WAITING_FOR_NETWORK: 153 | reasonText = "PAUSED_WAITING_FOR_NETWORK"; 154 | break; 155 | case DownloadManager.PAUSED_WAITING_TO_RETRY: 156 | reasonText = "PAUSED_WAITING_TO_RETRY"; 157 | break; 158 | default: 159 | reasonText = "UNKNOWN"; 160 | } 161 | break; 162 | case DownloadManager.STATUS_PENDING: 163 | statusText = "STATUS_PENDING"; 164 | break; 165 | case DownloadManager.STATUS_RUNNING: 166 | statusText = "STATUS_RUNNING"; 167 | break; 168 | case DownloadManager.STATUS_SUCCESSFUL: 169 | statusText = "STATUS_SUCCESSFUL"; 170 | reasonText = filename; 171 | break; 172 | default: 173 | statusText = "STATUS_UNKNOWN"; 174 | reasonText = String.valueOf(STATUS); 175 | break; 176 | } 177 | 178 | HashMap result = new HashMap<>(); 179 | result.put("status", statusText); 180 | result.put("reason", reasonText); 181 | result.put("downloadId", String.valueOf(downloadId)); 182 | return result; 183 | } 184 | } -------------------------------------------------------------------------------- /android/src/main/java/com/masteratul/downloadmanager/ReactNativeDownloadManagerModule.java: -------------------------------------------------------------------------------- 1 | package com.masteratul.downloadmanager; 2 | 3 | import android.app.DownloadManager; 4 | import android.content.BroadcastReceiver; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.content.IntentFilter; 8 | import android.support.v4.util.LongSparseArray; 9 | import android.util.Log; 10 | 11 | import com.facebook.react.bridge.Callback; 12 | import com.facebook.react.bridge.ReactApplicationContext; 13 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 14 | import com.facebook.react.bridge.ReactMethod; 15 | import com.facebook.react.bridge.ReadableMap; 16 | import com.facebook.react.bridge.WritableMap; 17 | 18 | import java.util.ArrayList; 19 | import java.util.Arrays; 20 | 21 | public class ReactNativeDownloadManagerModule extends ReactContextBaseJavaModule { 22 | private Downloader downloader; 23 | private LongSparseArray appDownloads; 24 | BroadcastReceiver downloadReceiver = new BroadcastReceiver() { 25 | @Override 26 | public void onReceive(Context context, Intent intent) { 27 | try { 28 | long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 29 | if (appDownloads.indexOfKey(downloadId) >= 0) { 30 | WritableMap downloadStatus = downloader.checkDownloadStatus(downloadId); 31 | Callback downloadOnDoneCb = appDownloads.get(downloadId); 32 | 33 | if (downloadStatus.getString("status").equalsIgnoreCase("STATUS_SUCCESSFUL")) { 34 | downloadOnDoneCb.invoke(null, downloadStatus); 35 | } else { 36 | downloadOnDoneCb.invoke(downloadStatus, null); 37 | } 38 | appDownloads.remove(downloadId); 39 | } 40 | 41 | } catch (Exception e) { 42 | Log.e("RN_DOWNLOAD_MANAGER", Log.getStackTraceString(e)); 43 | } 44 | } 45 | }; 46 | 47 | public ReactNativeDownloadManagerModule(ReactApplicationContext reactContext) { 48 | super(reactContext); 49 | downloader = new Downloader(reactContext); 50 | appDownloads = new LongSparseArray<>(); 51 | IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 52 | reactContext.registerReceiver(downloadReceiver, filter); 53 | } 54 | 55 | @Override 56 | public String getName() { 57 | return "ReactNativeDownloadManager"; 58 | } 59 | 60 | @ReactMethod 61 | public void download(String url, ReadableMap headers, ReadableMap config, Callback onDone) { 62 | try { 63 | DownloadManager.Request request = downloader.createRequest(url, headers, config); 64 | long downloadId = downloader.queueDownload(request); 65 | appDownloads.put(downloadId, onDone); 66 | } catch (Exception e) { 67 | onDone.invoke(e.getMessage(), null); 68 | } 69 | } 70 | 71 | @ReactMethod 72 | public void queueDownload(String url, ReadableMap headers, ReadableMap config, Callback onStart) { 73 | try { 74 | DownloadManager.Request request = downloader.createRequest(url, headers, config); 75 | long downloadId = downloader.queueDownload(request); 76 | onStart.invoke(null, String.valueOf(downloadId)); 77 | } catch (Exception e) { 78 | onStart.invoke(e.getMessage(), null); 79 | } 80 | } 81 | 82 | @ReactMethod 83 | public void attachOnCompleteListener(String downloadId, Callback onComplete) { 84 | try { 85 | long dloadId = Long.parseLong(downloadId); 86 | appDownloads.put(dloadId, onComplete); 87 | WritableMap status = downloader.checkDownloadStatus(Long.parseLong(downloadId)); 88 | ArrayList alreadyDoneStatuses = new ArrayList<>(Arrays.asList("STATUS_SUCCESSFUL", "STATUS_FAILED")); 89 | String currentStatus = status.getString("status"); 90 | if (alreadyDoneStatuses.contains(currentStatus)) { 91 | appDownloads.remove(dloadId); 92 | onComplete.invoke(null, status); 93 | } 94 | } catch (Exception e) { 95 | onComplete.invoke(e.getMessage(), null); 96 | } 97 | } 98 | 99 | 100 | @ReactMethod 101 | public void cancel(String downloadId, Callback onCancel) { 102 | try { 103 | downloader.cancelDownload(Long.parseLong(downloadId)); 104 | onCancel.invoke(null, downloadId); 105 | } catch (Exception e) { 106 | onCancel.invoke(e.getMessage(), null); 107 | } 108 | } 109 | 110 | @ReactMethod 111 | public void checkStatus(String downloadId, Callback onStatus) { 112 | try { 113 | WritableMap status = downloader.checkDownloadStatus(Long.parseLong(downloadId)); 114 | onStatus.invoke(null, status); 115 | } catch (Exception e) { 116 | onStatus.invoke(e.getMessage(), null); 117 | } 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /android/src/main/java/com/masteratul/downloadmanager/ReactNativeDownloadManagerPackage.java: -------------------------------------------------------------------------------- 1 | 2 | package com.masteratul.downloadmanager; 3 | 4 | import com.facebook.react.ReactPackage; 5 | import com.facebook.react.bridge.JavaScriptModule; 6 | import com.facebook.react.bridge.NativeModule; 7 | import com.facebook.react.bridge.ReactApplicationContext; 8 | import com.facebook.react.uimanager.ViewManager; 9 | 10 | import java.util.Arrays; 11 | import java.util.Collections; 12 | import java.util.List; 13 | 14 | public class ReactNativeDownloadManagerPackage implements ReactPackage { 15 | @Override 16 | public List createNativeModules(ReactApplicationContext reactContext) { 17 | return Arrays.asList(new ReactNativeDownloadManagerModule(reactContext)); 18 | } 19 | 20 | public List> createJSModules() { 21 | return Collections.emptyList(); 22 | } 23 | 24 | @Override 25 | public List createViewManagers(ReactApplicationContext reactContext) { 26 | return Collections.emptyList(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /android/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import {NativeModules} from 'react-native'; 2 | 3 | const {ReactNativeDownloadManager} = NativeModules; 4 | 5 | const getRequestConfig = (config, url) => Object.assign({}, { 6 | downloadTitle: 'File Download', 7 | downloadDescription: url, 8 | saveAsName: 'Downloaded File - ' + new Date(), 9 | allowedInRoaming: true, 10 | allowedInMetered: true, 11 | showInDownloads: true, 12 | external: false, 13 | path: "Download/" 14 | }, config); 15 | 16 | const download = (url = '', headers = {}, config = {}) => { 17 | const downloadRequestConfig = getRequestConfig(config, url); 18 | return new Promise((resolve, reject) => { 19 | ReactNativeDownloadManager.download(url, headers, downloadRequestConfig, (err, data) => { 20 | if (err) { 21 | return reject(err); 22 | } 23 | return resolve(data); 24 | }); 25 | }); 26 | }; 27 | 28 | const queueDownload = (url = '', headers = {}, config = {}) => { 29 | const downloadRequestConfig = getRequestConfig(config, url); 30 | return new Promise((resolve, reject) => { 31 | ReactNativeDownloadManager.queueDownload(url, headers, downloadRequestConfig, (err, data) => { 32 | if (err) { 33 | return reject(err); 34 | } 35 | return resolve(data); 36 | }); 37 | }); 38 | }; 39 | 40 | const attachOnCompleteListener = (downloadId = '') => new Promise((resolve, reject) => { 41 | ReactNativeDownloadManager.attachOnCompleteListener(downloadId, (err, data) => { 42 | if (err) { 43 | return reject(err); 44 | } 45 | return resolve(data); 46 | }); 47 | }); 48 | 49 | const cancel = (downloadId = '') => new Promise((resolve, reject) => { 50 | ReactNativeDownloadManager.cancel(downloadId, (err, data) => { 51 | if (err) { 52 | return reject(err); 53 | } 54 | return resolve(data); 55 | }); 56 | }); 57 | 58 | const checkStatus = (downloadId = '') => new Promise((resolve, reject) => { 59 | ReactNativeDownloadManager.checkStatus(downloadId, (err, data) => { 60 | if (err) { 61 | return reject(err); 62 | } 63 | return resolve(data); 64 | }); 65 | }); 66 | 67 | module.exports = { 68 | download, 69 | queueDownload, 70 | attachOnCompleteListener, 71 | cancel, 72 | checkStatus 73 | }; 74 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-simple-download-manager", 3 | "version": "1.4.1", 4 | "description": "A react native module that lets you download files using the native download manager.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo no tests && exit 1", 8 | "lint": "eslint app/", 9 | "lint:fix": "eslint app/ --fix" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/master-atul/react-native-download-manager" 14 | }, 15 | "keywords": [ 16 | "modal", 17 | "react", 18 | "native", 19 | "download", 20 | "manager", 21 | "ios", 22 | "android" 23 | ], 24 | "peerDependencies": { 25 | "react": "*", 26 | "react-native": "*" 27 | }, 28 | "author": "master-atul", 29 | "license": "MIT", 30 | "bugs": { 31 | "url": "https://github.com/master-atul/react-native-download-manager/issues" 32 | }, 33 | "homepage": "https://github.com/master-atul/react-native-download-manager", 34 | "devDependencies": { 35 | "babel-eslint": "^7.2.3", 36 | "eslint": "^4.0.0", 37 | "eslint-plugin-react": "^7.1.0", 38 | "eslint-plugin-react-native": "^2.3.2" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@^3.0.4: 12 | version "3.3.0" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 14 | 15 | acorn@^5.0.1: 16 | version "5.0.3" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" 18 | 19 | ajv-keywords@^1.0.0: 20 | version "1.5.1" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 22 | 23 | ajv@^4.7.0: 24 | version "4.11.8" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | ansi-escapes@^2.0.0: 31 | version "2.0.0" 32 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" 33 | 34 | ansi-regex@^2.0.0: 35 | version "2.1.1" 36 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 37 | 38 | ansi-styles@^2.2.1: 39 | version "2.2.1" 40 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 41 | 42 | argparse@^1.0.7: 43 | version "1.0.9" 44 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 45 | dependencies: 46 | sprintf-js "~1.0.2" 47 | 48 | array-union@^1.0.1: 49 | version "1.0.2" 50 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 51 | dependencies: 52 | array-uniq "^1.0.1" 53 | 54 | array-uniq@^1.0.1: 55 | version "1.0.3" 56 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 57 | 58 | arrify@^1.0.0: 59 | version "1.0.1" 60 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 61 | 62 | babel-code-frame@^6.22.0: 63 | version "6.22.0" 64 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 65 | dependencies: 66 | chalk "^1.1.0" 67 | esutils "^2.0.2" 68 | js-tokens "^3.0.0" 69 | 70 | babel-eslint@^7.2.3: 71 | version "7.2.3" 72 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" 73 | dependencies: 74 | babel-code-frame "^6.22.0" 75 | babel-traverse "^6.23.1" 76 | babel-types "^6.23.0" 77 | babylon "^6.17.0" 78 | 79 | babel-messages@^6.23.0: 80 | version "6.23.0" 81 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 82 | dependencies: 83 | babel-runtime "^6.22.0" 84 | 85 | babel-runtime@^6.22.0: 86 | version "6.23.0" 87 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 88 | dependencies: 89 | core-js "^2.4.0" 90 | regenerator-runtime "^0.10.0" 91 | 92 | babel-traverse@^6.23.1: 93 | version "6.25.0" 94 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" 95 | dependencies: 96 | babel-code-frame "^6.22.0" 97 | babel-messages "^6.23.0" 98 | babel-runtime "^6.22.0" 99 | babel-types "^6.25.0" 100 | babylon "^6.17.2" 101 | debug "^2.2.0" 102 | globals "^9.0.0" 103 | invariant "^2.2.0" 104 | lodash "^4.2.0" 105 | 106 | babel-types@^6.23.0, babel-types@^6.25.0: 107 | version "6.25.0" 108 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" 109 | dependencies: 110 | babel-runtime "^6.22.0" 111 | esutils "^2.0.2" 112 | lodash "^4.2.0" 113 | to-fast-properties "^1.0.1" 114 | 115 | babylon@^6.17.0, babylon@^6.17.2: 116 | version "6.17.4" 117 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" 118 | 119 | balanced-match@^1.0.0: 120 | version "1.0.0" 121 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 122 | 123 | brace-expansion@^1.1.7: 124 | version "1.1.8" 125 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 126 | dependencies: 127 | balanced-match "^1.0.0" 128 | concat-map "0.0.1" 129 | 130 | caller-path@^0.1.0: 131 | version "0.1.0" 132 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 133 | dependencies: 134 | callsites "^0.2.0" 135 | 136 | callsites@^0.2.0: 137 | version "0.2.0" 138 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 139 | 140 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 141 | version "1.1.3" 142 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 143 | dependencies: 144 | ansi-styles "^2.2.1" 145 | escape-string-regexp "^1.0.2" 146 | has-ansi "^2.0.0" 147 | strip-ansi "^3.0.0" 148 | supports-color "^2.0.0" 149 | 150 | circular-json@^0.3.1: 151 | version "0.3.1" 152 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 153 | 154 | cli-cursor@^2.1.0: 155 | version "2.1.0" 156 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 157 | dependencies: 158 | restore-cursor "^2.0.0" 159 | 160 | cli-width@^2.0.0: 161 | version "2.1.0" 162 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 163 | 164 | co@^4.6.0: 165 | version "4.6.0" 166 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 167 | 168 | concat-map@0.0.1: 169 | version "0.0.1" 170 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 171 | 172 | concat-stream@^1.6.0: 173 | version "1.6.0" 174 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 175 | dependencies: 176 | inherits "^2.0.3" 177 | readable-stream "^2.2.2" 178 | typedarray "^0.0.6" 179 | 180 | core-js@^2.4.0: 181 | version "2.4.1" 182 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 183 | 184 | core-util-is@~1.0.0: 185 | version "1.0.2" 186 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 187 | 188 | debug@^2.2.0, debug@^2.6.8: 189 | version "2.6.8" 190 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 191 | dependencies: 192 | ms "2.0.0" 193 | 194 | deep-is@~0.1.3: 195 | version "0.1.3" 196 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 197 | 198 | del@^2.0.2: 199 | version "2.2.2" 200 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 201 | dependencies: 202 | globby "^5.0.0" 203 | is-path-cwd "^1.0.0" 204 | is-path-in-cwd "^1.0.0" 205 | object-assign "^4.0.1" 206 | pify "^2.0.0" 207 | pinkie-promise "^2.0.0" 208 | rimraf "^2.2.8" 209 | 210 | doctrine@^2.0.0: 211 | version "2.0.0" 212 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" 213 | dependencies: 214 | esutils "^2.0.2" 215 | isarray "^1.0.0" 216 | 217 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 218 | version "1.0.5" 219 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 220 | 221 | eslint-plugin-react-native@^2.3.2: 222 | version "2.3.2" 223 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-2.3.2.tgz#e1b2ba2d97fb46b16fe2dbb5bd4d0f47419f2859" 224 | 225 | eslint-plugin-react@^7.1.0: 226 | version "7.1.0" 227 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.1.0.tgz#27770acf39f5fd49cd0af4083ce58104eb390d4c" 228 | dependencies: 229 | doctrine "^2.0.0" 230 | has "^1.0.1" 231 | jsx-ast-utils "^1.4.1" 232 | 233 | eslint-scope@^3.7.1: 234 | version "3.7.1" 235 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 236 | dependencies: 237 | esrecurse "^4.1.0" 238 | estraverse "^4.1.1" 239 | 240 | eslint@^4.0.0: 241 | version "4.0.0" 242 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.0.0.tgz#7277c01437fdf41dccd168d5aa0e49b75ca1f260" 243 | dependencies: 244 | babel-code-frame "^6.22.0" 245 | chalk "^1.1.3" 246 | concat-stream "^1.6.0" 247 | debug "^2.6.8" 248 | doctrine "^2.0.0" 249 | eslint-scope "^3.7.1" 250 | espree "^3.4.3" 251 | esquery "^1.0.0" 252 | estraverse "^4.2.0" 253 | esutils "^2.0.2" 254 | file-entry-cache "^2.0.0" 255 | glob "^7.1.2" 256 | globals "^9.17.0" 257 | ignore "^3.3.3" 258 | imurmurhash "^0.1.4" 259 | inquirer "^3.0.6" 260 | is-my-json-valid "^2.16.0" 261 | is-resolvable "^1.0.0" 262 | js-yaml "^3.8.4" 263 | json-stable-stringify "^1.0.1" 264 | levn "^0.3.0" 265 | lodash "^4.17.4" 266 | mkdirp "^0.5.1" 267 | natural-compare "^1.4.0" 268 | optionator "^0.8.2" 269 | path-is-inside "^1.0.2" 270 | pluralize "^4.0.0" 271 | progress "^2.0.0" 272 | require-uncached "^1.0.3" 273 | strip-json-comments "~2.0.1" 274 | table "^4.0.1" 275 | text-table "~0.2.0" 276 | 277 | espree@^3.4.3: 278 | version "3.4.3" 279 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" 280 | dependencies: 281 | acorn "^5.0.1" 282 | acorn-jsx "^3.0.0" 283 | 284 | esprima@^3.1.1: 285 | version "3.1.3" 286 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 287 | 288 | esquery@^1.0.0: 289 | version "1.0.0" 290 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 291 | dependencies: 292 | estraverse "^4.0.0" 293 | 294 | esrecurse@^4.1.0: 295 | version "4.2.0" 296 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 297 | dependencies: 298 | estraverse "^4.1.0" 299 | object-assign "^4.0.1" 300 | 301 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 302 | version "4.2.0" 303 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 304 | 305 | esutils@^2.0.2: 306 | version "2.0.2" 307 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 308 | 309 | external-editor@^2.0.4: 310 | version "2.0.4" 311 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" 312 | dependencies: 313 | iconv-lite "^0.4.17" 314 | jschardet "^1.4.2" 315 | tmp "^0.0.31" 316 | 317 | fast-levenshtein@~2.0.4: 318 | version "2.0.6" 319 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 320 | 321 | figures@^2.0.0: 322 | version "2.0.0" 323 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 324 | dependencies: 325 | escape-string-regexp "^1.0.5" 326 | 327 | file-entry-cache@^2.0.0: 328 | version "2.0.0" 329 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 330 | dependencies: 331 | flat-cache "^1.2.1" 332 | object-assign "^4.0.1" 333 | 334 | flat-cache@^1.2.1: 335 | version "1.2.2" 336 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 337 | dependencies: 338 | circular-json "^0.3.1" 339 | del "^2.0.2" 340 | graceful-fs "^4.1.2" 341 | write "^0.2.1" 342 | 343 | fs.realpath@^1.0.0: 344 | version "1.0.0" 345 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 346 | 347 | function-bind@^1.0.2: 348 | version "1.1.0" 349 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 350 | 351 | generate-function@^2.0.0: 352 | version "2.0.0" 353 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 354 | 355 | generate-object-property@^1.1.0: 356 | version "1.2.0" 357 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 358 | dependencies: 359 | is-property "^1.0.0" 360 | 361 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 362 | version "7.1.2" 363 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 364 | dependencies: 365 | fs.realpath "^1.0.0" 366 | inflight "^1.0.4" 367 | inherits "2" 368 | minimatch "^3.0.4" 369 | once "^1.3.0" 370 | path-is-absolute "^1.0.0" 371 | 372 | globals@^9.0.0, globals@^9.17.0: 373 | version "9.18.0" 374 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 375 | 376 | globby@^5.0.0: 377 | version "5.0.0" 378 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 379 | dependencies: 380 | array-union "^1.0.1" 381 | arrify "^1.0.0" 382 | glob "^7.0.3" 383 | object-assign "^4.0.1" 384 | pify "^2.0.0" 385 | pinkie-promise "^2.0.0" 386 | 387 | graceful-fs@^4.1.2: 388 | version "4.1.11" 389 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 390 | 391 | has-ansi@^2.0.0: 392 | version "2.0.0" 393 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 394 | dependencies: 395 | ansi-regex "^2.0.0" 396 | 397 | has@^1.0.1: 398 | version "1.0.1" 399 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 400 | dependencies: 401 | function-bind "^1.0.2" 402 | 403 | iconv-lite@^0.4.17: 404 | version "0.4.18" 405 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" 406 | 407 | ignore@^3.3.3: 408 | version "3.3.3" 409 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" 410 | 411 | imurmurhash@^0.1.4: 412 | version "0.1.4" 413 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 414 | 415 | inflight@^1.0.4: 416 | version "1.0.6" 417 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 418 | dependencies: 419 | once "^1.3.0" 420 | wrappy "1" 421 | 422 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 423 | version "2.0.3" 424 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 425 | 426 | inquirer@^3.0.6: 427 | version "3.1.1" 428 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" 429 | dependencies: 430 | ansi-escapes "^2.0.0" 431 | chalk "^1.0.0" 432 | cli-cursor "^2.1.0" 433 | cli-width "^2.0.0" 434 | external-editor "^2.0.4" 435 | figures "^2.0.0" 436 | lodash "^4.3.0" 437 | mute-stream "0.0.7" 438 | run-async "^2.2.0" 439 | rx-lite "^4.0.8" 440 | rx-lite-aggregates "^4.0.8" 441 | string-width "^2.0.0" 442 | strip-ansi "^3.0.0" 443 | through "^2.3.6" 444 | 445 | invariant@^2.2.0: 446 | version "2.2.2" 447 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 448 | dependencies: 449 | loose-envify "^1.0.0" 450 | 451 | is-fullwidth-code-point@^2.0.0: 452 | version "2.0.0" 453 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 454 | 455 | is-my-json-valid@^2.16.0: 456 | version "2.16.0" 457 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" 458 | dependencies: 459 | generate-function "^2.0.0" 460 | generate-object-property "^1.1.0" 461 | jsonpointer "^4.0.0" 462 | xtend "^4.0.0" 463 | 464 | is-path-cwd@^1.0.0: 465 | version "1.0.0" 466 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 467 | 468 | is-path-in-cwd@^1.0.0: 469 | version "1.0.0" 470 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 471 | dependencies: 472 | is-path-inside "^1.0.0" 473 | 474 | is-path-inside@^1.0.0: 475 | version "1.0.0" 476 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 477 | dependencies: 478 | path-is-inside "^1.0.1" 479 | 480 | is-promise@^2.1.0: 481 | version "2.1.0" 482 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 483 | 484 | is-property@^1.0.0: 485 | version "1.0.2" 486 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 487 | 488 | is-resolvable@^1.0.0: 489 | version "1.0.0" 490 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 491 | dependencies: 492 | tryit "^1.0.1" 493 | 494 | isarray@^1.0.0, isarray@~1.0.0: 495 | version "1.0.0" 496 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 497 | 498 | js-tokens@^3.0.0: 499 | version "3.0.1" 500 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 501 | 502 | js-yaml@^3.8.4: 503 | version "3.8.4" 504 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" 505 | dependencies: 506 | argparse "^1.0.7" 507 | esprima "^3.1.1" 508 | 509 | jschardet@^1.4.2: 510 | version "1.4.2" 511 | resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" 512 | 513 | json-stable-stringify@^1.0.1: 514 | version "1.0.1" 515 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 516 | dependencies: 517 | jsonify "~0.0.0" 518 | 519 | jsonify@~0.0.0: 520 | version "0.0.0" 521 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 522 | 523 | jsonpointer@^4.0.0: 524 | version "4.0.1" 525 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 526 | 527 | jsx-ast-utils@^1.4.1: 528 | version "1.4.1" 529 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" 530 | 531 | levn@^0.3.0, levn@~0.3.0: 532 | version "0.3.0" 533 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 534 | dependencies: 535 | prelude-ls "~1.1.2" 536 | type-check "~0.3.2" 537 | 538 | lodash@^4.0.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: 539 | version "4.17.4" 540 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 541 | 542 | loose-envify@^1.0.0: 543 | version "1.3.1" 544 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 545 | dependencies: 546 | js-tokens "^3.0.0" 547 | 548 | mimic-fn@^1.0.0: 549 | version "1.1.0" 550 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 551 | 552 | minimatch@^3.0.4: 553 | version "3.0.4" 554 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 555 | dependencies: 556 | brace-expansion "^1.1.7" 557 | 558 | minimist@0.0.8: 559 | version "0.0.8" 560 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 561 | 562 | mkdirp@^0.5.1: 563 | version "0.5.1" 564 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 565 | dependencies: 566 | minimist "0.0.8" 567 | 568 | ms@2.0.0: 569 | version "2.0.0" 570 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 571 | 572 | mute-stream@0.0.7: 573 | version "0.0.7" 574 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 575 | 576 | natural-compare@^1.4.0: 577 | version "1.4.0" 578 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 579 | 580 | object-assign@^4.0.1: 581 | version "4.1.1" 582 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 583 | 584 | once@^1.3.0: 585 | version "1.4.0" 586 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 587 | dependencies: 588 | wrappy "1" 589 | 590 | onetime@^2.0.0: 591 | version "2.0.1" 592 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 593 | dependencies: 594 | mimic-fn "^1.0.0" 595 | 596 | optionator@^0.8.2: 597 | version "0.8.2" 598 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 599 | dependencies: 600 | deep-is "~0.1.3" 601 | fast-levenshtein "~2.0.4" 602 | levn "~0.3.0" 603 | prelude-ls "~1.1.2" 604 | type-check "~0.3.2" 605 | wordwrap "~1.0.0" 606 | 607 | os-tmpdir@~1.0.1: 608 | version "1.0.2" 609 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 610 | 611 | path-is-absolute@^1.0.0: 612 | version "1.0.1" 613 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 614 | 615 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 616 | version "1.0.2" 617 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 618 | 619 | pify@^2.0.0: 620 | version "2.3.0" 621 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 622 | 623 | pinkie-promise@^2.0.0: 624 | version "2.0.1" 625 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 626 | dependencies: 627 | pinkie "^2.0.0" 628 | 629 | pinkie@^2.0.0: 630 | version "2.0.4" 631 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 632 | 633 | pluralize@^4.0.0: 634 | version "4.0.0" 635 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" 636 | 637 | prelude-ls@~1.1.2: 638 | version "1.1.2" 639 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 640 | 641 | process-nextick-args@~1.0.6: 642 | version "1.0.7" 643 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 644 | 645 | progress@^2.0.0: 646 | version "2.0.0" 647 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 648 | 649 | readable-stream@^2.2.2: 650 | version "2.3.2" 651 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.2.tgz#5a04df05e4f57fe3f0dc68fdd11dc5c97c7e6f4d" 652 | dependencies: 653 | core-util-is "~1.0.0" 654 | inherits "~2.0.3" 655 | isarray "~1.0.0" 656 | process-nextick-args "~1.0.6" 657 | safe-buffer "~5.1.0" 658 | string_decoder "~1.0.0" 659 | util-deprecate "~1.0.1" 660 | 661 | regenerator-runtime@^0.10.0: 662 | version "0.10.5" 663 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 664 | 665 | require-uncached@^1.0.3: 666 | version "1.0.3" 667 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 668 | dependencies: 669 | caller-path "^0.1.0" 670 | resolve-from "^1.0.0" 671 | 672 | resolve-from@^1.0.0: 673 | version "1.0.1" 674 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 675 | 676 | restore-cursor@^2.0.0: 677 | version "2.0.0" 678 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 679 | dependencies: 680 | onetime "^2.0.0" 681 | signal-exit "^3.0.2" 682 | 683 | rimraf@^2.2.8: 684 | version "2.6.1" 685 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 686 | dependencies: 687 | glob "^7.0.5" 688 | 689 | run-async@^2.2.0: 690 | version "2.3.0" 691 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 692 | dependencies: 693 | is-promise "^2.1.0" 694 | 695 | rx-lite-aggregates@^4.0.8: 696 | version "4.0.8" 697 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 698 | dependencies: 699 | rx-lite "*" 700 | 701 | rx-lite@*, rx-lite@^4.0.8: 702 | version "4.0.8" 703 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 704 | 705 | safe-buffer@~5.1.0: 706 | version "5.1.1" 707 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 708 | 709 | signal-exit@^3.0.2: 710 | version "3.0.2" 711 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 712 | 713 | slice-ansi@0.0.4: 714 | version "0.0.4" 715 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 716 | 717 | sprintf-js@~1.0.2: 718 | version "1.0.3" 719 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 720 | 721 | string-width@^2.0.0: 722 | version "2.0.0" 723 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 724 | dependencies: 725 | is-fullwidth-code-point "^2.0.0" 726 | strip-ansi "^3.0.0" 727 | 728 | string_decoder@~1.0.0: 729 | version "1.0.3" 730 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 731 | dependencies: 732 | safe-buffer "~5.1.0" 733 | 734 | strip-ansi@^3.0.0: 735 | version "3.0.1" 736 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 737 | dependencies: 738 | ansi-regex "^2.0.0" 739 | 740 | strip-json-comments@~2.0.1: 741 | version "2.0.1" 742 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 743 | 744 | supports-color@^2.0.0: 745 | version "2.0.0" 746 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 747 | 748 | table@^4.0.1: 749 | version "4.0.1" 750 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" 751 | dependencies: 752 | ajv "^4.7.0" 753 | ajv-keywords "^1.0.0" 754 | chalk "^1.1.1" 755 | lodash "^4.0.0" 756 | slice-ansi "0.0.4" 757 | string-width "^2.0.0" 758 | 759 | text-table@~0.2.0: 760 | version "0.2.0" 761 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 762 | 763 | through@^2.3.6: 764 | version "2.3.8" 765 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 766 | 767 | tmp@^0.0.31: 768 | version "0.0.31" 769 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 770 | dependencies: 771 | os-tmpdir "~1.0.1" 772 | 773 | to-fast-properties@^1.0.1: 774 | version "1.0.3" 775 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 776 | 777 | tryit@^1.0.1: 778 | version "1.0.3" 779 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 780 | 781 | type-check@~0.3.2: 782 | version "0.3.2" 783 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 784 | dependencies: 785 | prelude-ls "~1.1.2" 786 | 787 | typedarray@^0.0.6: 788 | version "0.0.6" 789 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 790 | 791 | util-deprecate@~1.0.1: 792 | version "1.0.2" 793 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 794 | 795 | wordwrap@~1.0.0: 796 | version "1.0.0" 797 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 798 | 799 | wrappy@1: 800 | version "1.0.2" 801 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 802 | 803 | write@^0.2.1: 804 | version "0.2.1" 805 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 806 | dependencies: 807 | mkdirp "^0.5.1" 808 | 809 | xtend@^4.0.0: 810 | version "4.0.1" 811 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 812 | --------------------------------------------------------------------------------