├── .babelrc ├── .buckconfig ├── .eslintrc.js ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .travis.yml ├── .watchmanconfig ├── LICENSE ├── README.md ├── __tests__ ├── __snapshots__ │ └── index.test.js.snap └── index.test.js ├── app.json ├── index.d.ts ├── index.js ├── jsconfig.json ├── package-lock.json └── package.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"], 3 | "plugins": [ 4 | "@babel/plugin-syntax-class-properties", 5 | "@babel/plugin-proposal-class-properties", 6 | ] 7 | } -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "jest": true 7 | 8 | }, 9 | "extends": [ 10 | "eslint:recommended", 11 | "plugin:react/recommended" 12 | ], 13 | "parserOptions": { 14 | "ecmaFeatures": { 15 | "experimentalObjectRestSpread": true, 16 | "jsx": true 17 | }, 18 | "sourceType": "module" 19 | }, 20 | "plugins": [ 21 | "react", 22 | "react-native", 23 | "classes", 24 | ], 25 | "globals": { 26 | "dip" : true, 27 | "fdip" : true, 28 | "globalBackHandler": true, 29 | "jasmine": true, 30 | "idx": true, 31 | }, 32 | "parser": "babel-eslint", 33 | "rules": { 34 | "classes/space": 2, 35 | "classes/name": [2, "class", "method"], 36 | "classes/style": 2, 37 | "strict": 0, 38 | "prefer-const": "error", 39 | "react/prop-types": [ 40 | "error",{} 41 | ], 42 | "brace-style": "error", 43 | "new-cap": ["error", 44 | { "newIsCap": true } 45 | ], 46 | "block-spacing": "error", 47 | "keyword-spacing":"error", 48 | "no-irregular-whitespace": "error", 49 | "space-in-parens": ["error", "never"], 50 | "space-unary-ops": "error", 51 | "space-before-function-paren": ["error", "never"], 52 | "no-multi-spaces": "error", 53 | "comma-spacing": ["error", { "before": false, "after": true }], 54 | "computed-property-spacing": ["error", "never"], 55 | "key-spacing": ["error", { "beforeColon": false, "afterColon": true }], 56 | "no-lonely-if": "error", 57 | "no-mixed-spaces-and-tabs": "error", 58 | "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 1 }], 59 | "space-infix-ops": "error", 60 | "indent": [ 61 | "error", 62 | 2, 63 | { "SwitchCase": 1 } 64 | ], 65 | /*"linebreak-style": [ 66 | "error", 67 | "unix" 68 | ],*/ 69 | "quotes": [ 70 | "error", 71 | "single" 72 | ], 73 | "semi": [ 74 | "error", 75 | "never" 76 | ], 77 | "comma-dangle": [ 78 | "error", 79 | "always-multiline" 80 | ], 81 | "arrow-spacing": [ 82 | "error" 83 | ], 84 | "max-len": ["error", 130], 85 | "react/jsx-uses-react": "error", 86 | "react/jsx-uses-vars": "error", 87 | 88 | "react-native/no-unused-styles": 2, 89 | "react-native/split-platform-components": 0, 90 | "react-native/no-inline-styles": 2, 91 | "react-native/no-color-literals": 0, 92 | 93 | } 94 | }; 95 | 96 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | emoji=true 26 | 27 | module.system=haste 28 | 29 | experimental.strict_type_args=true 30 | 31 | munge_underscores=true 32 | 33 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 34 | 35 | suppress_type=$FlowIssue 36 | suppress_type=$FlowFixMe 37 | suppress_type=$FixMe 38 | 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-0]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-0]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 41 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 42 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 43 | 44 | unsafe.enable_getters_and_setters=true 45 | 46 | [version] 47 | ^0.40.0 48 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | 44 | # fastlane 45 | # 46 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 47 | # screenshots whenever they are needed. 48 | # For more information about the recommended setup visit: 49 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 50 | 51 | fastlane/report.xml 52 | fastlane/Preview.html 53 | fastlane/screenshots 54 | 55 | coverage/ 56 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | after_success: 'npm run coveralls' -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017-2018 Tobias Meinhardt 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Native Event Listeners 2 | 3 | (This package isn't only restricted to react-native projects. The source is written in plain js with no dependencies to react-native.) 4 | 5 | [![Financial Contributors on Open Collective](https://opencollective.com/react-native-event-listeners/all/badge.svg?label=financial+contributors)](https://opencollective.com/react-native-event-listeners) [![npm version](https://badge.fury.io/js/react-native-event-listeners.svg)](https://badge.fury.io/js/react-native-event-listeners) 6 | [![dependencie status](https://david-dm.org/tobiasMeinhardt/react-native-event-listeners.svg)](https://david-dm.org/tobiasMeinhardt/react-native-event-listeners) 7 | [![dev-dependency status](https://david-dm.org/tobiasMeinhardt/react-native-event-listeners/dev-status.svg)](https://david-dm.org/tobiasMeinhardt/react-native-event-listeners?type=dev) 8 | [![npm](https://img.shields.io/npm/dm/react-native-event-listeners.svg)](https://www.npmjs.com/package/react-native-event-listeners) 9 | [![npm](https://img.shields.io/npm/dt/react-native-event-listeners.svg)](https://www.npmjs.com/package/react-native-event-listeners) 10 | [![travis build](https://travis-ci.org/meinto/react-native-event-listeners.svg?branch=master)](https://travis-ci.org/meinto/react-native-event-listeners) 11 | [![Coverage Status](https://coveralls.io/repos/github/meinto/react-native-event-listeners/badge.svg?branch=master)](https://coveralls.io/github/meinto/react-native-event-listeners?branch=master) 12 | 13 | ## Why 14 | 15 | In some very specific cases it can be charming to have a simple global event listener. While working with global event listeners **you don't have to pass touch events through the component tree** into other components or can **bypass easily the redux architecture** for example. 16 | 17 | ## Installation 18 | 19 | ``` 20 | npm install --save react-native-event-listeners 21 | ``` 22 | 23 | or 24 | 25 | ``` 26 | yarn add react-native-event-listeners 27 | ``` 28 | 29 | ## Usage Example 30 | 31 | *Hint: The event listeners also work across different files. You only have to import the ```EventRegister``` in every file you need to send or receive your events.* 32 | 33 | ```javascript 34 | import { EventRegister } from 'react-native-event-listeners' 35 | 36 | /* 37 | * RECEIVER COMPONENT 38 | */ 39 | class Receiver extends PureComponent { 40 | constructor(props) { 41 | super(props) 42 | 43 | this.state = { 44 | data: 'no data', 45 | } 46 | } 47 | 48 | componentWillMount() { 49 | this.listener = EventRegister.addEventListener('myCustomEvent', (data) => { 50 | this.setState({ 51 | data, 52 | }) 53 | }) 54 | } 55 | 56 | componentWillUnmount() { 57 | EventRegister.removeEventListener(this.listener) 58 | } 59 | 60 | render() { 61 | return {this.state.data} 62 | } 63 | } 64 | 65 | /* 66 | * SENDER COMPONENT 67 | */ 68 | const Sender = (props) => ( 69 | { 71 | EventRegister.emit('myCustomEvent', 'it works!!!') 72 | }) 73 | >Send Event 74 | ) 75 | ``` 76 | 77 | ## API 78 | 79 | ```javascript 80 | // import 81 | import { EventRegister } from 'react-native-event-listeners' 82 | ``` 83 | 84 | | static method | return value | description | 85 | | :------------------ | :---------------- | :------------------------------------------------------------- | 86 | | addEventListener | string \| boolean | return value is the id of the event listener or false on error | 87 | | removeEventListener | boolean | true on success otherwise false | 88 | | removeAllListeners | boolean | true on success otherwise false | 89 | | emitEvent | void | no return value | 90 | | on | string \| boolean | **shorthand** for addEventListener | 91 | | rm | boolean | **shorthand** for removeEventListener | 92 | | rmAll | boolean | **shorthand** for removeAllListeners | 93 | | emit | void | **shorthand** for emitEvent | 94 | 95 | 96 | ## Contributors 97 | 98 | ### Code Contributors 99 | 100 | This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. 101 | 102 | 103 | ### Financial Contributors 104 | 105 | Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/react-native-event-listeners/contribute)] 106 | 107 | #### Individuals 108 | 109 | 110 | 111 | #### Organizations 112 | 113 | Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/react-native-event-listeners/contribute)] 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /__tests__/__snapshots__/index.test.js.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`EventRegister tests tests that eventlisteners are added properly 1`] = ` 4 | Object { 5 | "count": 3, 6 | "refs": Object { 7 | "l1": Object { 8 | "callback": [Function], 9 | "name": "test", 10 | }, 11 | "l2": Object { 12 | "callback": [Function], 13 | "name": "test", 14 | }, 15 | "l3": Object { 16 | "callback": [Function], 17 | "name": "test", 18 | }, 19 | }, 20 | } 21 | `; 22 | 23 | exports[`EventRegister tests tests that removeAllListeners works properly 1`] = ` 24 | Object { 25 | "count": 3, 26 | "refs": Object {}, 27 | } 28 | `; 29 | 30 | exports[`EventRegister tests tests that removeEventListener works properly 1`] = ` 31 | Object { 32 | "count": 3, 33 | "refs": Object { 34 | "l1": Object { 35 | "callback": [Function], 36 | "name": "test", 37 | }, 38 | "l3": Object { 39 | "callback": [Function], 40 | "name": "test", 41 | }, 42 | }, 43 | } 44 | `; 45 | 46 | -------------------------------------------------------------------------------- /__tests__/index.test.js: -------------------------------------------------------------------------------- 1 | import { EventRegister } from '../index' 2 | 3 | describe('EventRegister tests', () => { 4 | 5 | beforeEach(() => { 6 | EventRegister._Listeners = { 7 | count: 0, 8 | refs: {}, 9 | } 10 | }) 11 | 12 | const _addEventListener = (name = 'test', func = () => {}) => { 13 | return EventRegister.addEventListener(name, func) 14 | } 15 | 16 | 17 | it('tests that eventlisteners are added properly', () => { 18 | const id = _addEventListener() 19 | _addEventListener() 20 | _addEventListener() 21 | expect(id).toBe('l1') 22 | expect(EventRegister._Listeners).toMatchSnapshot() 23 | }) 24 | 25 | 26 | it('tests that removeEventListener works properly', () => { 27 | _addEventListener() 28 | const id = _addEventListener() 29 | _addEventListener() 30 | 31 | const removed = EventRegister.removeEventListener(id) 32 | expect(EventRegister._Listeners).toMatchSnapshot() 33 | expect(removed).toBe(true) 34 | 35 | const removed2 = EventRegister.removeEventListener('idNotAvailable') 36 | expect(removed2).toBe(true) 37 | 38 | const removed3 = EventRegister.removeEventListener(123) 39 | expect(removed3).toBe(false) 40 | }) 41 | 42 | 43 | it('tests that removeAllListeners works properly', () => { 44 | _addEventListener() 45 | _addEventListener() 46 | _addEventListener() 47 | 48 | const removed = EventRegister.removeAllListeners() 49 | expect(EventRegister._Listeners).toMatchSnapshot() 50 | expect(removed).toBe(true) 51 | }) 52 | 53 | 54 | it('tests that emitEvent works properly', () => { 55 | const mockFunc1 = jest.fn() 56 | const mockFunc2 = jest.fn() 57 | const mockFunc3 = jest.fn() 58 | _addEventListener('test1', mockFunc1) 59 | _addEventListener('test2', mockFunc2) 60 | _addEventListener('test3', mockFunc3) 61 | EventRegister.emitEvent('test1', { mockValue: 'mock 1' }) 62 | expect(mockFunc1).toHaveBeenCalledWith({ mockValue: 'mock 1' }) 63 | EventRegister.emitEvent('test3', { mockValue: 'mock 3' }) 64 | expect(mockFunc3).toHaveBeenCalledWith({ mockValue: 'mock 3' }) 65 | }) 66 | 67 | 68 | it('tests that removed callbacks are not called', () => { 69 | const mockFunc1 = jest.fn() 70 | const mockFunc2 = jest.fn() 71 | const mockFunc3 = jest.fn() 72 | const id = _addEventListener('test1', mockFunc1) 73 | _addEventListener('test2', mockFunc2) 74 | _addEventListener('test3', mockFunc3) 75 | EventRegister.removeEventListener(id) 76 | EventRegister.emitEvent('test1', { mockValue: 'mock 1' }) 77 | expect(mockFunc1).not.toHaveBeenCalled() 78 | EventRegister.emitEvent('test3', { mockValue: 'mock 3' }) 79 | expect(mockFunc3).toHaveBeenCalledWith({ mockValue: 'mock 3' }) 80 | 81 | _addEventListener('test1', mockFunc1) 82 | EventRegister.emitEvent('test1', { mockValue: 'mock 1' }) 83 | expect(mockFunc1).toHaveBeenCalledWith({ mockValue: 'mock 1' }) 84 | }) 85 | 86 | /* shorthands */ 87 | it('tests that addEventListener is called with shorthand "on"', () => { 88 | EventRegister.addEventListener = jest.fn() 89 | const func = jest.fn() 90 | EventRegister.on('name', func) 91 | expect(EventRegister.addEventListener).toHaveBeenCalledWith('name', func) 92 | }) 93 | 94 | 95 | it('tests that removeEventListener is called with shorthand "rm"', () => { 96 | EventRegister.removeEventListener = jest.fn(() => { 97 | return 'removed' 98 | }) 99 | const id = _addEventListener() 100 | 101 | const removed = EventRegister.rm(id) 102 | expect(EventRegister.removeEventListener).toHaveBeenCalledWith(id) 103 | expect(removed).toBe('removed') 104 | }) 105 | 106 | 107 | it('tests that removeAllListeners is called with shorthand "rmAll"', () => { 108 | EventRegister.removeAllListeners = jest.fn(() => { 109 | return 'removed' 110 | }) 111 | _addEventListener() 112 | _addEventListener() 113 | _addEventListener() 114 | 115 | const removed = EventRegister.rmAll() 116 | expect(EventRegister.removeAllListeners).toHaveBeenCalled() 117 | expect(removed).toBe('removed') 118 | }) 119 | 120 | 121 | it('tests that emitEvent is called with shorthand "emit"', () => { 122 | EventRegister.emitEvent = jest.fn() 123 | EventRegister.emit('test', { 124 | mockValue: 'val', 125 | }) 126 | expect(EventRegister.emitEvent).toHaveBeenCalledWith('test', { 127 | mockValue: 'val', 128 | }) 129 | }) 130 | 131 | }) 132 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactNativeMirror", 3 | "displayName": "reactNativeMirror" 4 | } -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'react-native-event-listeners' { 2 | type Callback = (data: any) => void; 3 | 4 | class EventRegister { 5 | public static addEventListener(eventName: string, callback: Callback): string | boolean 6 | 7 | public static removeEventListener(id: string): boolean 8 | 9 | public static removeAllListeners(): boolean 10 | 11 | public static emitEvent(eventName: string, data?: any): void 12 | 13 | // shortener 14 | public static on(eventName: string, callback: Callback): string | boolean 15 | 16 | public static rm(id: string): boolean 17 | 18 | public static rmAll(): boolean 19 | 20 | public static emit(eventName: string, data?: any): void 21 | } 22 | 23 | export { EventRegister }; 24 | } 25 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import type from 'type-detect' 2 | 3 | class EventRegister { 4 | 5 | static _Listeners = { 6 | count: 0, 7 | refs: {}, 8 | } 9 | 10 | static addEventListener(eventName, callback) { 11 | if ( 12 | type(eventName) === 'string' && 13 | type(callback) === 'function' 14 | ) { 15 | EventRegister._Listeners.count++ 16 | const eventId = 'l' + EventRegister._Listeners.count 17 | EventRegister._Listeners.refs[eventId] = { 18 | name: eventName, 19 | callback, 20 | } 21 | return eventId 22 | } 23 | return false 24 | } 25 | 26 | static removeEventListener(id) { 27 | if (type(id) === 'string') { 28 | return delete EventRegister._Listeners.refs[id] 29 | } 30 | return false 31 | } 32 | 33 | static removeAllListeners() { 34 | let removeError = false 35 | Object.keys(EventRegister._Listeners.refs).forEach(_id => { 36 | const removed = delete EventRegister._Listeners.refs[_id] 37 | removeError = (!removeError) ? !removed : removeError 38 | }) 39 | return !removeError 40 | } 41 | 42 | static emitEvent(eventName, data) { 43 | Object.keys(EventRegister._Listeners.refs).forEach(_id => { 44 | if ( 45 | EventRegister._Listeners.refs[_id] && 46 | eventName === EventRegister._Listeners.refs[_id].name 47 | ) 48 | EventRegister._Listeners.refs[_id].callback(data) 49 | }) 50 | } 51 | 52 | /* 53 | * shortener 54 | */ 55 | static on(eventName, callback) { 56 | return EventRegister.addEventListener(eventName, callback) 57 | } 58 | 59 | static rm(eventName) { 60 | return EventRegister.removeEventListener(eventName) 61 | } 62 | 63 | static rmAll() { 64 | return EventRegister.removeAllListeners() 65 | } 66 | 67 | static emit(eventName, data) { 68 | EventRegister.emitEvent(eventName, data) 69 | } 70 | 71 | } 72 | 73 | export { EventRegister } 74 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "allowSyntheticDefaultImports": true 5 | }, 6 | "exclude": [ 7 | "node_modules" 8 | ] 9 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-event-listeners", 3 | "version": "1.0.7", 4 | "author": "Tobias Meinhardt ", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node node_modules/react-native/local-cli/cli.js start", 8 | "test": "jest --no-cache", 9 | "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/tobiasMeinhardt/react-native-event-listeners" 14 | }, 15 | "bugs": { 16 | "url": "https://github.com/tobiasMeinhardt/react-native-event-listeners/issues" 17 | }, 18 | "keywords": [ 19 | "react", 20 | "react-native", 21 | "event listeners", 22 | "listeners", 23 | "events" 24 | ], 25 | "tags": [ 26 | "react", 27 | "react-native", 28 | "event listeners", 29 | "listeners", 30 | "events" 31 | ], 32 | "license": "MIT", 33 | "dependencies": { 34 | "type-detect": "^4.0.8" 35 | }, 36 | "devDependencies": { 37 | "@babel/plugin-proposal-class-properties": "^7.7.0", 38 | "@babel/plugin-syntax-class-properties": "^7.2.0", 39 | "@babel/preset-env": "^7.7.1", 40 | "coveralls": "^3.0.7", 41 | "jest": "^24.9.0" 42 | }, 43 | "jest": { 44 | "collectCoverage": true, 45 | "collectCoverageFrom": [ 46 | "index.js" 47 | ] 48 | } 49 | } 50 | --------------------------------------------------------------------------------