diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e2ead79..728ea04 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,6 +18,10 @@ jobs: node-version: 12 - name: Install dependencies run: yarn ci + - name: ESLint + run: yarn lint + - name: Tests + run: yarn test - name: Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.npmignore b/.npmignore index 1183a6c..0e98c09 100644 --- a/.npmignore +++ b/.npmignore @@ -29,6 +29,7 @@ codecov.yml __tests__/ jest.config.js jest.setup.js +coverage # Example examples/ @@ -94,6 +95,3 @@ bin/test.js codorials .vscode .nyc_output - -# Tests -coverage diff --git a/.releaserc b/.releaserc index e707a85..425d489 100644 --- a/.releaserc +++ b/.releaserc @@ -1,7 +1,12 @@ { "branches": ["master"], "plugins": [ - "@semantic-release/commit-analyzer", + ["@semantic-release/commit-analyzer", { + "preset": "angular", + "parserOpts": { + "noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"] + } + }], "@semantic-release/release-notes-generator", "@semantic-release/github", ["@semantic-release/changelog", { diff --git a/CHANGELOG.md b/CHANGELOG.md index ba14bb7..9dbd138 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [1.2.0](https://github.com/Rapsssito/react-native-background-actions/compare/v1.1.0...v1.2.0) (2020-02-20) + + +### Features + +* Allow non-serializable parameters ([#12](https://github.com/Rapsssito/react-native-background-actions/issues/12)) ([9addd1e](https://github.com/Rapsssito/react-native-background-actions/commit/9addd1e80be4f16ef7b7efc1ab9c4784fcec6ec8)) + # [1.1.0](https://github.com/Rapsssito/react-native-background-actions/compare/v1.0.4...v1.1.0) (2020-01-30) diff --git a/README.md b/README.md index e9d8623..65ae23e 100644 --- a/README.md +++ b/README.md @@ -101,8 +101,8 @@ To use this library you need to ensure you are using the correct version of Reac ```js import BackgroundService from 'react-native-background-actions'; -const veryIntensiveTask = async (taskData) => { - const args = taskData.arguments; +const veryIntensiveTask = async (taskDataArguments) => { + const { delay } = taskDataArguments; // You can do anything in your task such as network requests, timers and so on, as long as it doesn't touch UI. // Once your task completes (i.e. the promise is resolved), React Native will go into "paused" mode (unless // there are other tasks running, or there is a foreground app). @@ -117,7 +117,7 @@ const options = { type: 'mipmap', }, color: '#ff00ff', - arguments: { + parameters: { delay: 1000, }, }; @@ -142,7 +142,7 @@ options | `taskDesc` | `` | **Android Required**. Notification description. | | `taskIcon` | [``](#taskIconOptions) | **Android Required**. Notification icon. | | `color` | `` | Notification color. **Default**: `"#ffffff"` | -| `arguments` | `` | Extra parameters to pass to the task. | +| `parameters` | `` | Parameters to pass to the task. | #### taskIconOptions ```javascript diff --git a/RNBackgroundActionsModule.js b/RNBackgroundActionsModule.js new file mode 100644 index 0000000..2c29e73 --- /dev/null +++ b/RNBackgroundActionsModule.js @@ -0,0 +1,5 @@ +import { NativeModules } from 'react-native'; + +const { RNBackgroundActions } = NativeModules; + +export default RNBackgroundActions; diff --git a/__mocks__/RNBackgroundActionsModule.js b/__mocks__/RNBackgroundActionsModule.js new file mode 100644 index 0000000..db26e67 --- /dev/null +++ b/__mocks__/RNBackgroundActionsModule.js @@ -0,0 +1,4 @@ +export default { + start: jest.fn(), + stop: jest.fn(), +}; diff --git a/__tests__/index.test.js b/__tests__/index.test.js index cd009df..b38ce25 100644 --- a/__tests__/index.test.js +++ b/__tests__/index.test.js @@ -1,20 +1,10 @@ -import { NativeModules, Platform, AppRegistry } from 'react-native'; +import { Platform, AppRegistry } from 'react-native'; import BackgroundActions from '../index'; +import RNBackgroundActionsModule from '../RNBackgroundActionsModule'; -jest.mock('react-native', () => ({ - NativeModules: { - RNBackgroundActions: { - start: jest.fn(), - stop: jest.fn(), - }, - }, - Platform: { - OS: 'android', - }, - AppRegistry: { - registerHeadlessTask: jest.fn((taskName, task) => task()()), - }, -})); +Platform.OS = 'android'; + +AppRegistry.registerHeadlessTask = jest.fn((taskName, task) => task()()); const defaultOptions = { taskName: 'Example', @@ -24,35 +14,43 @@ const defaultOptions = { name: 'ic_launcher', type: 'mipmap', }, - arguments: { + parameters: { delay: 1000, }, }; +test('stop-empty', async () => { + RNBackgroundActionsModule.stop.mockClear(); + await BackgroundActions.stop(); + expect(RNBackgroundActionsModule.stop).toHaveBeenCalledTimes(1); +}); + test('start-android', async () => { const defaultTask = jest.fn(async () => {}); Platform.OS = 'android'; AppRegistry.registerHeadlessTask.mockClear(); - NativeModules.RNBackgroundActions.start.mockClear(); + RNBackgroundActionsModule.start.mockClear(); await BackgroundActions.start(defaultTask, defaultOptions); expect(defaultTask).toHaveBeenCalledTimes(1); + expect(defaultTask).toHaveBeenCalledWith(defaultOptions.parameters); expect(AppRegistry.registerHeadlessTask).toHaveBeenCalledTimes(1); - expect(NativeModules.RNBackgroundActions.start).toHaveBeenCalledTimes(1); + expect(RNBackgroundActionsModule.start).toHaveBeenCalledTimes(1); }); test('start-ios', async () => { const defaultTask = jest.fn(async () => {}); AppRegistry.registerHeadlessTask.mockClear(); Platform.OS = 'ios'; - NativeModules.RNBackgroundActions.start.mockClear(); + RNBackgroundActionsModule.start.mockClear(); await BackgroundActions.start(defaultTask, defaultOptions); expect(defaultTask).toHaveBeenCalledTimes(1); + expect(defaultTask).toHaveBeenCalledWith(defaultOptions.parameters); expect(AppRegistry.registerHeadlessTask).toHaveBeenCalledTimes(0); - expect(NativeModules.RNBackgroundActions.start).toHaveBeenCalledTimes(1); + expect(RNBackgroundActionsModule.start).toHaveBeenCalledTimes(1); }); test('stop', async () => { - NativeModules.RNBackgroundActions.stop.mockClear(); + RNBackgroundActionsModule.stop.mockClear(); await BackgroundActions.stop(); - expect(NativeModules.RNBackgroundActions.stop).toHaveBeenCalledTimes(1); + expect(RNBackgroundActionsModule.stop).toHaveBeenCalledTimes(1); }); diff --git a/index.js b/index.js index d288b12..0b319a1 100644 --- a/index.js +++ b/index.js @@ -1,39 +1,66 @@ -import { NativeModules, Platform, AppRegistry } from 'react-native'; - -const { RNBackgroundActions } = NativeModules; +import { Platform, AppRegistry } from 'react-native'; +import RNBackgroundActions from './RNBackgroundActionsModule'; +/** + * @typedef {{taskName: string, + * taskTitle: string, + * taskDesc: string, + * taskIcon: {name: string, type: string, package?: string}, + * color?: string, + * parameters?: any}} BackgroundTaskOptions + */ class BackgroundTimer { constructor() { - this.runnedTasks = 0; + this._runnedTasks = 0; + this._stopTask = () => {}; } /** - * @param {Promise} task - * @param {{taskName: string, taskTitle: string, taskDesc: string}} options + * @param {(taskData: any) => Promise} task + * @param {BackgroundTaskOptions} options */ async start(task, options) { - this.runnedTasks++; - const finalOptions = this.normalizeOptions(options); + this._runnedTasks++; + const finalOptions = this._normalizeOptions(options); + const finalTask = this._generateTask(task, options.parameters); if (Platform.OS === 'android') { - AppRegistry.registerHeadlessTask(finalOptions.taskName, () => task); + AppRegistry.registerHeadlessTask(finalOptions.taskName, () => finalTask); await RNBackgroundActions.start(finalOptions); } else { await RNBackgroundActions.start(finalOptions); - task(finalOptions).then(() => this.stop()); + finalTask(); } } /** - * @param {{taskName: string, taskTitle: string, taskDesc: string}} options + * @param {(taskData: any) => Promise} task + * @param {any} [parameters] + */ + _generateTask(task, parameters) { + const self = this; + return async () => { + await new Promise((resolve) => { + self._stopTask = resolve; + task(parameters).then(() => resolve()); + }); + }; + } + + /** + * @param {BackgroundTaskOptions} options */ - normalizeOptions(options) { + _normalizeOptions(options) { return { - ...options, - taskName: options.taskName + this.runnedTasks, + taskName: options.taskName + this._runnedTasks, + taskTitle: options.taskTitle, + taskDesc: options.taskDesc, + taskIcon: { ...options.taskIcon }, + color: options.color || '#ffffff', }; } async stop() { + this._stopTask(); await RNBackgroundActions.stop(); } } diff --git a/jest.setup.js b/jest.setup.js index e69de29..00663a8 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -0,0 +1 @@ +jest.mock('./RNBackgroundActionsModule'); diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..abc807c --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "checkJs": true, + }, + "exclude": ["node_modules", "coverage", ".github", "examples", "ios", "android"], +} diff --git a/package.json b/package.json index 967195a..7666c28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-background-actions", - "version": "1.1.0", + "version": "1.2.0", "description": "React Native background service library for running background tasks forever in Android & iOS", "keywords": [ "react-native", @@ -37,6 +37,7 @@ "@semantic-release/git": "^9.0.0", "@semantic-release/github": "^7.0.0", "@semantic-release/npm": "^7.0.0", + "@types/jest": "^25.1.3", "babel-jest": "^24.9.0", "eslint": "^6.6.0", "eslint-config-prettier": "^6.5.0", diff --git a/yarn.lock b/yarn.lock index 6f4b6c0..242d8be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -859,6 +859,16 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@jest/types@^25.1.0": + version "25.1.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395" + integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -1228,6 +1238,14 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest@^25.1.3": + version "25.1.3" + resolved "https://registry.npmjs.org/@types/jest/-/jest-25.1.3.tgz#9b0b5addebccfb631175870be8ba62182f1bc35a" + integrity sha512-jqargqzyJWgWAJCXX96LBGR/Ei7wQcZBvRv0PLEu9ZByMfcs23keUJrKv9FMR6YZf9YCbfqDqgmY+JUBsnqhrg== + dependencies: + jest-diff "^25.1.0" + pretty-format "^25.1.0" + "@types/json-schema@^7.0.3": version "7.0.4" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" @@ -1275,6 +1293,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^15.0.0": + version "15.0.3" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz#41453a0bc7ab393e995d1f5451455638edbd2baf" + integrity sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ== + dependencies: + "@types/yargs-parser" "*" + "@typescript-eslint/experimental-utils@^2.5.0": version "2.16.0" resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.16.0.tgz#bba65685728c532e0ddc811a0376e8d38e671f77" @@ -1502,7 +1527,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== @@ -2104,6 +2129,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -2667,7 +2700,7 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -2794,6 +2827,11 @@ diff-sequences@^24.9.0: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== +diff-sequences@^25.1.0: + version "25.1.0" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32" + integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw== + dir-glob@^3.0.0, dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3860,6 +3898,11 @@ has-flag@^3.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbols@^1.0.0, has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" @@ -4086,7 +4129,7 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -4634,6 +4677,16 @@ jest-diff@^24.9.0: jest-get-type "^24.9.0" pretty-format "^24.9.0" +jest-diff@^25.1.0: + version "25.1.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad" + integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.1.0" + jest-get-type "^25.1.0" + pretty-format "^25.1.0" + jest-docblock@^24.3.0: version "24.9.0" resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" @@ -4680,6 +4733,11 @@ jest-get-type@^24.9.0: resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== +jest-get-type@^25.1.0: + version "25.1.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876" + integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw== + jest-haste-map@^24.7.1, jest-haste-map@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" @@ -5353,11 +5411,6 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -5366,33 +5419,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -5433,11 +5464,6 @@ lodash.isstring@^4.0.1: resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -7079,6 +7105,16 @@ pretty-format@^24.7.0, pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" +pretty-format@^25.1.0: + version "25.1.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" + integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== + dependencies: + "@jest/types" "^25.1.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + private@^0.1.6: version "0.1.8" resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -7257,7 +7293,7 @@ react-devtools-core@^3.6.3: shell-quote "^1.6.1" ws "^3.3.1" -react-is@^16.8.1, react-is@^16.8.4: +react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4: version "16.12.0" resolved "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== @@ -8482,6 +8518,13 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + supports-hyperlinks@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7"