├── .eslintrc ├── .flowconfig ├── .gitignore ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── index.d.ts ├── index.js ├── jsconfig.json ├── lib ├── KeyboardAwareFlatList.js ├── KeyboardAwareHOC.js ├── KeyboardAwareInterface.js ├── KeyboardAwareScrollView.js └── KeyboardAwareSectionList.js ├── package.json └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "babel-eslint", 3 | "parserOptions": { 4 | "ecmaFeatures": { 5 | "jsx": true 6 | } 7 | }, 8 | "env": { 9 | "es6": true, 10 | "jasmine": true 11 | }, 12 | "plugins": ["react", "react-native", "flowtype"], 13 | // Map from global var to bool specifying if it can be redefined 14 | "globals": { 15 | "__DEV__": true, 16 | "__dirname": false, 17 | "__fbBatchedBridgeConfig": false, 18 | "alert": false, 19 | "cancelAnimationFrame": false, 20 | "cancelIdleCallback": false, 21 | "clearImmediate": true, 22 | "clearInterval": false, 23 | "clearTimeout": false, 24 | "console": false, 25 | "document": false, 26 | "escape": false, 27 | "Event": false, 28 | "EventTarget": false, 29 | "exports": false, 30 | "fetch": false, 31 | "FormData": false, 32 | "global": false, 33 | "Generator": true, 34 | "jest": false, 35 | "Map": true, 36 | "module": false, 37 | "navigator": false, 38 | "process": false, 39 | "Promise": true, 40 | "requestAnimationFrame": true, 41 | "requestIdleCallback": true, 42 | "require": false, 43 | "Set": true, 44 | "setImmediate": true, 45 | "setInterval": false, 46 | "setTimeout": false, 47 | "window": false, 48 | "XMLHttpRequest": false, 49 | "pit": false, 50 | "test": true, 51 | // Flow global types. 52 | "ReactComponent": false, 53 | "ReactClass": false, 54 | "ReactElement": false, 55 | "ReactPropsCheckType": false, 56 | "ReactPropsChainableTypeChecker": false, 57 | "ReactPropTypes": false, 58 | "SyntheticEvent": false, 59 | "$Either": false, 60 | "$All": false, 61 | "$ArrayBufferView": false, 62 | "$Tuple": false, 63 | "$Supertype": false, 64 | "$Subtype": false, 65 | "$Shape": false, 66 | "$Diff": false, 67 | "$Keys": false, 68 | "$Enum": false, 69 | "$Exports": false, 70 | "$FlowIssue": false, 71 | "$FlowFixMe": false, 72 | "$FixMe": false 73 | }, 74 | "rules": { 75 | "comma-dangle": 0, // disallow trailing commas in object literals 76 | "no-cond-assign": 1, // disallow assignment in conditional expressions 77 | "no-console": 0, // disallow use of console (off by default in the node environment) 78 | "no-const-assign": 2, // disallow assignment to const-declared variables 79 | "no-constant-condition": 0, // disallow use of constant expressions in conditions 80 | "no-control-regex": 1, // disallow control characters in regular expressions 81 | "no-debugger": 0, // disallow use of debugger 82 | "no-dupe-keys": 1, // disallow duplicate keys when creating object literals 83 | "no-empty": 0, // disallow empty statements 84 | "no-ex-assign": 1, // disallow assigning to the exception in a catch block 85 | "no-extra-boolean-cast": 1, // disallow double-negation boolean casts in a boolean context 86 | "no-extra-parens": 0, // disallow unnecessary parentheses (off by default) 87 | "no-extra-semi": 1, // disallow unnecessary semicolons 88 | "no-func-assign": 1, // disallow overwriting functions written as function declarations 89 | "no-inner-declarations": 0, // disallow function or variable declarations in nested blocks 90 | "no-invalid-regexp": 1, // disallow invalid regular expression strings in the RegExp constructor 91 | "no-negated-in-lhs": 1, // disallow negation of the left operand of an in expression 92 | "no-obj-calls": 1, // disallow the use of object properties of the global object (Math and JSON) as functions 93 | "no-regex-spaces": 1, // disallow multiple spaces in a regular expression literal 94 | "no-reserved-keys": 0, // disallow reserved words being used as object literal keys (off by default) 95 | "no-sparse-arrays": 1, // disallow sparse arrays 96 | "no-unreachable": 1, // disallow unreachable statements after a return, throw, continue, or break statement 97 | "use-isnan": 1, // disallow comparisons with the value NaN 98 | "valid-jsdoc": 0, // Ensure JSDoc comments are valid (off by default) 99 | "valid-typeof": 1, // Ensure that the results of typeof are compared against a valid string 100 | // Best Practices 101 | // These are rules designed to prevent you from making mistakes. They either prescribe a better way of doing something or help you avoid footguns. 102 | "block-scoped-var": 0, // treat var statements as if they were block scoped (off by default) 103 | "complexity": 0, // specify the maximum cyclomatic complexity allowed in a program (off by default) 104 | "consistent-return": 0, // require return statements to either always or never specify values 105 | "curly": 1, // specify curly brace conventions for all control statements 106 | "default-case": 0, // require default case in switch statements (off by default) 107 | "dot-notation": 1, // encourages use of dot notation whenever possible 108 | "eqeqeq": [1, "allow-null"], // require the use of === and !== 109 | "guard-for-in": 0, // make sure for-in loops have an if statement (off by default) 110 | "no-alert": 1, // disallow the use of alert, confirm, and prompt 111 | "no-caller": 1, // disallow use of arguments.caller or arguments.callee 112 | "no-div-regex": 1, // disallow division operators explicitly at beginning of regular expression (off by default) 113 | "no-else-return": 0, // disallow else after a return in an if (off by default) 114 | "no-eq-null": 0, // disallow comparisons to null without a type-checking operator (off by default) 115 | "no-eval": 1, // disallow use of eval() 116 | "no-extend-native": 1, // disallow adding to native types 117 | "no-extra-bind": 1, // disallow unnecessary function binding 118 | "no-fallthrough": 1, // disallow fallthrough of case statements 119 | "no-floating-decimal": 1, // disallow the use of leading or trailing decimal points in numeric literals (off by default) 120 | "no-implied-eval": 1, // disallow use of eval()-like methods 121 | "no-labels": 1, // disallow use of labeled statements 122 | "no-iterator": 1, // disallow usage of __iterator__ property 123 | "no-lone-blocks": 1, // disallow unnecessary nested blocks 124 | "no-loop-func": 0, // disallow creation of functions within loops 125 | "no-multi-str": 0, // disallow use of multiline strings 126 | "no-native-reassign": 0, // disallow reassignments of native objects 127 | "no-new": 1, // disallow use of new operator when not part of the assignment or comparison 128 | "no-new-func": 1, // disallow use of new operator for Function object 129 | "no-new-wrappers": 1, // disallows creating new instances of String,Number, and Boolean 130 | "no-octal": 1, // disallow use of octal literals 131 | "no-octal-escape": 1, // disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251"; 132 | "no-proto": 1, // disallow usage of __proto__ property 133 | "no-redeclare": 0, // disallow declaring the same variable more then once 134 | "no-return-assign": 1, // disallow use of assignment in return statement 135 | "no-script-url": 1, // disallow use of javascript: urls. 136 | "no-self-compare": 1, // disallow comparisons where both sides are exactly the same (off by default) 137 | "no-sequences": 1, // disallow use of comma operator 138 | "no-unused-expressions": 0, // disallow usage of expressions in statement position 139 | "no-void": 1, // disallow use of void operator (off by default) 140 | "no-warning-comments": 0, // disallow usage of configurable warning terms in comments": 1, // e.g. TODO or FIXME (off by default) 141 | "no-with": 1, // disallow use of the with statement 142 | "radix": 1, // require use of the second argument for parseInt() (off by default) 143 | "semi-spacing": 1, // require a space after a semi-colon 144 | "vars-on-top": 0, // requires to declare all vars on top of their containing scope (off by default) 145 | "wrap-iife": 0, // require immediate function invocation to be wrapped in parentheses (off by default) 146 | "yoda": 1, // require or disallow Yoda conditions 147 | // Variables 148 | // These rules have to do with variable declarations. 149 | "no-catch-shadow": 1, // disallow the catch clause parameter name being the same as a variable in the outer scope (off by default in the node environment) 150 | "no-delete-var": 1, // disallow deletion of variables 151 | "no-label-var": 1, // disallow labels that share a name with a variable 152 | "no-shadow": 1, // disallow declaration of variables already declared in the outer scope 153 | "no-shadow-restricted-names": 1, // disallow shadowing of names such as arguments 154 | "no-undef": 2, // disallow use of undeclared variables unless mentioned in a /*global */ block 155 | "no-undefined": 0, // disallow use of undefined variable (off by default) 156 | "no-undef-init": 1, // disallow use of undefined when initializing variables 157 | "no-unused-vars": [ 158 | 1, 159 | { 160 | "vars": "all", 161 | "args": "none" 162 | } 163 | ], // disallow declaration of variables that are not used in the code 164 | "no-use-before-define": 0, // disallow use of variables before they are defined 165 | // Node.js 166 | // These rules are specific to JavaScript running on Node.js. 167 | "handle-callback-err": 1, // enforces error handling in callbacks (off by default) (on by default in the node environment) 168 | "no-mixed-requires": 1, // disallow mixing regular variable and require declarations (off by default) (on by default in the node environment) 169 | "no-new-require": 1, // disallow use of new operator with the require function (off by default) (on by default in the node environment) 170 | "no-path-concat": 1, // disallow string concatenation with __dirname and __filename (off by default) (on by default in the node environment) 171 | "no-process-exit": 0, // disallow process.exit() (on by default in the node environment) 172 | "no-restricted-modules": 1, // restrict usage of specified node modules (off by default) 173 | "no-sync": 0, // disallow use of synchronous methods (off by default) 174 | // Stylistic Issues 175 | // These rules are purely matters of style and are quite subjective. 176 | "key-spacing": 0, 177 | "keyword-spacing": 1, // enforce spacing before and after keywords 178 | "jsx-quotes": [1, "prefer-single"], 179 | "comma-spacing": 0, 180 | "no-multi-spaces": 0, 181 | "brace-style": 0, // enforce one true brace style (off by default) 182 | "camelcase": 0, // require camel case names 183 | "consistent-this": [1, "self"], // enforces consistent naming when capturing the current execution context (off by default) 184 | "eol-last": 1, // enforce newline at the end of file, with no multiple empty lines 185 | "func-names": 0, // require function expressions to have a name (off by default) 186 | "func-style": 0, // enforces use of function declarations or expressions (off by default) 187 | "new-cap": 0, // require a capital letter for constructors 188 | "new-parens": 1, // disallow the omission of parentheses when invoking a constructor with no arguments 189 | "no-nested-ternary": 0, // disallow nested ternary expressions (off by default) 190 | "no-array-constructor": 1, // disallow use of the Array constructor 191 | "no-lonely-if": 0, // disallow if as the only statement in an else block (off by default) 192 | "no-new-object": 1, // disallow use of the Object constructor 193 | "no-spaced-func": 1, // disallow space between function identifier and application 194 | "no-ternary": 0, // disallow the use of ternary operators (off by default) 195 | "no-trailing-spaces": 1, // disallow trailing whitespace at the end of lines 196 | "no-underscore-dangle": 0, // disallow dangling underscores in identifiers 197 | "no-mixed-spaces-and-tabs": 1, // disallow mixed spaces and tabs for indentation 198 | "quotes": [1, "single", "avoid-escape"], // specify whether double or single quotes should be used 199 | "quote-props": 0, // require quotes around object literal property names (off by default) 200 | "semi": ["error", "never"], // require or disallow use of semicolons instead of ASI 201 | "sort-vars": 0, // sort variables within the same declaration block (off by default) 202 | "space-in-brackets": 0, // require or disallow spaces inside brackets (off by default) 203 | "space-in-parens": 0, // require or disallow spaces inside parentheses (off by default) 204 | "space-infix-ops": 1, // require spaces around operators 205 | "space-unary-ops": [ 206 | 1, 207 | { 208 | "words": true, 209 | "nonwords": false 210 | } 211 | ], // require or disallow spaces before/after unary operators (words on by default, nonwords off by default) 212 | "max-nested-callbacks": 0, // specify the maximum depth callbacks can be nested (off by default) 213 | "one-var": 0, // allow just one var statement per function (off by default) 214 | "wrap-regex": 0, // require regex literals to be wrapped in parentheses (off by default) 215 | // Legacy 216 | // The following rules are included for compatibility with JSHint and JSLint. While the names of the rules may not match up with the JSHint/JSLint counterpart, the functionality is the same. 217 | "max-depth": 0, // specify the maximum depth that blocks can be nested (off by default) 218 | "max-len": 0, // specify the maximum length of a line in your program (off by default) 219 | "max-params": 0, // limits the number of parameters that can be used in the function declaration. (off by default) 220 | "max-statements": 0, // specify the maximum number of statement allowed in a function (off by default) 221 | "no-bitwise": 1, // disallow use of bitwise operators (off by default) 222 | "no-plusplus": 0, // disallow use of unary operators, ++ and -- (off by default) 223 | // React Plugin 224 | // The following rules are made available via `eslint-plugin-react`. 225 | "react/display-name": 0, 226 | "react/jsx-boolean-value": 0, 227 | "react/jsx-no-duplicate-props": 2, 228 | "react/jsx-no-undef": 1, 229 | "react/jsx-sort-props": 0, 230 | "react/jsx-uses-react": 1, 231 | "react/jsx-uses-vars": 1, 232 | "react/no-did-mount-set-state": 1, 233 | "react/no-did-update-set-state": 1, 234 | "react/no-multi-comp": 0, 235 | "react/no-string-refs": 1, 236 | "react/no-unknown-property": 0, 237 | "react/prop-types": 0, 238 | "react/react-in-jsx-scope": 1, 239 | "react/self-closing-comp": 1, 240 | "react/wrap-multilines": 0, 241 | // Flowtype Plugin 242 | "flowtype/boolean-style": [2, "boolean"], 243 | "flowtype/define-flow-type": 1, 244 | "flowtype/delimiter-dangle": [2, "never"], 245 | "flowtype/generic-spacing": [2, "never"], 246 | "flowtype/no-primitive-constructor-types": 2, 247 | "flowtype/no-weak-types": 0, 248 | "flowtype/object-type-delimiter": [2, "comma"], 249 | "flowtype/require-parameter-type": 2, 250 | "flowtype/require-return-type": 0, 251 | "flowtype/require-valid-file-annotation": 2, 252 | "flowtype/semi": [2, "never"], 253 | "flowtype/space-after-type-colon": [2, "always"], 254 | "flowtype/space-before-generic-bracket": [2, "never"], 255 | "flowtype/space-before-type-colon": [2, "never"], 256 | "flowtype/type-id-match": 0, 257 | "flowtype/union-intersection-spacing": [2, "always"], 258 | "flowtype/use-flow-type": 1, 259 | "flowtype/valid-syntax": 1 260 | } 261 | } 262 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | 3 | # We fork some components by platform. 4 | .*/*.web.js 5 | .*/*.android.js 6 | 7 | # Some modules have their own node_modules with overlap 8 | .*/node_modules/node-haste/.* 9 | 10 | # Ugh 11 | .*/node_modules/babel.* 12 | .*/node_modules/babylon.* 13 | .*/node_modules/invariant.* 14 | 15 | # Ignore react and fbjs where there are overlaps, but don't ignore 16 | # anything that react-native relies on 17 | .*/node_modules/fbjs/lib/Map.js 18 | .*/node_modules/fbjs/lib/fetch.js 19 | .*/node_modules/fbjs/lib/ExecutionEnvironment.js 20 | .*/node_modules/fbjs/lib/ErrorUtils.js 21 | 22 | # Flow has a built-in definition for the 'react' module which we prefer to use 23 | # over the currently-untyped source 24 | .*/node_modules/react/react.js 25 | .*/node_modules/react/lib/React.js 26 | .*/node_modules/react/lib/ReactDOM.js 27 | 28 | .*/__mocks__/.* 29 | .*/__tests__/.* 30 | 31 | .*/commoner/test/source/widget/share.js 32 | 33 | # Ignore commoner tests 34 | .*/node_modules/commoner/test/.* 35 | 36 | # See https://github.com/facebook/flow/issues/442 37 | .*/react-tools/node_modules/commoner/lib/reader.js 38 | 39 | # Ignore jest 40 | .*/node_modules/jest-cli/.* 41 | 42 | # Ignore Website 43 | .*/website/.* 44 | 45 | # Ignore generators 46 | .*/local-cli/generator.* 47 | 48 | # Ignore BUCK generated folders 49 | .*\.buckd/ 50 | 51 | .*/node_modules/is-my-json-valid/test/.*\.json 52 | .*/node_modules/iconv-lite/encodings/tables/.*\.json 53 | .*/node_modules/y18n/test/.*\.json 54 | .*/node_modules/spdx-license-ids/spdx-license-ids.json 55 | .*/node_modules/spdx-exceptions/index.json 56 | .*/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json 57 | .*/node_modules/resolve/lib/core.json 58 | .*/node_modules/jsonparse/samplejson/.*\.json 59 | .*/node_modules/json5/test/.*\.json 60 | .*/node_modules/ua-parser-js/test/.*\.json 61 | .*/node_modules/builtin-modules/builtin-modules.json 62 | .*/node_modules/binary-extensions/binary-extensions.json 63 | .*/node_modules/url-regex/tlds.json 64 | .*/node_modules/joi/.*\.json 65 | .*/node_modules/isemail/.*\.json 66 | .*/node_modules/tr46/.*\.json 67 | 68 | 69 | [include] 70 | 71 | [libs] 72 | node_modules/react-native/Libraries/react-native/react-native-interface.js 73 | node_modules/react-native/flow 74 | flow/ 75 | 76 | [options] 77 | module.system=haste 78 | 79 | esproposal.class_static_fields=enable 80 | esproposal.class_instance_fields=enable 81 | 82 | munge_underscores=true 83 | 84 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' 85 | 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\)$' -> 'RelativeImageStub' 86 | 87 | suppress_type=$FlowIssue 88 | suppress_type=$FlowFixMe 89 | suppress_type=$FixMe 90 | 91 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-3]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 92 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-3]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 93 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 94 | 95 | [version] 96 | >=0.47.0 97 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | node_modules 3 | AwesomeProject.xcodeproj 4 | AwesomeProjectTests 5 | index.ios.js 6 | iOS 7 | 8 | .idea/ 9 | .vscode/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 14 4 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | 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. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | 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. 28 | 29 | 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. 30 | 31 | ## Scope 32 | 33 | 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. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at amedina@apsl.net. 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. 38 | 39 | 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. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 APSL 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 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-keyboard-aware-scroll-view 2 | 3 |

4 | 5 | 6 | 7 |

8 | 9 | A ScrollView component that handles keyboard appearance and automatically scrolls to focused `TextInput`. 10 | 11 |

12 | Scroll demo 13 |

14 | 15 | ## Supported versions 16 | 17 | - `v0.4.0` requires `RN>=0.48` 18 | - `v0.2.0` requires `RN>=0.32.0`. 19 | - `v0.1.2` requires `RN>=0.27.2` but you should use `0.2.0` in order to make it work with multiple scroll views. 20 | - `v0.0.7` requires `react-native>=0.25.0`. 21 | - Use `v0.0.6` for older RN versions. 22 | 23 | ## Installation 24 | 25 | Installation can be done through `npm` or `yarn`: 26 | 27 | ```shell 28 | npm i react-native-keyboard-aware-scroll-view --save 29 | ``` 30 | 31 | ```shell 32 | yarn add react-native-keyboard-aware-scroll-view 33 | ``` 34 | 35 | ## Usage 36 | 37 | You can use the `KeyboardAwareScrollView`, `KeyboardAwareSectionList` or the `KeyboardAwareFlatList` 38 | components. They accept `ScrollView`, `SectionList` and `FlatList` default props respectively and 39 | implement a custom high order component called `KeyboardAwareHOC` to handle keyboard appearance. 40 | The high order component is also available if you want to use it in any other component. 41 | 42 | Import `react-native-keyboard-aware-scroll-view` and wrap your content inside 43 | it: 44 | 45 | ```js 46 | import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' 47 | ``` 48 | 49 | ```jsx 50 | 51 | 52 | 53 | 54 | 55 | ``` 56 | 57 | ## Auto-scroll in `TextInput` fields 58 | 59 | As of `v0.1.0`, the component auto scrolls to the focused `TextInput` 😎. For versions `v0.0.7` and older you can do the following. 60 | 61 | ### Programatically scroll to any `TextInput` 62 | 63 | In order to scroll to any `TextInput` field, you can use the built-in method `scrollToFocusedInput`. Example: 64 | 65 | ```js 66 | _scrollToInput (reactNode: any) { 67 | // Add a 'scroll' ref to your ScrollView 68 | this.scroll.props.scrollToFocusedInput(reactNode) 69 | } 70 | ``` 71 | 72 | ```jsx 73 | { 75 | this.scroll = ref 76 | }}> 77 | 78 | { 80 | // `bind` the function if you're using ES6 classes 81 | this._scrollToInput(ReactNative.findNodeHandle(event.target)) 82 | }} 83 | /> 84 | 85 | 86 | ``` 87 | 88 | ### Programatically scroll to any position 89 | 90 | There's another built-in function that lets you programatically scroll to any position of the scroll view: 91 | 92 | ```js 93 | this.scroll.props.scrollToPosition(0, 0) 94 | ``` 95 | 96 | ## Register to keyboard events 97 | 98 | You can register to `ScrollViewResponder` events `onKeyboardWillShow` and `onKeyboardWillHide`: 99 | 100 | ```jsx 101 | { 103 | console.log('Keyboard event', frames) 104 | }}> 105 | 106 | 107 | 108 | 109 | ``` 110 | 111 | ## Android Support 112 | 113 | First, Android natively has this feature, you can easily enable it by setting `windowSoftInputMode` in `AndroidManifest.xml`. Check [here](https://developer.android.com/guide/topics/manifest/activity-element.html#wsoft). 114 | 115 | But if you want to use feature like `extraHeight`, you need to enable Android Support with the following steps: 116 | 117 | - Make sure you are using react-native `0.46` or above. 118 | - Set `windowSoftInputMode` to `adjustPan` in `AndroidManifest.xml`. 119 | - Set `enableOnAndroid` property to `true`. 120 | 121 | Android Support is not perfect, here is the supported list: 122 | 123 | | **Prop** | **Android Support** | 124 | | --------------------------- | ------------------- | 125 | | `viewIsInsideTabBar` | Yes | 126 | | `resetScrollToCoords` | Yes | 127 | | `enableAutomaticScroll` | Yes | 128 | | `extraHeight` | Yes | 129 | | `extraScrollHeight` | Yes | 130 | | `enableResetScrollToCoords` | Yes | 131 | | `keyboardOpeningTime` | No | 132 | 133 | ## API 134 | 135 | ### Props 136 | 137 | All the `ScrollView`/`FlatList` props will be passed. 138 | 139 | | **Prop** | **Type** | **Description** | 140 | | --------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------- | 141 | | `innerRef` | `Function` | Catch the reference of the component. | 142 | | `viewIsInsideTabBar` | `boolean` | Adds an extra offset that represents the `TabBarIOS` height. | 143 | | `resetScrollToCoords` | `Object: {x: number, y: number}` | Coordinates that will be used to reset the scroll when the keyboard hides. | 144 | | `enableAutomaticScroll` | `boolean` | When focus in `TextInput` will scroll the position, default is enabled. | 145 | | `extraHeight` | `number` | Adds an extra offset when focusing the `TextInput`s. | 146 | | `extraScrollHeight` | `number` | Adds an extra offset to the keyboard. Useful if you want to stick elements above the keyboard. | 147 | | `enableResetScrollToCoords` | `boolean` | Lets the user enable or disable automatic resetScrollToCoords. | 148 | | `keyboardOpeningTime` | `number` | Sets the delay time before scrolling to new position, default is 250 | 149 | | `enableOnAndroid` | `boolean` | Enable Android Support | 150 | 151 | ### Methods 152 | 153 | Use `innerRef` to get the component reference and use `this.scrollRef.props` to access these methods. 154 | 155 | | **Method** | **Parameter** | **Description** | 156 | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | 157 | | `getScrollResponder` | `void` | Get `ScrollResponder` | 158 | | `scrollToPosition` | `x: number, y: number, animated: bool = true` | Scroll to specific position with or without animation. | 159 | | `scrollToEnd` | `animated?: bool = true` | Scroll to end with or without animation. | 160 | | `scrollIntoView` | `element: React.Element<*>, options: { getScrollPosition: ?(parentLayout, childLayout, contentOffset) => { x: number, y: number, animated: boolean } }` | Scrolls an element inside a KeyboardAwareScrollView into view. | 161 | 162 | ### Using high order component 163 | 164 | Enabling any component to be keyboard-aware is very easy. Take a look at the code of `KeyboardAwareFlatList`: 165 | 166 | ```js 167 | /* @flow */ 168 | 169 | import { FlatList } from 'react-native' 170 | import listenToKeyboardEvents from './KeyboardAwareHOC' 171 | 172 | export default listenToKeyboardEvents(FlatList) 173 | ``` 174 | 175 | The HOC can also be configured. Sometimes it's more convenient to provide a static config than configuring the behavior with props. This HOC config can be overriden with props. 176 | 177 | ```js 178 | /* @flow */ 179 | 180 | import { FlatList } from 'react-native' 181 | import listenToKeyboardEvents from './KeyboardAwareHOC' 182 | 183 | const config = { 184 | enableOnAndroid: true, 185 | enableAutomaticScroll: true 186 | } 187 | 188 | export default listenToKeyboardEvents(config)(FlatList) 189 | ``` 190 | 191 | The available config options are: 192 | 193 | ```js 194 | { 195 | enableOnAndroid: boolean, 196 | contentContainerStyle: ?Object, 197 | enableAutomaticScroll: boolean, 198 | extraHeight: number, 199 | extraScrollHeight: number, 200 | enableResetScrollToCoords: boolean, 201 | keyboardOpeningTime: number, 202 | viewIsInsideTabBar: boolean, 203 | refPropName: string, 204 | extractNativeRef: Function 205 | } 206 | ``` 207 | 208 | ## License 209 | 210 | MIT. 211 | 212 | ## Author 213 | 214 | Álvaro Medina Ballester `` 215 | 216 | Built with 💛 by [APSL](https://github.com/apsl). 217 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for react-native-keyboard-aware-scroll-view 2 | // Project: https://github.com/APSL/react-native-keyboard-aware-scroll-view 3 | // Definitions by: Kyle Roach 4 | // TypeScript Version: 2.3.2 5 | 6 | import * as React from 'react' 7 | import { 8 | ScrollViewProps, 9 | FlatListProps, 10 | SectionListProps 11 | } from 'react-native' 12 | 13 | interface KeyboardAwareProps { 14 | /** 15 | * Catches the reference of the component. 16 | * 17 | * 18 | * @type {function} 19 | * @memberof KeyboardAwareProps 20 | */ 21 | innerRef?: (ref: JSX.Element) => void 22 | /** 23 | * Adds an extra offset that represents the TabBarIOS height. 24 | * 25 | * Default is false 26 | * @type {boolean} 27 | * @memberof KeyboardAwareProps 28 | */ 29 | viewIsInsideTabBar?: boolean 30 | 31 | /** 32 | * Coordinates that will be used to reset the scroll when the keyboard hides. 33 | * 34 | * @type {{ 35 | * x: number, 36 | * y: number 37 | * }} 38 | * @memberof KeyboardAwareProps 39 | */ 40 | resetScrollToCoords?: { 41 | x: number 42 | y: number 43 | } 44 | 45 | /** 46 | * Lets the user enable or disable automatic resetScrollToCoords 47 | * 48 | * @type {boolean} 49 | * @memberof KeyboardAwareProps 50 | */ 51 | enableResetScrollToCoords?: boolean 52 | 53 | /** 54 | * When focus in TextInput will scroll the position 55 | * 56 | * Default is true 57 | * 58 | * @type {boolean} 59 | * @memberof KeyboardAwareProps 60 | */ 61 | 62 | enableAutomaticScroll?: boolean 63 | /** 64 | * Enables keyboard aware settings for Android 65 | * 66 | * Default is false 67 | * 68 | * @type {boolean} 69 | * @memberof KeyboardAwareProps 70 | */ 71 | enableOnAndroid?: boolean 72 | 73 | /** 74 | * Adds an extra offset when focusing the TextInputs. 75 | * 76 | * Default is 75 77 | * @type {number} 78 | * @memberof KeyboardAwareProps 79 | */ 80 | extraHeight?: number 81 | 82 | /** 83 | * Adds an extra offset to the keyboard. 84 | * Useful if you want to stick elements above the keyboard. 85 | * 86 | * Default is 0 87 | * 88 | * @type {number} 89 | * @memberof KeyboardAwareProps 90 | */ 91 | extraScrollHeight?: number 92 | 93 | /** 94 | * Sets the delay time before scrolling to new position 95 | * 96 | * Default is 250 97 | * 98 | * @type {number} 99 | * @memberof KeyboardAwareProps 100 | */ 101 | keyboardOpeningTime?: number 102 | 103 | /** 104 | * Callback when the keyboard will show. 105 | * 106 | * @param frames Information about the keyboard frame and animation. 107 | */ 108 | onKeyboardWillShow?: (frames: Object) => void 109 | 110 | /** 111 | * Callback when the keyboard did show. 112 | * 113 | * @param frames Information about the keyboard frame and animation. 114 | */ 115 | onKeyboardDidShow?: (frames: Object) => void 116 | 117 | /** 118 | * Callback when the keyboard will hide. 119 | * 120 | * @param frames Information about the keyboard frame and animation. 121 | */ 122 | onKeyboardWillHide?: (frames: Object) => void 123 | 124 | /** 125 | * Callback when the keyboard did hide. 126 | * 127 | * @param frames Information about the keyboard frame and animation. 128 | */ 129 | onKeyboardDidHide?: (frames: Object) => void 130 | 131 | /** 132 | * Callback when the keyboard frame will change. 133 | * 134 | * @param frames Information about the keyboard frame and animation. 135 | */ 136 | onKeyboardWillChangeFrame?: (frames: Object) => void 137 | 138 | /** 139 | * Callback when the keyboard frame did change. 140 | * 141 | * @param frames Information about the keyboard frame and animation. 142 | */ 143 | onKeyboardDidChangeFrame?: (frames: Object) => void 144 | } 145 | 146 | interface KeyboardAwareScrollViewProps 147 | extends KeyboardAwareProps, 148 | ScrollViewProps {} 149 | interface KeyboardAwareFlatListProps 150 | extends KeyboardAwareProps, 151 | FlatListProps {} 152 | interface KeyboardAwareSectionListProps 153 | extends KeyboardAwareProps, 154 | SectionListProps {} 155 | 156 | interface KeyboardAwareState { 157 | keyboardSpace: number 158 | } 159 | 160 | declare class ScrollableComponent extends React.Component { 161 | getScrollResponder: () => void 162 | scrollToPosition: (x: number, y: number, animated?: boolean) => void 163 | scrollToEnd: (animated?: boolean) => void 164 | scrollForExtraHeightOnAndroid: (extraHeight: number) => void 165 | scrollToFocusedInput: ( 166 | reactNode: Object, 167 | extraHeight?: number, 168 | keyboardOpeningTime?: number 169 | ) => void 170 | } 171 | 172 | export class KeyboardAwareMixin {} 173 | export class KeyboardAwareScrollView extends ScrollableComponent< 174 | KeyboardAwareScrollViewProps, 175 | KeyboardAwareState 176 | > {} 177 | export class KeyboardAwareFlatList extends ScrollableComponent< 178 | KeyboardAwareFlatListProps, 179 | KeyboardAwareState 180 | > {} 181 | export class KeyboardAwareSectionList extends ScrollableComponent< 182 | KeyboardAwareSectionListProps, 183 | KeyboardAwareState 184 | > {} 185 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import listenToKeyboardEvents from './lib/KeyboardAwareHOC' 4 | import KeyboardAwareScrollView from './lib/KeyboardAwareScrollView' 5 | import KeyboardAwareFlatList from './lib/KeyboardAwareFlatList' 6 | import KeyboardAwareSectionList from './lib/KeyboardAwareSectionList' 7 | 8 | export { 9 | listenToKeyboardEvents, 10 | KeyboardAwareFlatList, 11 | KeyboardAwareSectionList, 12 | KeyboardAwareScrollView 13 | } 14 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "allowSyntheticDefaultImports": true 5 | }, 6 | "exclude": [ 7 | "node_modules" 8 | ] 9 | } -------------------------------------------------------------------------------- /lib/KeyboardAwareFlatList.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { FlatList } from 'react-native' 4 | import listenToKeyboardEvents from './KeyboardAwareHOC' 5 | 6 | export default listenToKeyboardEvents(FlatList) 7 | -------------------------------------------------------------------------------- /lib/KeyboardAwareHOC.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import React from 'react' 4 | import PropTypes from 'prop-types' 5 | import { 6 | Keyboard, 7 | Platform, 8 | UIManager, 9 | TextInput, 10 | findNodeHandle, 11 | Animated 12 | } from 'react-native' 13 | import { isIphoneX } from 'react-native-iphone-x-helper' 14 | import type { KeyboardAwareInterface } from './KeyboardAwareInterface' 15 | 16 | const _KAM_DEFAULT_TAB_BAR_HEIGHT: number = isIphoneX() ? 83 : 49 17 | const _KAM_KEYBOARD_OPENING_TIME: number = 250 18 | const _KAM_EXTRA_HEIGHT: number = 75 19 | 20 | const supportedKeyboardEvents = [ 21 | 'keyboardWillShow', 22 | 'keyboardDidShow', 23 | 'keyboardWillHide', 24 | 'keyboardDidHide', 25 | 'keyboardWillChangeFrame', 26 | 'keyboardDidChangeFrame' 27 | ] 28 | const keyboardEventToCallbackName = (eventName: string) => 29 | 'on' + eventName[0].toUpperCase() + eventName.substring(1) 30 | const keyboardEventPropTypes = supportedKeyboardEvents.reduce( 31 | (acc: Object, eventName: string) => ({ 32 | ...acc, 33 | [keyboardEventToCallbackName(eventName)]: PropTypes.func 34 | }), 35 | {} 36 | ) 37 | const keyboardAwareHOCTypeEvents = supportedKeyboardEvents.reduce( 38 | (acc: Object, eventName: string) => ({ 39 | ...acc, 40 | [keyboardEventToCallbackName(eventName)]: Function 41 | }), 42 | {} 43 | ) 44 | 45 | export type KeyboardAwareHOCProps = { 46 | viewIsInsideTabBar?: boolean, 47 | resetScrollToCoords?: { 48 | x: number, 49 | y: number 50 | }, 51 | enableResetScrollToCoords?: boolean, 52 | enableAutomaticScroll?: boolean, 53 | extraHeight?: number, 54 | extraScrollHeight?: number, 55 | keyboardOpeningTime?: number, 56 | onScroll?: Function, 57 | update?: Function, 58 | contentContainerStyle?: any, 59 | enableOnAndroid?: boolean, 60 | innerRef?: Function, 61 | ...keyboardAwareHOCTypeEvents 62 | } 63 | export type KeyboardAwareHOCState = { 64 | keyboardSpace: number 65 | } 66 | 67 | export type ElementLayout = { 68 | x: number, 69 | y: number, 70 | width: number, 71 | height: number 72 | } 73 | 74 | export type ContentOffset = { 75 | x: number, 76 | y: number 77 | } 78 | 79 | export type ScrollPosition = { 80 | x: number, 81 | y: number, 82 | animated: boolean 83 | } 84 | 85 | export type ScrollIntoViewOptions = ?{ 86 | getScrollPosition?: ( 87 | parentLayout: ElementLayout, 88 | childLayout: ElementLayout, 89 | contentOffset: ContentOffset 90 | ) => ScrollPosition 91 | } 92 | 93 | export type KeyboardAwareHOCOptions = ?{ 94 | enableOnAndroid: boolean, 95 | contentContainerStyle: ?Object, 96 | enableAutomaticScroll: boolean, 97 | extraHeight: number, 98 | extraScrollHeight: number, 99 | enableResetScrollToCoords: boolean, 100 | keyboardOpeningTime: number, 101 | viewIsInsideTabBar: boolean, 102 | refPropName: string, 103 | extractNativeRef: Function 104 | } 105 | 106 | function getDisplayName(WrappedComponent: React$Component) { 107 | return ( 108 | (WrappedComponent && 109 | (WrappedComponent.displayName || WrappedComponent.name)) || 110 | 'Component' 111 | ) 112 | } 113 | 114 | const ScrollIntoViewDefaultOptions: KeyboardAwareHOCOptions = { 115 | enableOnAndroid: false, 116 | contentContainerStyle: undefined, 117 | enableAutomaticScroll: true, 118 | extraHeight: _KAM_EXTRA_HEIGHT, 119 | extraScrollHeight: 0, 120 | enableResetScrollToCoords: true, 121 | keyboardOpeningTime: _KAM_KEYBOARD_OPENING_TIME, 122 | viewIsInsideTabBar: false, 123 | 124 | // The ref prop name that will be passed to the wrapped component to obtain a ref 125 | // If your ScrollView is already wrapped, maybe the wrapper permit to get a ref 126 | // For example, with glamorous-native ScrollView, you should use "innerRef" 127 | refPropName: 'ref', 128 | // Sometimes the ref you get is a ref to a wrapped view (ex: Animated.ScrollView) 129 | // We need access to the imperative API of a real native ScrollView so we need extraction logic 130 | extractNativeRef: (ref: Object) => { 131 | // getNode() permit to support Animated.ScrollView automatically, but is deprecated since RN 0.62 132 | // see https://github.com/facebook/react-native/issues/19650 133 | // see https://stackoverflow.com/questions/42051368/scrollto-is-undefined-on-animated-scrollview/48786374 134 | // see https://github.com/facebook/react-native/commit/66e72bb4e00aafbcb9f450ed5db261d98f99f82a 135 | const shouldCallGetNode = !Platform.constants || (Platform.constants.reactNativeVersion.major === 0 && Platform.constants.reactNativeVersion.minor < 62) 136 | if (ref.getNode && shouldCallGetNode) { 137 | return ref.getNode() 138 | } else { 139 | return ref 140 | } 141 | } 142 | } 143 | 144 | function KeyboardAwareHOC( 145 | ScrollableComponent: React$Component, 146 | userOptions: KeyboardAwareHOCOptions = {} 147 | ) { 148 | const hocOptions: KeyboardAwareHOCOptions = { 149 | ...ScrollIntoViewDefaultOptions, 150 | ...userOptions 151 | } 152 | 153 | return class 154 | extends React.Component 155 | implements KeyboardAwareInterface { 156 | _rnkasv_keyboardView: any 157 | keyboardWillShowEvent: ?Function 158 | keyboardWillHideEvent: ?Function 159 | position: ContentOffset 160 | defaultResetScrollToCoords: ?{ x: number, y: number } 161 | mountedComponent: boolean 162 | handleOnScroll: Function 163 | state: KeyboardAwareHOCState 164 | static displayName = `KeyboardAware${getDisplayName(ScrollableComponent)}` 165 | 166 | static propTypes = { 167 | viewIsInsideTabBar: PropTypes.bool, 168 | resetScrollToCoords: PropTypes.shape({ 169 | x: PropTypes.number.isRequired, 170 | y: PropTypes.number.isRequired 171 | }), 172 | enableResetScrollToCoords: PropTypes.bool, 173 | enableAutomaticScroll: PropTypes.bool, 174 | extraHeight: PropTypes.number, 175 | extraScrollHeight: PropTypes.number, 176 | keyboardOpeningTime: PropTypes.number, 177 | onScroll: PropTypes.oneOfType([ 178 | PropTypes.func, // Normal listener 179 | PropTypes.object // Animated.event listener 180 | ]), 181 | update: PropTypes.func, 182 | contentContainerStyle: PropTypes.any, 183 | enableOnAndroid: PropTypes.bool, 184 | innerRef: PropTypes.func, 185 | ...keyboardEventPropTypes 186 | } 187 | 188 | // HOC options are used to init default props, so that these options can be overriden with component props 189 | static defaultProps = { 190 | enableAutomaticScroll: hocOptions.enableAutomaticScroll, 191 | extraHeight: hocOptions.extraHeight, 192 | extraScrollHeight: hocOptions.extraScrollHeight, 193 | enableResetScrollToCoords: hocOptions.enableResetScrollToCoords, 194 | keyboardOpeningTime: hocOptions.keyboardOpeningTime, 195 | viewIsInsideTabBar: hocOptions.viewIsInsideTabBar, 196 | enableOnAndroid: hocOptions.enableOnAndroid 197 | } 198 | 199 | constructor(props: KeyboardAwareHOCProps) { 200 | super(props) 201 | this.keyboardWillShowEvent = undefined 202 | this.keyboardWillHideEvent = undefined 203 | this.callbacks = {} 204 | this.position = { x: 0, y: 0 } 205 | this.defaultResetScrollToCoords = null 206 | const keyboardSpace: number = props.viewIsInsideTabBar 207 | ? _KAM_DEFAULT_TAB_BAR_HEIGHT 208 | : 0 209 | this.state = { keyboardSpace } 210 | } 211 | 212 | componentDidMount() { 213 | this.mountedComponent = true 214 | // Keyboard events 215 | if (Platform.OS === 'ios') { 216 | this.keyboardWillShowEvent = Keyboard.addListener( 217 | 'keyboardWillShow', 218 | this._updateKeyboardSpace 219 | ) 220 | this.keyboardWillHideEvent = Keyboard.addListener( 221 | 'keyboardWillHide', 222 | this._resetKeyboardSpace 223 | ) 224 | } else if (Platform.OS === 'android' && this.props.enableOnAndroid) { 225 | this.keyboardWillShowEvent = Keyboard.addListener( 226 | 'keyboardDidShow', 227 | this._updateKeyboardSpace 228 | ) 229 | this.keyboardWillHideEvent = Keyboard.addListener( 230 | 'keyboardDidHide', 231 | this._resetKeyboardSpace 232 | ) 233 | } 234 | 235 | supportedKeyboardEvents.forEach((eventName: string) => { 236 | const callbackName = keyboardEventToCallbackName(eventName) 237 | if (this.props[callbackName]) { 238 | this.callbacks[eventName] = Keyboard.addListener( 239 | eventName, 240 | this.props[callbackName] 241 | ) 242 | } 243 | }) 244 | } 245 | 246 | componentDidUpdate(prevProps: KeyboardAwareHOCProps) { 247 | if (this.props.viewIsInsideTabBar !== prevProps.viewIsInsideTabBar) { 248 | const keyboardSpace: number = this.props.viewIsInsideTabBar 249 | ? _KAM_DEFAULT_TAB_BAR_HEIGHT 250 | : 0 251 | if (this.state.keyboardSpace !== keyboardSpace) { 252 | this.setState({ keyboardSpace }) 253 | } 254 | } 255 | } 256 | 257 | componentWillUnmount() { 258 | this.mountedComponent = false 259 | this.keyboardWillShowEvent && this.keyboardWillShowEvent.remove() 260 | this.keyboardWillHideEvent && this.keyboardWillHideEvent.remove() 261 | Object.values(this.callbacks).forEach((callback: Object) => 262 | callback.remove() 263 | ) 264 | } 265 | 266 | getScrollResponder = () => { 267 | return ( 268 | this._rnkasv_keyboardView && 269 | this._rnkasv_keyboardView.getScrollResponder && 270 | this._rnkasv_keyboardView.getScrollResponder() 271 | ) 272 | } 273 | 274 | scrollToPosition = (x: number, y: number, animated: boolean = true) => { 275 | const responder = this.getScrollResponder() 276 | if (!responder) { 277 | return 278 | } 279 | if (responder.scrollResponderScrollTo) { 280 | // React Native < 0.65 281 | responder.scrollResponderScrollTo({ x, y, animated }) 282 | } else if (responder.scrollTo) { 283 | // React Native >= 0.65 284 | responder.scrollTo({ x, y, animated }) 285 | } 286 | } 287 | 288 | scrollToEnd = (animated?: boolean = true) => { 289 | const responder = this.getScrollResponder() 290 | if (!responder) { 291 | return 292 | } 293 | if (responder.scrollResponderScrollToEnd) { 294 | // React Native < 0.65 295 | responder.scrollResponderScrollToEnd({ animated }) 296 | } else if (responder.scrollToEnd) { 297 | // React Native >= 0.65 298 | responder.scrollToEnd({ animated }) 299 | } 300 | } 301 | 302 | scrollForExtraHeightOnAndroid = (extraHeight: number) => { 303 | this.scrollToPosition(0, this.position.y + extraHeight, true) 304 | } 305 | 306 | /** 307 | * @param keyboardOpeningTime: takes a different keyboardOpeningTime in consideration. 308 | * @param extraHeight: takes an extra height in consideration. 309 | */ 310 | scrollToFocusedInput = ( 311 | reactNode: any, 312 | extraHeight?: number, 313 | keyboardOpeningTime?: number 314 | ) => { 315 | if (extraHeight === undefined) { 316 | extraHeight = this.props.extraHeight || 0 317 | } 318 | if (keyboardOpeningTime === undefined) { 319 | keyboardOpeningTime = this.props.keyboardOpeningTime || 0 320 | } 321 | setTimeout(() => { 322 | if (!this.mountedComponent) { 323 | return 324 | } 325 | const responder = this.getScrollResponder() 326 | responder && 327 | responder.scrollResponderScrollNativeHandleToKeyboard( 328 | reactNode, 329 | extraHeight, 330 | true 331 | ) 332 | }, keyboardOpeningTime) 333 | } 334 | 335 | scrollIntoView = async ( 336 | element: React.Element<*>, 337 | options: ScrollIntoViewOptions = {} 338 | ) => { 339 | if (!this._rnkasv_keyboardView || !element) { 340 | return 341 | } 342 | 343 | const [parentLayout, childLayout] = await Promise.all([ 344 | this._measureElement(this._rnkasv_keyboardView), 345 | this._measureElement(element) 346 | ]) 347 | 348 | const getScrollPosition = 349 | options.getScrollPosition || this._defaultGetScrollPosition 350 | const { x, y, animated } = getScrollPosition( 351 | parentLayout, 352 | childLayout, 353 | this.position 354 | ) 355 | this.scrollToPosition(x, y, animated) 356 | } 357 | 358 | _defaultGetScrollPosition = ( 359 | parentLayout: ElementLayout, 360 | childLayout: ElementLayout, 361 | contentOffset: ContentOffset 362 | ): ScrollPosition => { 363 | return { 364 | x: 0, 365 | y: Math.max(0, childLayout.y - parentLayout.y + contentOffset.y), 366 | animated: true 367 | } 368 | } 369 | 370 | _measureElement = (element: React.Element<*>): Promise => { 371 | const node = findNodeHandle(element) 372 | return new Promise((resolve: ElementLayout => void) => { 373 | UIManager.measureInWindow( 374 | node, 375 | (x: number, y: number, width: number, height: number) => { 376 | resolve({ x, y, width, height }) 377 | } 378 | ) 379 | }) 380 | } 381 | 382 | // Keyboard actions 383 | _updateKeyboardSpace = (frames: Object) => { 384 | // Automatically scroll to focused TextInput 385 | if (this.props.enableAutomaticScroll) { 386 | let keyboardSpace: number = 387 | frames.endCoordinates.height + this.props.extraScrollHeight 388 | if (this.props.viewIsInsideTabBar) { 389 | keyboardSpace -= _KAM_DEFAULT_TAB_BAR_HEIGHT 390 | } 391 | this.setState({ keyboardSpace }) 392 | const currentlyFocusedField = TextInput.State.currentlyFocusedInput ? findNodeHandle(TextInput.State.currentlyFocusedInput()) : TextInput.State.currentlyFocusedField() 393 | const responder = this.getScrollResponder() 394 | if (!currentlyFocusedField || !responder) { 395 | return 396 | } 397 | UIManager.viewIsDescendantOf( 398 | currentlyFocusedField, 399 | responder.getInnerViewNode(), 400 | (isAncestor: boolean) => { 401 | if (isAncestor) { 402 | // Check if the TextInput will be hidden by the keyboard 403 | UIManager.measureInWindow( 404 | currentlyFocusedField, 405 | (x: number, y: number, width: number, height: number) => { 406 | const textInputBottomPosition = y + height 407 | const keyboardPosition = frames.endCoordinates.screenY 408 | const totalExtraHeight = 409 | this.props.extraScrollHeight + this.props.extraHeight 410 | if (Platform.OS === 'ios') { 411 | if ( 412 | textInputBottomPosition > 413 | keyboardPosition - totalExtraHeight 414 | ) { 415 | this._scrollToFocusedInputWithNodeHandle( 416 | currentlyFocusedField 417 | ) 418 | } 419 | } else { 420 | // On android, the system would scroll the text input just 421 | // above the keyboard so we just neet to scroll the extra 422 | // height part 423 | if (textInputBottomPosition > keyboardPosition) { 424 | // Since the system already scrolled the whole view up 425 | // we should reduce that amount 426 | keyboardSpace = 427 | keyboardSpace - 428 | (textInputBottomPosition - keyboardPosition) 429 | this.setState({ keyboardSpace }) 430 | this.scrollForExtraHeightOnAndroid(totalExtraHeight) 431 | } else if ( 432 | textInputBottomPosition > 433 | keyboardPosition - totalExtraHeight 434 | ) { 435 | this.scrollForExtraHeightOnAndroid( 436 | totalExtraHeight - 437 | (keyboardPosition - textInputBottomPosition) 438 | ) 439 | } 440 | } 441 | } 442 | ) 443 | } 444 | } 445 | ) 446 | } 447 | if (!this.props.resetScrollToCoords) { 448 | if (!this.defaultResetScrollToCoords) { 449 | this.defaultResetScrollToCoords = this.position 450 | } 451 | } 452 | } 453 | 454 | _resetKeyboardSpace = () => { 455 | const keyboardSpace: number = this.props.viewIsInsideTabBar 456 | ? _KAM_DEFAULT_TAB_BAR_HEIGHT 457 | : 0 458 | this.setState({ keyboardSpace }) 459 | // Reset scroll position after keyboard dismissal 460 | if (this.props.enableResetScrollToCoords === false) { 461 | this.defaultResetScrollToCoords = null 462 | return 463 | } else if (this.props.resetScrollToCoords) { 464 | this.scrollToPosition( 465 | this.props.resetScrollToCoords.x, 466 | this.props.resetScrollToCoords.y, 467 | true 468 | ) 469 | } else { 470 | if (this.defaultResetScrollToCoords) { 471 | this.scrollToPosition( 472 | this.defaultResetScrollToCoords.x, 473 | this.defaultResetScrollToCoords.y, 474 | true 475 | ) 476 | this.defaultResetScrollToCoords = null 477 | } else { 478 | this.scrollToPosition(0, 0, true) 479 | } 480 | } 481 | } 482 | 483 | _scrollToFocusedInputWithNodeHandle = ( 484 | nodeID: number, 485 | extraHeight?: number, 486 | keyboardOpeningTime?: number 487 | ) => { 488 | if (extraHeight === undefined) { 489 | extraHeight = this.props.extraHeight 490 | } 491 | const reactNode = findNodeHandle(nodeID) 492 | this.scrollToFocusedInput( 493 | reactNode, 494 | extraHeight + this.props.extraScrollHeight, 495 | keyboardOpeningTime !== undefined 496 | ? keyboardOpeningTime 497 | : this.props.keyboardOpeningTime || 0 498 | ) 499 | } 500 | 501 | _handleOnScroll = ( 502 | e: SyntheticEvent<*> & { nativeEvent: { contentOffset: number } } 503 | ) => { 504 | this.position = e.nativeEvent.contentOffset 505 | } 506 | 507 | _handleRef = (ref: React.Component<*>) => { 508 | this._rnkasv_keyboardView = ref ? hocOptions.extractNativeRef(ref) : ref 509 | if (this.props.innerRef) { 510 | this.props.innerRef(this._rnkasv_keyboardView) 511 | } 512 | } 513 | 514 | update = () => { 515 | const currentlyFocusedField = TextInput.State.currentlyFocusedInput ? findNodeHandle(TextInput.State.currentlyFocusedInput()) : TextInput.State.currentlyFocusedField() 516 | const responder = this.getScrollResponder() 517 | 518 | if (!currentlyFocusedField || !responder) { 519 | return 520 | } 521 | 522 | this._scrollToFocusedInputWithNodeHandle(currentlyFocusedField) 523 | } 524 | 525 | render() { 526 | const { enableOnAndroid, contentContainerStyle, onScroll } = this.props 527 | let newContentContainerStyle 528 | if (Platform.OS === 'android' && enableOnAndroid) { 529 | newContentContainerStyle = [].concat(contentContainerStyle).concat({ 530 | paddingBottom: 531 | ((contentContainerStyle || {}).paddingBottom || 0) + 532 | this.state.keyboardSpace 533 | }) 534 | } 535 | const refProps = { [hocOptions.refPropName]: this._handleRef } 536 | return ( 537 | 560 | ) 561 | } 562 | } 563 | } 564 | 565 | // Allow to pass options, without breaking change, and curried for composition 566 | // listenToKeyboardEvents(ScrollView); 567 | // listenToKeyboardEvents(options)(Comp); 568 | const listenToKeyboardEvents = (configOrComp: any) => { 569 | if (typeof configOrComp === 'object' && !configOrComp.displayName) { 570 | return (Comp: Function) => KeyboardAwareHOC(Comp, configOrComp) 571 | } else { 572 | return KeyboardAwareHOC(configOrComp) 573 | } 574 | } 575 | 576 | export default listenToKeyboardEvents 577 | -------------------------------------------------------------------------------- /lib/KeyboardAwareInterface.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | export interface KeyboardAwareInterface { 4 | getScrollResponder: () => void, 5 | scrollToPosition: (x: number, y: number, animated?: boolean) => void, 6 | scrollToEnd: (animated?: boolean) => void, 7 | scrollForExtraHeightOnAndroid: (extraHeight: number) => void, 8 | scrollToFocusedInput: ( 9 | reactNode: Object, 10 | extraHeight: number, 11 | keyboardOpeningTime: number 12 | ) => void 13 | } 14 | -------------------------------------------------------------------------------- /lib/KeyboardAwareScrollView.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { ScrollView } from 'react-native' 4 | import listenToKeyboardEvents from './KeyboardAwareHOC' 5 | 6 | export default listenToKeyboardEvents(ScrollView) 7 | -------------------------------------------------------------------------------- /lib/KeyboardAwareSectionList.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import { SectionList } from 'react-native' 4 | import listenToKeyboardEvents from './KeyboardAwareHOC' 5 | 6 | export default listenToKeyboardEvents(SectionList) 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-keyboard-aware-scroll-view", 3 | "version": "0.9.5", 4 | "description": "A React Native ScrollView component that resizes when the keyboard appears.", 5 | "main": "index.js", 6 | "types": "index.d.ts", 7 | "scripts": { 8 | "lint": "eslint lib", 9 | "test": "npm run lint", 10 | "flow": "flow check" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/APSL/react-native-keyboard-aware-scroll-view.git" 15 | }, 16 | "tags": [ 17 | "react", 18 | "react-native", 19 | "react-component", 20 | "ios", 21 | "android" 22 | ], 23 | "keywords": [ 24 | "react", 25 | "react-native", 26 | "scrollview", 27 | "keyboard", 28 | "ios", 29 | "android", 30 | "react-component" 31 | ], 32 | "author": "Alvaro Medina Ballester ", 33 | "license": "MIT", 34 | "bugs": { 35 | "url": "https://github.com/APSL/react-native-keyboard-aware-scroll-view/issues" 36 | }, 37 | "homepage": "https://github.com/APSL/react-native-keyboard-aware-scroll-view#readme", 38 | "dependencies": { 39 | "prop-types": "^15.6.2", 40 | "react-native-iphone-x-helper": "^1.0.3" 41 | }, 42 | "peerDependencies": { 43 | "react-native": ">=0.48.4" 44 | }, 45 | "devDependencies": { 46 | "babel-eslint": "^10.0.2", 47 | "eslint": "^6.1.0", 48 | "eslint-plugin-flowtype": "^4.2.0", 49 | "eslint-plugin-react": "^7.14.3", 50 | "eslint-plugin-react-native": "^3.7.0", 51 | "flow-bin": "^0.105.2" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": 6 | version "7.5.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" 8 | integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/generator@^7.5.5": 13 | version "7.5.5" 14 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" 15 | integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== 16 | dependencies: 17 | "@babel/types" "^7.5.5" 18 | jsesc "^2.5.1" 19 | lodash "^4.17.13" 20 | source-map "^0.5.0" 21 | trim-right "^1.0.1" 22 | 23 | "@babel/helper-function-name@^7.1.0": 24 | version "7.1.0" 25 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" 26 | integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== 27 | dependencies: 28 | "@babel/helper-get-function-arity" "^7.0.0" 29 | "@babel/template" "^7.1.0" 30 | "@babel/types" "^7.0.0" 31 | 32 | "@babel/helper-get-function-arity@^7.0.0": 33 | version "7.0.0" 34 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" 35 | integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== 36 | dependencies: 37 | "@babel/types" "^7.0.0" 38 | 39 | "@babel/helper-split-export-declaration@^7.4.4": 40 | version "7.4.4" 41 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" 42 | integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== 43 | dependencies: 44 | "@babel/types" "^7.4.4" 45 | 46 | "@babel/highlight@^7.0.0": 47 | version "7.5.0" 48 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 49 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 50 | dependencies: 51 | chalk "^2.0.0" 52 | esutils "^2.0.2" 53 | js-tokens "^4.0.0" 54 | 55 | "@babel/parser@^7.0.0", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": 56 | version "7.5.5" 57 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" 58 | integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== 59 | 60 | "@babel/template@^7.1.0": 61 | version "7.4.4" 62 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" 63 | integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== 64 | dependencies: 65 | "@babel/code-frame" "^7.0.0" 66 | "@babel/parser" "^7.4.4" 67 | "@babel/types" "^7.4.4" 68 | 69 | "@babel/traverse@^7.0.0": 70 | version "7.5.5" 71 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" 72 | integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== 73 | dependencies: 74 | "@babel/code-frame" "^7.5.5" 75 | "@babel/generator" "^7.5.5" 76 | "@babel/helper-function-name" "^7.1.0" 77 | "@babel/helper-split-export-declaration" "^7.4.4" 78 | "@babel/parser" "^7.5.5" 79 | "@babel/types" "^7.5.5" 80 | debug "^4.1.0" 81 | globals "^11.1.0" 82 | lodash "^4.17.13" 83 | 84 | "@babel/types@^7.0.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": 85 | version "7.5.5" 86 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" 87 | integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== 88 | dependencies: 89 | esutils "^2.0.2" 90 | lodash "^4.17.13" 91 | to-fast-properties "^2.0.0" 92 | 93 | acorn-jsx@^5.0.0: 94 | version "5.0.1" 95 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" 96 | integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== 97 | 98 | acorn@^6.0.7: 99 | version "6.3.0" 100 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" 101 | integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== 102 | 103 | ajv@^6.10.0, ajv@^6.10.2: 104 | version "6.10.2" 105 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 106 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 107 | dependencies: 108 | fast-deep-equal "^2.0.1" 109 | fast-json-stable-stringify "^2.0.0" 110 | json-schema-traverse "^0.4.1" 111 | uri-js "^4.2.2" 112 | 113 | ansi-escapes@^4.2.1: 114 | version "4.2.1" 115 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" 116 | integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== 117 | dependencies: 118 | type-fest "^0.5.2" 119 | 120 | ansi-regex@^4.1.0: 121 | version "4.1.0" 122 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 123 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 124 | 125 | ansi-styles@^3.1.0: 126 | version "3.2.0" 127 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 128 | dependencies: 129 | color-convert "^1.9.0" 130 | 131 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 132 | version "3.2.1" 133 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 134 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 135 | dependencies: 136 | color-convert "^1.9.0" 137 | 138 | argparse@^1.0.7: 139 | version "1.0.9" 140 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 141 | dependencies: 142 | sprintf-js "~1.0.2" 143 | 144 | array-includes@^3.0.3: 145 | version "3.0.3" 146 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 147 | dependencies: 148 | define-properties "^1.1.2" 149 | es-abstract "^1.7.0" 150 | 151 | astral-regex@^1.0.0: 152 | version "1.0.0" 153 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 154 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 155 | 156 | babel-eslint@^10.0.2: 157 | version "10.0.2" 158 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.2.tgz#182d5ac204579ff0881684b040560fdcc1558456" 159 | integrity sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q== 160 | dependencies: 161 | "@babel/code-frame" "^7.0.0" 162 | "@babel/parser" "^7.0.0" 163 | "@babel/traverse" "^7.0.0" 164 | "@babel/types" "^7.0.0" 165 | eslint-scope "3.7.1" 166 | eslint-visitor-keys "^1.0.0" 167 | 168 | balanced-match@^1.0.0: 169 | version "1.0.0" 170 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 171 | 172 | brace-expansion@^1.1.7: 173 | version "1.1.8" 174 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 175 | dependencies: 176 | balanced-match "^1.0.0" 177 | concat-map "0.0.1" 178 | 179 | callsites@^3.0.0: 180 | version "3.1.0" 181 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 182 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 183 | 184 | chalk@^2.0.0, chalk@^2.1.0: 185 | version "2.1.0" 186 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" 187 | dependencies: 188 | ansi-styles "^3.1.0" 189 | escape-string-regexp "^1.0.5" 190 | supports-color "^4.0.0" 191 | 192 | chalk@^2.4.2: 193 | version "2.4.2" 194 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 195 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 196 | dependencies: 197 | ansi-styles "^3.2.1" 198 | escape-string-regexp "^1.0.5" 199 | supports-color "^5.3.0" 200 | 201 | chardet@^0.7.0: 202 | version "0.7.0" 203 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 204 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 205 | 206 | cli-cursor@^3.1.0: 207 | version "3.1.0" 208 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 209 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 210 | dependencies: 211 | restore-cursor "^3.1.0" 212 | 213 | cli-width@^2.0.0: 214 | version "2.1.0" 215 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 216 | 217 | color-convert@^1.9.0: 218 | version "1.9.0" 219 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 220 | dependencies: 221 | color-name "^1.1.1" 222 | 223 | color-name@^1.1.1: 224 | version "1.1.3" 225 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 226 | 227 | concat-map@0.0.1: 228 | version "0.0.1" 229 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 230 | 231 | cross-spawn@^6.0.5: 232 | version "6.0.5" 233 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 234 | dependencies: 235 | nice-try "^1.0.4" 236 | path-key "^2.0.1" 237 | semver "^5.5.0" 238 | shebang-command "^1.2.0" 239 | which "^1.2.9" 240 | 241 | debug@^4.0.1, debug@^4.1.0: 242 | version "4.1.1" 243 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 244 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 245 | dependencies: 246 | ms "^2.1.1" 247 | 248 | deep-is@~0.1.3: 249 | version "0.1.3" 250 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 251 | 252 | define-properties@^1.1.2: 253 | version "1.1.2" 254 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 255 | dependencies: 256 | foreach "^2.0.5" 257 | object-keys "^1.0.8" 258 | 259 | define-properties@^1.1.3: 260 | version "1.1.3" 261 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 262 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 263 | dependencies: 264 | object-keys "^1.0.12" 265 | 266 | doctrine@^2.1.0: 267 | version "2.1.0" 268 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 269 | dependencies: 270 | esutils "^2.0.2" 271 | 272 | doctrine@^3.0.0: 273 | version "3.0.0" 274 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 275 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 276 | dependencies: 277 | esutils "^2.0.2" 278 | 279 | emoji-regex@^7.0.1: 280 | version "7.0.3" 281 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 282 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 283 | 284 | emoji-regex@^8.0.0: 285 | version "8.0.0" 286 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 287 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 288 | 289 | es-abstract@^1.11.0, es-abstract@^1.12.0: 290 | version "1.13.0" 291 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" 292 | integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== 293 | dependencies: 294 | es-to-primitive "^1.2.0" 295 | function-bind "^1.1.1" 296 | has "^1.0.3" 297 | is-callable "^1.1.4" 298 | is-regex "^1.0.4" 299 | object-keys "^1.0.12" 300 | 301 | es-abstract@^1.7.0: 302 | version "1.7.0" 303 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" 304 | dependencies: 305 | es-to-primitive "^1.1.1" 306 | function-bind "^1.1.0" 307 | is-callable "^1.1.3" 308 | is-regex "^1.0.3" 309 | 310 | es-to-primitive@^1.1.1: 311 | version "1.1.1" 312 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 313 | dependencies: 314 | is-callable "^1.1.1" 315 | is-date-object "^1.0.1" 316 | is-symbol "^1.0.1" 317 | 318 | es-to-primitive@^1.2.0: 319 | version "1.2.0" 320 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 321 | integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 322 | dependencies: 323 | is-callable "^1.1.4" 324 | is-date-object "^1.0.1" 325 | is-symbol "^1.0.2" 326 | 327 | escape-string-regexp@^1.0.5: 328 | version "1.0.5" 329 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 330 | 331 | eslint-plugin-flowtype@^4.2.0: 332 | version "4.2.0" 333 | resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.2.0.tgz#a89ac991eef6753226eb8871261e266645aca4b9" 334 | integrity sha512-mqf6AbQCP6N8Bk+ryXYwxt6sj3RT7i3kt8JOOx7WOQNlZtsLxqvnkXRRrToFHcN52E5W9c/p3UfNxCMsfENIJA== 335 | dependencies: 336 | lodash "^4.17.15" 337 | 338 | eslint-plugin-react-native-globals@^0.1.1: 339 | version "0.1.2" 340 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" 341 | 342 | eslint-plugin-react-native@^3.7.0: 343 | version "3.7.0" 344 | resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-3.7.0.tgz#7e2cc1f3cf24919c4c0ea7fac13301e7444e105f" 345 | integrity sha512-krLtQmGih/uJDPxF8DBpnU8J3kRUsDm/Dey5yEhOO8LN1I3Wesbk4PGCg8Zah57azKFU+9YtGooFjJcDJWUs+g== 346 | dependencies: 347 | eslint-plugin-react-native-globals "^0.1.1" 348 | 349 | eslint-plugin-react@^7.14.3: 350 | version "7.14.3" 351 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" 352 | integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA== 353 | dependencies: 354 | array-includes "^3.0.3" 355 | doctrine "^2.1.0" 356 | has "^1.0.3" 357 | jsx-ast-utils "^2.1.0" 358 | object.entries "^1.1.0" 359 | object.fromentries "^2.0.0" 360 | object.values "^1.1.0" 361 | prop-types "^15.7.2" 362 | resolve "^1.10.1" 363 | 364 | eslint-scope@3.7.1: 365 | version "3.7.1" 366 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 367 | dependencies: 368 | esrecurse "^4.1.0" 369 | estraverse "^4.1.1" 370 | 371 | eslint-scope@^5.0.0: 372 | version "5.0.0" 373 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 374 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 375 | dependencies: 376 | esrecurse "^4.1.0" 377 | estraverse "^4.1.1" 378 | 379 | eslint-utils@^1.3.1: 380 | version "1.3.1" 381 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" 382 | 383 | eslint-visitor-keys@^1.0.0: 384 | version "1.0.0" 385 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 386 | 387 | eslint@^6.1.0: 388 | version "6.1.0" 389 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" 390 | integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== 391 | dependencies: 392 | "@babel/code-frame" "^7.0.0" 393 | ajv "^6.10.0" 394 | chalk "^2.1.0" 395 | cross-spawn "^6.0.5" 396 | debug "^4.0.1" 397 | doctrine "^3.0.0" 398 | eslint-scope "^5.0.0" 399 | eslint-utils "^1.3.1" 400 | eslint-visitor-keys "^1.0.0" 401 | espree "^6.0.0" 402 | esquery "^1.0.1" 403 | esutils "^2.0.2" 404 | file-entry-cache "^5.0.1" 405 | functional-red-black-tree "^1.0.1" 406 | glob-parent "^5.0.0" 407 | globals "^11.7.0" 408 | ignore "^4.0.6" 409 | import-fresh "^3.0.0" 410 | imurmurhash "^0.1.4" 411 | inquirer "^6.4.1" 412 | is-glob "^4.0.0" 413 | js-yaml "^3.13.1" 414 | json-stable-stringify-without-jsonify "^1.0.1" 415 | levn "^0.3.0" 416 | lodash "^4.17.14" 417 | minimatch "^3.0.4" 418 | mkdirp "^0.5.1" 419 | natural-compare "^1.4.0" 420 | optionator "^0.8.2" 421 | progress "^2.0.0" 422 | regexpp "^2.0.1" 423 | semver "^6.1.2" 424 | strip-ansi "^5.2.0" 425 | strip-json-comments "^3.0.1" 426 | table "^5.2.3" 427 | text-table "^0.2.0" 428 | v8-compile-cache "^2.0.3" 429 | 430 | espree@^6.0.0: 431 | version "6.0.0" 432 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" 433 | integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== 434 | dependencies: 435 | acorn "^6.0.7" 436 | acorn-jsx "^5.0.0" 437 | eslint-visitor-keys "^1.0.0" 438 | 439 | esprima@^4.0.0: 440 | version "4.0.0" 441 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 442 | 443 | esquery@^1.0.1: 444 | version "1.0.1" 445 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 446 | dependencies: 447 | estraverse "^4.0.0" 448 | 449 | esrecurse@^4.1.0: 450 | version "4.2.0" 451 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 452 | dependencies: 453 | estraverse "^4.1.0" 454 | object-assign "^4.0.1" 455 | 456 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 457 | version "4.2.0" 458 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 459 | 460 | esutils@^2.0.2: 461 | version "2.0.2" 462 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 463 | 464 | external-editor@^3.0.3: 465 | version "3.1.0" 466 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" 467 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 468 | dependencies: 469 | chardet "^0.7.0" 470 | iconv-lite "^0.4.24" 471 | tmp "^0.0.33" 472 | 473 | fast-deep-equal@^2.0.1: 474 | version "2.0.1" 475 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 476 | 477 | fast-json-stable-stringify@^2.0.0: 478 | version "2.0.0" 479 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 480 | 481 | fast-levenshtein@~2.0.4: 482 | version "2.0.6" 483 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 484 | 485 | figures@^3.0.0: 486 | version "3.0.0" 487 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.0.0.tgz#756275c964646163cc6f9197c7a0295dbfd04de9" 488 | integrity sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g== 489 | dependencies: 490 | escape-string-regexp "^1.0.5" 491 | 492 | file-entry-cache@^5.0.1: 493 | version "5.0.1" 494 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 495 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 496 | dependencies: 497 | flat-cache "^2.0.1" 498 | 499 | flat-cache@^2.0.1: 500 | version "2.0.1" 501 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 502 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 503 | dependencies: 504 | flatted "^2.0.0" 505 | rimraf "2.6.3" 506 | write "1.0.3" 507 | 508 | flatted@^2.0.0: 509 | version "2.0.1" 510 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" 511 | integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== 512 | 513 | flow-bin@^0.105.2: 514 | version "0.105.2" 515 | resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.105.2.tgz#9d03d5ae3e1d011e311f309cb8786b3b3695fec2" 516 | integrity sha512-VCHt0SCjFPviv/Ze/W7AgkcE0uH4TocypSFA8wR3ZH1P7BSjny4l3uhHyOjzU3Qo1i0jO4NyaU6q3Y5IaQ6xng== 517 | 518 | foreach@^2.0.5: 519 | version "2.0.5" 520 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 521 | 522 | fs.realpath@^1.0.0: 523 | version "1.0.0" 524 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 525 | 526 | function-bind@^1.0.2, function-bind@^1.1.0: 527 | version "1.1.0" 528 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 529 | 530 | function-bind@^1.1.1: 531 | version "1.1.1" 532 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 533 | 534 | functional-red-black-tree@^1.0.1: 535 | version "1.0.1" 536 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 537 | 538 | glob-parent@^5.0.0: 539 | version "5.0.0" 540 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" 541 | integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== 542 | dependencies: 543 | is-glob "^4.0.1" 544 | 545 | glob@^7.1.3: 546 | version "7.1.4" 547 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 548 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 549 | dependencies: 550 | fs.realpath "^1.0.0" 551 | inflight "^1.0.4" 552 | inherits "2" 553 | minimatch "^3.0.4" 554 | once "^1.3.0" 555 | path-is-absolute "^1.0.0" 556 | 557 | globals@^11.1.0, globals@^11.7.0: 558 | version "11.7.0" 559 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 560 | 561 | has-flag@^2.0.0: 562 | version "2.0.0" 563 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 564 | 565 | has-flag@^3.0.0: 566 | version "3.0.0" 567 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 568 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 569 | 570 | has-symbols@^1.0.0: 571 | version "1.0.0" 572 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 573 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 574 | 575 | has@^1.0.1: 576 | version "1.0.1" 577 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 578 | dependencies: 579 | function-bind "^1.0.2" 580 | 581 | has@^1.0.3: 582 | version "1.0.3" 583 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 584 | dependencies: 585 | function-bind "^1.1.1" 586 | 587 | iconv-lite@^0.4.24: 588 | version "0.4.24" 589 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 590 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 591 | dependencies: 592 | safer-buffer ">= 2.1.2 < 3" 593 | 594 | ignore@^4.0.6: 595 | version "4.0.6" 596 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 597 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 598 | 599 | import-fresh@^3.0.0: 600 | version "3.1.0" 601 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" 602 | integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== 603 | dependencies: 604 | parent-module "^1.0.0" 605 | resolve-from "^4.0.0" 606 | 607 | imurmurhash@^0.1.4: 608 | version "0.1.4" 609 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 610 | 611 | inflight@^1.0.4: 612 | version "1.0.6" 613 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 614 | dependencies: 615 | once "^1.3.0" 616 | wrappy "1" 617 | 618 | inherits@2: 619 | version "2.0.3" 620 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 621 | 622 | inquirer@^6.4.1: 623 | version "6.5.1" 624 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.1.tgz#8bfb7a5ac02dac6ff641ac4c5ff17da112fcdb42" 625 | integrity sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw== 626 | dependencies: 627 | ansi-escapes "^4.2.1" 628 | chalk "^2.4.2" 629 | cli-cursor "^3.1.0" 630 | cli-width "^2.0.0" 631 | external-editor "^3.0.3" 632 | figures "^3.0.0" 633 | lodash "^4.17.15" 634 | mute-stream "0.0.8" 635 | run-async "^2.2.0" 636 | rxjs "^6.4.0" 637 | string-width "^4.1.0" 638 | strip-ansi "^5.1.0" 639 | through "^2.3.6" 640 | 641 | is-callable@^1.1.1, is-callable@^1.1.3: 642 | version "1.1.3" 643 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 644 | 645 | is-callable@^1.1.4: 646 | version "1.1.4" 647 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 648 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 649 | 650 | is-date-object@^1.0.1: 651 | version "1.0.1" 652 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 653 | 654 | is-extglob@^2.1.1: 655 | version "2.1.1" 656 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 657 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 658 | 659 | is-fullwidth-code-point@^2.0.0: 660 | version "2.0.0" 661 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 662 | 663 | is-fullwidth-code-point@^3.0.0: 664 | version "3.0.0" 665 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 666 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 667 | 668 | is-glob@^4.0.0, is-glob@^4.0.1: 669 | version "4.0.1" 670 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 671 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 672 | dependencies: 673 | is-extglob "^2.1.1" 674 | 675 | is-promise@^2.1.0: 676 | version "2.1.0" 677 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 678 | 679 | is-regex@^1.0.3, is-regex@^1.0.4: 680 | version "1.0.4" 681 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 682 | dependencies: 683 | has "^1.0.1" 684 | 685 | is-symbol@^1.0.1: 686 | version "1.0.1" 687 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 688 | 689 | is-symbol@^1.0.2: 690 | version "1.0.2" 691 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 692 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 693 | dependencies: 694 | has-symbols "^1.0.0" 695 | 696 | isexe@^2.0.0: 697 | version "2.0.0" 698 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 699 | 700 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 701 | version "4.0.0" 702 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 703 | 704 | js-yaml@^3.13.1: 705 | version "3.13.1" 706 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 707 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 708 | dependencies: 709 | argparse "^1.0.7" 710 | esprima "^4.0.0" 711 | 712 | jsesc@^2.5.1: 713 | version "2.5.1" 714 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 715 | 716 | json-schema-traverse@^0.4.1: 717 | version "0.4.1" 718 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 719 | 720 | json-stable-stringify-without-jsonify@^1.0.1: 721 | version "1.0.1" 722 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 723 | 724 | jsx-ast-utils@^2.1.0: 725 | version "2.2.1" 726 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" 727 | integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== 728 | dependencies: 729 | array-includes "^3.0.3" 730 | object.assign "^4.1.0" 731 | 732 | levn@^0.3.0, levn@~0.3.0: 733 | version "0.3.0" 734 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 735 | dependencies: 736 | prelude-ls "~1.1.2" 737 | type-check "~0.3.2" 738 | 739 | lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: 740 | version "4.17.19" 741 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 742 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 743 | 744 | loose-envify@^1.3.1, loose-envify@^1.4.0: 745 | version "1.4.0" 746 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 747 | dependencies: 748 | js-tokens "^3.0.0 || ^4.0.0" 749 | 750 | mimic-fn@^2.1.0: 751 | version "2.1.0" 752 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 753 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 754 | 755 | minimatch@^3.0.4: 756 | version "3.0.4" 757 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 758 | dependencies: 759 | brace-expansion "^1.1.7" 760 | 761 | minimist@0.0.8: 762 | version "0.0.8" 763 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 764 | 765 | mkdirp@^0.5.1: 766 | version "0.5.1" 767 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 768 | dependencies: 769 | minimist "0.0.8" 770 | 771 | ms@^2.1.1: 772 | version "2.1.2" 773 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 774 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 775 | 776 | mute-stream@0.0.8: 777 | version "0.0.8" 778 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 779 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 780 | 781 | natural-compare@^1.4.0: 782 | version "1.4.0" 783 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 784 | 785 | nice-try@^1.0.4: 786 | version "1.0.4" 787 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" 788 | 789 | object-assign@^4.0.1, object-assign@^4.1.1: 790 | version "4.1.1" 791 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 792 | 793 | object-keys@^1.0.11, object-keys@^1.0.12: 794 | version "1.1.1" 795 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 796 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 797 | 798 | object-keys@^1.0.8: 799 | version "1.0.11" 800 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 801 | 802 | object.assign@^4.1.0: 803 | version "4.1.0" 804 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 805 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 806 | dependencies: 807 | define-properties "^1.1.2" 808 | function-bind "^1.1.1" 809 | has-symbols "^1.0.0" 810 | object-keys "^1.0.11" 811 | 812 | object.entries@^1.1.0: 813 | version "1.1.0" 814 | resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" 815 | integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== 816 | dependencies: 817 | define-properties "^1.1.3" 818 | es-abstract "^1.12.0" 819 | function-bind "^1.1.1" 820 | has "^1.0.3" 821 | 822 | object.fromentries@^2.0.0: 823 | version "2.0.0" 824 | resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" 825 | integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== 826 | dependencies: 827 | define-properties "^1.1.2" 828 | es-abstract "^1.11.0" 829 | function-bind "^1.1.1" 830 | has "^1.0.1" 831 | 832 | object.values@^1.1.0: 833 | version "1.1.0" 834 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" 835 | integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== 836 | dependencies: 837 | define-properties "^1.1.3" 838 | es-abstract "^1.12.0" 839 | function-bind "^1.1.1" 840 | has "^1.0.3" 841 | 842 | once@^1.3.0: 843 | version "1.4.0" 844 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 845 | dependencies: 846 | wrappy "1" 847 | 848 | onetime@^5.1.0: 849 | version "5.1.0" 850 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 851 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 852 | dependencies: 853 | mimic-fn "^2.1.0" 854 | 855 | optionator@^0.8.2: 856 | version "0.8.2" 857 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 858 | dependencies: 859 | deep-is "~0.1.3" 860 | fast-levenshtein "~2.0.4" 861 | levn "~0.3.0" 862 | prelude-ls "~1.1.2" 863 | type-check "~0.3.2" 864 | wordwrap "~1.0.0" 865 | 866 | os-tmpdir@~1.0.2: 867 | version "1.0.2" 868 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 869 | 870 | parent-module@^1.0.0: 871 | version "1.0.1" 872 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 873 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 874 | dependencies: 875 | callsites "^3.0.0" 876 | 877 | path-is-absolute@^1.0.0: 878 | version "1.0.1" 879 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 880 | 881 | path-key@^2.0.1: 882 | version "2.0.1" 883 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 884 | 885 | path-parse@^1.0.6: 886 | version "1.0.6" 887 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 888 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 889 | 890 | prelude-ls@~1.1.2: 891 | version "1.1.2" 892 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 893 | 894 | progress@^2.0.0: 895 | version "2.0.0" 896 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 897 | 898 | prop-types@^15.6.2: 899 | version "15.6.2" 900 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" 901 | dependencies: 902 | loose-envify "^1.3.1" 903 | object-assign "^4.1.1" 904 | 905 | prop-types@^15.7.2: 906 | version "15.7.2" 907 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" 908 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== 909 | dependencies: 910 | loose-envify "^1.4.0" 911 | object-assign "^4.1.1" 912 | react-is "^16.8.1" 913 | 914 | punycode@^2.1.0: 915 | version "2.1.1" 916 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 917 | 918 | react-is@^16.8.1: 919 | version "16.9.0" 920 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" 921 | integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== 922 | 923 | react-native-iphone-x-helper@^1.0.3: 924 | version "1.0.3" 925 | resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.0.3.tgz#7a2f1e0574e899a0f1d426e6167fd98990083214" 926 | 927 | regexpp@^2.0.1: 928 | version "2.0.1" 929 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 930 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 931 | 932 | resolve-from@^4.0.0: 933 | version "4.0.0" 934 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 935 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 936 | 937 | resolve@^1.10.1: 938 | version "1.12.0" 939 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" 940 | integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== 941 | dependencies: 942 | path-parse "^1.0.6" 943 | 944 | restore-cursor@^3.1.0: 945 | version "3.1.0" 946 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 947 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 948 | dependencies: 949 | onetime "^5.1.0" 950 | signal-exit "^3.0.2" 951 | 952 | rimraf@2.6.3: 953 | version "2.6.3" 954 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 955 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 956 | dependencies: 957 | glob "^7.1.3" 958 | 959 | run-async@^2.2.0: 960 | version "2.3.0" 961 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 962 | dependencies: 963 | is-promise "^2.1.0" 964 | 965 | rxjs@^6.4.0: 966 | version "6.5.2" 967 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" 968 | integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== 969 | dependencies: 970 | tslib "^1.9.0" 971 | 972 | "safer-buffer@>= 2.1.2 < 3": 973 | version "2.1.2" 974 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 975 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 976 | 977 | semver@^5.5.0: 978 | version "5.5.1" 979 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" 980 | 981 | semver@^6.1.2: 982 | version "6.3.0" 983 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 984 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 985 | 986 | shebang-command@^1.2.0: 987 | version "1.2.0" 988 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 989 | dependencies: 990 | shebang-regex "^1.0.0" 991 | 992 | shebang-regex@^1.0.0: 993 | version "1.0.0" 994 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 995 | 996 | signal-exit@^3.0.2: 997 | version "3.0.2" 998 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 999 | 1000 | slice-ansi@^2.1.0: 1001 | version "2.1.0" 1002 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1003 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1004 | dependencies: 1005 | ansi-styles "^3.2.0" 1006 | astral-regex "^1.0.0" 1007 | is-fullwidth-code-point "^2.0.0" 1008 | 1009 | source-map@^0.5.0: 1010 | version "0.5.7" 1011 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1012 | 1013 | sprintf-js@~1.0.2: 1014 | version "1.0.3" 1015 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1016 | 1017 | string-width@^3.0.0: 1018 | version "3.1.0" 1019 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1020 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1021 | dependencies: 1022 | emoji-regex "^7.0.1" 1023 | is-fullwidth-code-point "^2.0.0" 1024 | strip-ansi "^5.1.0" 1025 | 1026 | string-width@^4.1.0: 1027 | version "4.1.0" 1028 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" 1029 | integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== 1030 | dependencies: 1031 | emoji-regex "^8.0.0" 1032 | is-fullwidth-code-point "^3.0.0" 1033 | strip-ansi "^5.2.0" 1034 | 1035 | strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1036 | version "5.2.0" 1037 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1038 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1039 | dependencies: 1040 | ansi-regex "^4.1.0" 1041 | 1042 | strip-json-comments@^3.0.1: 1043 | version "3.0.1" 1044 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 1045 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 1046 | 1047 | supports-color@^4.0.0: 1048 | version "4.4.0" 1049 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 1050 | dependencies: 1051 | has-flag "^2.0.0" 1052 | 1053 | supports-color@^5.3.0: 1054 | version "5.5.0" 1055 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1056 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1057 | dependencies: 1058 | has-flag "^3.0.0" 1059 | 1060 | table@^5.2.3: 1061 | version "5.4.5" 1062 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.5.tgz#c8f4ea2d8fee08c0027fac27b0ec0a4fe01dfa42" 1063 | integrity sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA== 1064 | dependencies: 1065 | ajv "^6.10.2" 1066 | lodash "^4.17.14" 1067 | slice-ansi "^2.1.0" 1068 | string-width "^3.0.0" 1069 | 1070 | text-table@^0.2.0: 1071 | version "0.2.0" 1072 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1073 | 1074 | through@^2.3.6: 1075 | version "2.3.8" 1076 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1077 | 1078 | tmp@^0.0.33: 1079 | version "0.0.33" 1080 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1081 | dependencies: 1082 | os-tmpdir "~1.0.2" 1083 | 1084 | to-fast-properties@^2.0.0: 1085 | version "2.0.0" 1086 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1087 | 1088 | trim-right@^1.0.1: 1089 | version "1.0.1" 1090 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1091 | 1092 | tslib@^1.9.0: 1093 | version "1.10.0" 1094 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1095 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1096 | 1097 | type-check@~0.3.2: 1098 | version "0.3.2" 1099 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1100 | dependencies: 1101 | prelude-ls "~1.1.2" 1102 | 1103 | type-fest@^0.5.2: 1104 | version "0.5.2" 1105 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" 1106 | integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== 1107 | 1108 | uri-js@^4.2.2: 1109 | version "4.2.2" 1110 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1111 | dependencies: 1112 | punycode "^2.1.0" 1113 | 1114 | v8-compile-cache@^2.0.3: 1115 | version "2.1.0" 1116 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 1117 | integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 1118 | 1119 | which@^1.2.9: 1120 | version "1.3.0" 1121 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1122 | dependencies: 1123 | isexe "^2.0.0" 1124 | 1125 | wordwrap@~1.0.0: 1126 | version "1.0.0" 1127 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1128 | 1129 | wrappy@1: 1130 | version "1.0.2" 1131 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1132 | 1133 | write@1.0.3: 1134 | version "1.0.3" 1135 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1136 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1137 | dependencies: 1138 | mkdirp "^0.5.1" 1139 | --------------------------------------------------------------------------------