From 6064ccf846f305fb3b9e50c7983ce0902ec1729d Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Fri, 7 Aug 2020 17:45:54 -0400 Subject: [PATCH 01/44] Update MFA companion package --- companion-packages/meteorrn-ndev-mfa/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion-packages/meteorrn-ndev-mfa/index.js b/companion-packages/meteorrn-ndev-mfa/index.js index 2492c2d..93b70e5 100644 --- a/companion-packages/meteorrn-ndev-mfa/index.js +++ b/companion-packages/meteorrn-ndev-mfa/index.js @@ -26,7 +26,7 @@ let assembleChallengeCompletionArguments = async function (finishLoginParams, co assertion = {challengeId, challengeSecret, ...code}; } else { - assertion = await solveU2FChallenge(res); + throw new Error("Code must be a U2FAuthorizationCode"); } methodArguments.push(assertion); } From 7e6cf8601f071f5a5361651a90d3de3a4fae09c9 Mon Sep 17 00:00:00 2001 From: Polaris Web Technology Date: Fri, 7 Aug 2020 14:49:57 -0700 Subject: [PATCH 02/44] Replace code for depreciated componentWillMount() (#10) * Allow other AsyncStorage packages to be used * Allows for option to specify AsyncStorage package... Either React Native Async Storage (Expo), with fallback using @react-native-community/async-storage if no AsyncStorage is provided for backwards compatibility. * Remove commented code * Fix package version * Add "Custom Storage Adapter" to Installation * Update AsyncStorage options * Bump package version to 2.0.2 since no longer a breaking change * Throw an error instead of console error if no AsyncStorage installed * Remove dead code `setItem()` * Temporary solution to depreciated componentWillUpdate... Using the [`UNSAFE_componentWillUpdate()`](https://reactjs.org/docs/react-component.html#unsafe_componentwillupdate) version to get throgh React v17. * Moved code to a constructor to replace componentWillMount()... depreciated code Co-authored-by: Nathaniel Dsouza --- src/components/ReactMeteorData.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/components/ReactMeteorData.js b/src/components/ReactMeteorData.js index 21963a7..cfce2ff 100644 --- a/src/components/ReactMeteorData.js +++ b/src/components/ReactMeteorData.js @@ -5,16 +5,7 @@ import Data from '../Data'; import MeteorDataManager from './MeteorDataManager'; const ReactMeteorData = { - UNSAFE_componentWillMount() { - Data.waitDdpReady(() => { - if (this.getMeteorData) { - this.data = {}; - this._meteorDataManager = new MeteorDataManager(this); - const newData = this._meteorDataManager.calculateData(); - this._meteorDataManager.updateData(newData); - } - }); - }, + UNSAFE_componentWillUpdate(nextProps, nextState) { if (this.startMeteorSubscriptions) { @@ -65,6 +56,7 @@ export { ReactMeteorData }; class ReactComponent extends React.Component {} Object.assign(ReactComponent.prototype, ReactMeteorData); + class ReactPureComponent extends React.PureComponent {} Object.assign(ReactPureComponent.prototype, ReactMeteorData); @@ -81,9 +73,23 @@ export default function connect(options) { const BaseComponent = pure ? ReactPureComponent : ReactComponent; return WrappedComponent => class ReactMeteorDataComponent extends BaseComponent { + constructor(props) { + super(props); + + Data.waitDdpReady(() => { + if (this.getMeteorData) { + this.data = {}; + this._meteorDataManager = new MeteorDataManager(this); + const newData = this._meteorDataManager.calculateData(); + this._meteorDataManager.updateData(newData); + } + }); + } + getMeteorData() { return getMeteorData(this.props); } + render() { return ; } From faf2ea390ba57cec3df513cd1df58047cf823778 Mon Sep 17 00:00:00 2001 From: Sandeep Jain Date: Sat, 8 Aug 2020 03:20:22 +0530 Subject: [PATCH 03/44] Add useTracker function (#17) --- src/Meteor.js | 2 ++ src/components/useTracker.js | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/components/useTracker.js diff --git a/src/Meteor.js b/src/Meteor.js index 3c32142..9ad5c64 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -17,6 +17,7 @@ import { Collection, runObservers, localCollections } from './Collection'; import call from './Call'; import withTracker from './components/ReactMeteorData'; +import useTracker from './components/useTracker'; import ReactiveDict from './ReactiveDict'; @@ -42,6 +43,7 @@ module.exports = { return new Collection(name, options); }, withTracker, + useTracker, getData() { return Data; }, diff --git a/src/components/useTracker.js b/src/components/useTracker.js new file mode 100644 index 0000000..f498a88 --- /dev/null +++ b/src/components/useTracker.js @@ -0,0 +1,23 @@ +import React, { useEffect, useState } from 'react'; +import Trackr from 'trackr'; + +export default useTracker = (trackerFn, deps = []) => { + const [response, setResponse] = useState(trackerFn()); + let computation = null; + + const stopComputation = () => { + computation && computation.stop(); + computation = null; + }; + + useEffect(() => { + stopComputation(); + Trackr.autorun(currentComputation => { + computation = currentComputation; + setResponse(trackerFn()); + }); + return stopComputation; + }, deps); + + return response; +}; From 11288f6fb22f04bdae3c8e5a5161c9fd56f81e22 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Fri, 7 Aug 2020 17:51:22 -0400 Subject: [PATCH 04/44] Bump dev package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5251b8d..de9b7f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.0.12", + "version": "2.1.0", "description": "Full Meteor Client for React Native", "main": "src/Meteor.js", "repository": { From 03bcd2823c36ac6fc246a3bf96ea67398305c26e Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Sun, 9 Aug 2020 01:24:18 +0000 Subject: [PATCH 05/44] 2.1.0-beta1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de9b7f3..db41c3b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0", + "version": "2.1.0-beta1", "description": "Full Meteor Client for React Native", "main": "src/Meteor.js", "repository": { From 528ffce89b68e0024860b9e806247e888bbeedc4 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Sat, 8 Aug 2020 21:32:52 -0400 Subject: [PATCH 06/44] Removing useTracker.js from dev since author has said it is not ready --- src/components/useTracker.js | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/components/useTracker.js diff --git a/src/components/useTracker.js b/src/components/useTracker.js deleted file mode 100644 index f498a88..0000000 --- a/src/components/useTracker.js +++ /dev/null @@ -1,23 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import Trackr from 'trackr'; - -export default useTracker = (trackerFn, deps = []) => { - const [response, setResponse] = useState(trackerFn()); - let computation = null; - - const stopComputation = () => { - computation && computation.stop(); - computation = null; - }; - - useEffect(() => { - stopComputation(); - Trackr.autorun(currentComputation => { - computation = currentComputation; - setResponse(trackerFn()); - }); - return stopComputation; - }, deps); - - return response; -}; From 01593b2f6784cd696eca999fddb12d5788abe12c Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Sat, 8 Aug 2020 21:33:12 -0400 Subject: [PATCH 07/44] Remove useTracker --- src/Meteor.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Meteor.js b/src/Meteor.js index 9ad5c64..b4a4ed8 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -17,7 +17,6 @@ import { Collection, runObservers, localCollections } from './Collection'; import call from './Call'; import withTracker from './components/ReactMeteorData'; -import useTracker from './components/useTracker'; import ReactiveDict from './ReactiveDict'; @@ -43,7 +42,6 @@ module.exports = { return new Collection(name, options); }, withTracker, - useTracker, getData() { return Data; }, @@ -352,4 +350,4 @@ module.exports = { }, }; -export default module.exports; \ No newline at end of file +export default module.exports; From 8ed46591755cd2a638b86b5e5fd2a4d1543ea9ce Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Sat, 8 Aug 2020 21:38:22 -0400 Subject: [PATCH 08/44] Remove unnecessary code --- src/user/Accounts.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/user/Accounts.js b/src/user/Accounts.js index d63b8df..e6d4f81 100644 --- a/src/user/Accounts.js +++ b/src/user/Accounts.js @@ -8,9 +8,6 @@ class AccountsPassword { _hashPassword = hashPassword; createUser = (options, callback = () => {}) => { - if (options.username) options.username = options.username; - if (options.email) options.email = options.email; - // Replace password with the hashed password. options.password = hashPassword(options.password); @@ -76,4 +73,4 @@ class AccountsPassword { } } -export default new AccountsPassword(); \ No newline at end of file +export default new AccountsPassword(); From 63f1ae5b5c500bfd6b3de8ca7eb52f4d79c84e97 Mon Sep 17 00:00:00 2001 From: Kelly Copley Date: Sun, 9 Aug 2020 14:30:32 -0400 Subject: [PATCH 09/44] add useTracker and rewrite withTracker to use it (#31) fixes #29 --- src/Meteor.js | 20 ++--- src/components/MeteorDataManager.js | 118 ---------------------------- src/components/ReactMeteorData.js | 97 ----------------------- src/components/useTracker.js | 30 +++++++ src/components/withTracker.js | 16 ++++ 5 files changed, 57 insertions(+), 224 deletions(-) delete mode 100644 src/components/MeteorDataManager.js delete mode 100644 src/components/ReactMeteorData.js create mode 100644 src/components/useTracker.js create mode 100644 src/components/withTracker.js diff --git a/src/Meteor.js b/src/Meteor.js index b4a4ed8..566c3c0 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -16,7 +16,8 @@ import Mongo from './Mongo'; import { Collection, runObservers, localCollections } from './Collection'; import call from './Call'; -import withTracker from './components/ReactMeteorData'; +import withTracker from './components/withTracker'; +import useTracker from './components/useTracker'; import ReactiveDict from './ReactiveDict'; @@ -42,6 +43,7 @@ module.exports = { return new Collection(name, options); }, withTracker, + useTracker, getData() { return Data; }, @@ -84,7 +86,7 @@ module.exports = { if((!endpoint.startsWith("ws") || !endpoint.endsWith("/websocket")) && !options.suppressUrlErrors) { throw new Error(`Your url "${endpoint}" may be in the wrong format. It should start with "ws://" or "wss://" and end with "/websocket", e.g. "wss://myapp.meteor.com/websocket". To disable this warning, connect with option "suppressUrlErrors" as true, e.g. Meteor.connect("${endpoint}", {suppressUrlErrors:true});`); } - + if (!options.AsyncStorage) { const AsyncStorage = require('@react-native-community/async-storage').default; @@ -155,9 +157,9 @@ module.exports = { _id: message.id, ...message.fields, }; - + Data.db[message.collection].upsert(document); - + runObservers("added", message.collection, document); }); @@ -192,18 +194,18 @@ module.exports = { ...message.fields, ...unset, }; - + const oldDocument = Data.db[message.collection].findOne({_id:message.id}); - + Data.db[message.collection].upsert(document); - - runObservers("changed", message.collection, document, oldDocument); + + runObservers("changed", message.collection, document, oldDocument); } }); Data.ddp.on('removed', message => { if(Data.db[message.collection]) { - const oldDocument = Data.db[message.collection].findOne({_id:message.id}); + const oldDocument = Data.db[message.collection].findOne({_id:message.id}); Data.db[message.collection].del(message.id); runObservers("removed", message.collection, oldDocument); } diff --git a/src/components/MeteorDataManager.js b/src/components/MeteorDataManager.js deleted file mode 100644 index c6b75bd..0000000 --- a/src/components/MeteorDataManager.js +++ /dev/null @@ -1,118 +0,0 @@ -import Trackr from 'trackr'; -import Data from '../Data'; - -// A class to keep the state and utility methods needed to manage -// the Meteor data for a component. -class MeteorDataManager { - constructor(component) { - this.component = component; - this.computation = null; - this.oldData = null; - this._meteorDataDep = new Trackr.Dependency(); - this._meteorDataChangedCallback = () => { - this._meteorDataDep.changed(); - }; - - Data.onChange(this._meteorDataChangedCallback); - } - - dispose() { - if (this.computation) { - this.computation.stop(); - this.computation = null; - } - - Data.offChange(this._meteorDataChangedCallback); - } - - calculateData() { - const component = this.component; - - if (!component.getMeteorData) { - return null; - } - - if (this.computation) { - this.computation.stop(); - this.computation = null; - } - - let data; - // Use Tracker.nonreactive in case we are inside a Tracker Computation. - // This can happen if someone calls `ReactDOM.render` inside a Computation. - // In that case, we want to opt out of the normal behavior of nested - // Computations, where if the outer one is invalidated or stopped, - // it stops the inner one. - - this.computation = Trackr.nonreactive(() => { - return Trackr.autorun(c => { - this._meteorDataDep.depend(); - if (c.firstRun) { - const savedSetState = component.setState; - try { - component.setState = () => { - throw new Error( - "Can't call `setState` inside `getMeteorData` as this could cause an endless" + - ' loop. To respond to Meteor data changing, consider making this component' + - ' a "wrapper component" that only fetches data and passes it in as props to' + - ' a child component. Then you can use `componentWillReceiveProps` in that' + - ' child component.' - ); - }; - - data = component.getMeteorData(); - } finally { - component.setState = savedSetState; - } - } else { - // Stop this computation instead of using the re-run. - // We use a brand-new autorun for each call to getMeteorData - // to capture dependencies on any reactive data sources that - // are accessed. The reason we can't use a single autorun - // for the lifetime of the component is that Tracker only - // re-runs autoruns at flush time, while we need to be able to - // re-call getMeteorData synchronously whenever we want, e.g. - // from componentWillUpdate. - c.stop(); - // Calling forceUpdate() triggers componentWillUpdate which - // recalculates getMeteorData() and re-renders the component. - try { - component.forceUpdate(); - } catch (e) { - console.error(e); - } - } - }); - }); - - return data; - } - - updateData(newData) { - const component = this.component; - const oldData = this.oldData; - - if (!(newData && typeof newData === 'object')) { - throw new Error('Expected object returned from getMeteorData'); - } - // update componentData in place based on newData - for (let key in newData) { - component.data[key] = newData[key]; - } - // if there is oldData (which is every time this method is called - // except the first), delete keys in newData that aren't in - // oldData. don't interfere with other keys, in case we are - // co-existing with something else that writes to a component's - // this.data. - if (oldData) { - for (let key in oldData) { - if (!(key in newData)) { - delete component.data[key]; - } - } - } - this.oldData = newData; - } -} - -export default MeteorDataManager; diff --git a/src/components/ReactMeteorData.js b/src/components/ReactMeteorData.js deleted file mode 100644 index cfce2ff..0000000 --- a/src/components/ReactMeteorData.js +++ /dev/null @@ -1,97 +0,0 @@ -import React from 'react'; -import EJSON from 'ejson'; - -import Data from '../Data'; -import MeteorDataManager from './MeteorDataManager'; - -const ReactMeteorData = { - - - UNSAFE_componentWillUpdate(nextProps, nextState) { - if (this.startMeteorSubscriptions) { - if ( - !EJSON.equals(this.state, nextState) || - !EJSON.equals(this.props, nextProps) - ) { - this._meteorSubscriptionsManager._meteorDataChangedCallback(); - } - } - - if (this.getMeteorData) { - const saveProps = this.props; - const saveState = this.state; - let newData; - try { - // Temporarily assign this.state and this.props, - // so that they are seen by getMeteorData! - // This is a simulation of how the proposed Observe API - // for React will work, which calls observe() after - // componentWillUpdate and after props and state are - // updated, but before render() is called. - // See https://github.com/facebook/react/issues/3398. - this.props = nextProps; - this.state = nextState; - newData = this._meteorDataManager.calculateData(); - } finally { - this.props = saveProps; - this.state = saveState; - } - - this._meteorDataManager.updateData(newData); - } - }, - - componentWillUnmount() { - if (this._meteorDataManager) { - this._meteorDataManager.dispose(); - } - - if (this._meteorSubscriptionsManager) { - this._meteorSubscriptionsManager.dispose(); - } - }, -}; - -export { ReactMeteorData }; - -class ReactComponent extends React.Component {} -Object.assign(ReactComponent.prototype, ReactMeteorData); - -class ReactPureComponent extends React.PureComponent {} -Object.assign(ReactPureComponent.prototype, ReactMeteorData); - -export default function connect(options) { - let expandedOptions = options; - if (typeof options === 'function') { - expandedOptions = { - getMeteorData: options, - }; - } - - const { getMeteorData, pure = true } = expandedOptions; - - const BaseComponent = pure ? ReactPureComponent : ReactComponent; - return WrappedComponent => - class ReactMeteorDataComponent extends BaseComponent { - constructor(props) { - super(props); - - Data.waitDdpReady(() => { - if (this.getMeteorData) { - this.data = {}; - this._meteorDataManager = new MeteorDataManager(this); - const newData = this._meteorDataManager.calculateData(); - this._meteorDataManager.updateData(newData); - } - }); - } - - getMeteorData() { - return getMeteorData(this.props); - } - - render() { - return ; - } - }; -} diff --git a/src/components/useTracker.js b/src/components/useTracker.js new file mode 100644 index 0000000..b32a510 --- /dev/null +++ b/src/components/useTracker.js @@ -0,0 +1,30 @@ +import { useEffect, useState } from 'react'; +import Tracker from 'trackr'; +import Data from '../Data'; + +export default (trackerFn, deps = []) => { + const [response, setResponse] = useState(trackerFn()); + const meteorDataDep = new Tracker.Dependency(); + let computation = null; + const dataChangedCallback = () => { + meteorDataDep.changed(); + }; + + const stopComputation = () => { + computation && computation.stop(); + computation = null; + }; + + Data.onChange(dataChangedCallback); + + useEffect(() => { + stopComputation(); + Tracker.autorun(currentComputation => { + meteorDataDep.depend(); + computation = currentComputation; + setResponse(trackerFn()); + }); + return () => { stopComputation(); Data.offChange(dataChangedCallback); }; + }, deps); + return response; +}; diff --git a/src/components/withTracker.js b/src/components/withTracker.js new file mode 100644 index 0000000..749e15b --- /dev/null +++ b/src/components/withTracker.js @@ -0,0 +1,16 @@ +import React, { forwardRef, memo } from 'react'; +import useTracker from './useTracker'; + +export default function withTracker (options) { + return Component => { + const expandedOptions = typeof options === 'function' ? { getMeteorData: options } : options; + const { getMeteorData, pure = true } = expandedOptions; + + const WithTracker = forwardRef((props, ref) => { + const data = useTracker(() => getMeteorData(props) || {}); + return ; + }); + + return pure ? memo(WithTracker) : WithTracker; + }; +} From 137445ac0263221ba266583025eadebacf5df541 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Sun, 9 Aug 2020 14:37:30 -0400 Subject: [PATCH 10/44] Merge changes from master into dev (#32) * Update MFA companion package (#27) * Create manual.yml --- .github/workflows/manual.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/manual.yml diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml new file mode 100644 index 0000000..4cfe17a --- /dev/null +++ b/.github/workflows/manual.yml @@ -0,0 +1,30 @@ +# This is a basic workflow that is manually triggered + +name: Send Review Message + +# Controls when the action will run. Workflow runs when manually triggered using the UI +# or API. +on: + workflow_dispatch: + # Inputs the workflow accepts. + inputs: + name: + # Friendly description to be shown in the UI instead of 'name' + description: 'Release name' + # Default value if no value is explicitly provided + default: '100' + # Input has to be provided for the workflow to run + required: true + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "greet" + reviewMessage: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Runs a single command using the runners shell + - name: Send review message + run: echo "This PR for release ${{ github.event.inputs.name }} needs review from the community. Check out the changelog and provide your feedback!" From 21a7ff48a37032a235ee02092aaf251bca78b0d5 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Thu, 27 Aug 2020 20:38:14 -0400 Subject: [PATCH 11/44] Merge updates from master into dev (#37) * Update MFA companion package (#27) * Create manual.yml * Create stale.yml * Update stale.yml * Update index.js * Add a semicolon * Remove unused assignment to options (#34) * Remove unused assignment to options * Mark SHA256 insufficient as wontfix * Remove unused variable self * Remove unused variable serializedValue * Remove unused state properties loading --- .github/workflows/stale.yml | 19 +++++++++++++++++++ companion-packages/meteorrn-local/index.js | 2 +- companion-packages/meteorrn-ndev-mfa/index.js | 2 +- examples/Login.jsx | 2 +- lib/utils.js | 2 +- src/Collection.js | 2 -- src/ReactiveDict.js | 2 -- 7 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..74262fe --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,19 @@ +name: Mark stale issues and pull requests + +on: + schedule: + - cron: "30 1 * * *" + +jobs: + stale: + + runs-on: ubuntu-latest + + steps: + - uses: actions/stale@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'Closing this issue due to no activity. Feel free to reopen.' + stale-pr-message: 'Closing this PR due to no activity. Feel free to reopen.' + stale-issue-label: 'no-issue-activity' + stale-pr-label: 'no-pr-activity' diff --git a/companion-packages/meteorrn-local/index.js b/companion-packages/meteorrn-local/index.js index 038a691..19c5ac0 100644 --- a/companion-packages/meteorrn-local/index.js +++ b/companion-packages/meteorrn-local/index.js @@ -55,7 +55,7 @@ const Local = { else { await _storeLocalCol(); } - } + }; const loadData = async () => { diff --git a/companion-packages/meteorrn-ndev-mfa/index.js b/companion-packages/meteorrn-ndev-mfa/index.js index 93b70e5..bebbac3 100644 --- a/companion-packages/meteorrn-ndev-mfa/index.js +++ b/companion-packages/meteorrn-ndev-mfa/index.js @@ -1,6 +1,6 @@ import Meteor, { Accounts } from '@meteorrn/core'; -import {authorizeActionChallengeHandler, authorizeActionCompletionHandler, resetPasswordCheckMFARequired, registrationChallengeHandlerTOTP, registrationCompletionHandlerTOTP, resetPasswordChallengeHandler, registrationChallengeHandlerU2F, registerCompletionHandlerU2F, loginChallengeHandler, loginCompletionHandler } from './method-names'; +import { loginChallengeHandler, loginCompletionHandler } from './method-names'; let useU2FAuthorizationCode = function (code) { if(typeof(code) !== "string" || code.length !== 6) { diff --git a/examples/Login.jsx b/examples/Login.jsx index 44734b8..75e8ba2 100644 --- a/examples/Login.jsx +++ b/examples/Login.jsx @@ -4,7 +4,7 @@ import { withTracker, Meteor } from 'meteor-react-native'; class Login extends React.Component { - state = {email:"", password:"", loading:false}; + state = {email:"", password:""}; onLogin = () => { let { email, password } = this.state; diff --git a/lib/utils.js b/lib/utils.js index b31a8a0..b21c97e 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -8,7 +8,7 @@ export function uniqueId() { export function hashPassword(password) { return { - digest: SHA256(password).toString(), + digest: SHA256(password).toString(), // lgtm [js/insufficient-password-hash] algorithm: 'sha-256', }; } diff --git a/src/Collection.js b/src/Collection.js index f624e6f..f390644 100644 --- a/src/Collection.js +++ b/src/Collection.js @@ -154,7 +154,6 @@ export class Collection { update(id, modifier, options = {}, callback = () => {}) { if (typeof options == 'function') { callback = options; - options = {}; } if (!this._collection.get(id)) @@ -202,7 +201,6 @@ export class Collection { } helpers(helpers) { - var self = this; let _transform; if (this._transform && !this._helpers) _transform = this._transform; diff --git a/src/ReactiveDict.js b/src/ReactiveDict.js index e6f877e..6b0bc61 100644 --- a/src/ReactiveDict.js +++ b/src/ReactiveDict.js @@ -74,8 +74,6 @@ export default class ReactiveDict { ) throw new Error('ReactiveDict.equals: value must be scalar'); - const serializedValue = stringify(value); - let oldValue = undefined; if (Object.keys(this.keys).indexOf(key) != -1) { oldValue = parse(this.keys[key]); From ad4c7943f353ca384385b278530b19ee32b26b23 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 31 Aug 2020 13:42:42 -0400 Subject: [PATCH 12/44] Bump package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index db41c3b..54887ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0-beta1", + "version": "2.1.0-beta2", "description": "Full Meteor Client for React Native", "main": "src/Meteor.js", "repository": { From d15d39e2bffa4f76cbffe23dd2a0d8d82e0d4fa4 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 16 Sep 2020 15:02:51 -0400 Subject: [PATCH 13/44] Deprecate `Meteor.collection` (lowercase-C) --- src/Meteor.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Meteor.js b/src/Meteor.js index 566c3c0..fb7234e 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -38,9 +38,8 @@ module.exports = { EJSON, ReactiveDict, Collection, - collection(name, options) { - console.error("Meteor.collection is deprecated. Use Mongo.Collection"); - return new Collection(name, options); + collection() { + throw new Error("Meteor.collection is deprecated. Use Mongo.Collection"); }, withTracker, useTracker, From 1556a2ed3788cdba7437d824b32f0fd785be379e Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 16 Sep 2020 15:11:16 -0400 Subject: [PATCH 14/44] Update Mongo Docs --- docs/api.md | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/docs/api.md b/docs/api.md index aff646d..67f3efc 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,3 +1,4 @@ + ## Meteor `import Meteor from '@meteorrn/core';` @@ -72,16 +73,27 @@ https://atmospherejs.com/meteor/reactive-dict ## Mongo `import { Mongo } from '@meteorrn/core';` -#### `Mongo.Collection(collectionName, options)` -*collectionName*: Name of the remote collection, or pass `null` for a client-side collection +#### `new Mongo.Collection(collectionName, options) => Collection` +Creates a *Collection* -**options**: - * [.insert(doc, callback)](http://docs.meteor.com/#/full/insert) - * [.update(id, modifier, [options], [callback])](http://docs.meteor.com/#/full/update) - * [.remove(id, callback(err, countRemoved))](http://docs.meteor.com/#/full/remove) +**Arguments** + * collectionName - Name of the remote collection, or pass `null` for a client-side collection + +### *Collection* + +***Collection* Methods:** + * .insert(document) + * .update(query, modifications) + * .remove(query) + * .find(query) => *Cursor* + * .findOne(query) => Document -#### *Cursor*.observe -Mirrors Meteor's observe behavior. Accepts object with the properties `added`, `changed`, and `removed`. + +### *Cursor* + +***Cursor* Methods:** + * .obsrve() - Mirrors Meteor's observe behavior. Accepts object with the properties `added`, `changed`, and `removed`. + * .fetch() => `[Document]` - Retrieves an array of matching documents ## Accounts @@ -102,4 +114,4 @@ Enables verbose mode which logs detailed information about accounts. **Note:** t ```` enableVerbose() -```` \ No newline at end of file +```` From 87f7469b1e3a20095b3dc18d53475f9c84d5d028 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 16 Sep 2020 15:13:06 -0400 Subject: [PATCH 15/44] Update api.md --- docs/api.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/api.md b/docs/api.md index 67f3efc..1105e94 100644 --- a/docs/api.md +++ b/docs/api.md @@ -74,22 +74,22 @@ https://atmospherejs.com/meteor/reactive-dict `import { Mongo } from '@meteorrn/core';` #### `new Mongo.Collection(collectionName, options) => Collection` -Creates a *Collection* +Creates and returns a *Collection* **Arguments** * collectionName - Name of the remote collection, or pass `null` for a client-side collection -### *Collection* +#### *`Collection`* ***Collection* Methods:** - * .insert(document) - * .update(query, modifications) - * .remove(query) - * .find(query) => *Cursor* - * .findOne(query) => Document + * .insert(document) - Inserts document into collection + * .update(query, modifications) - Updates document in collection + * .remove(query) - Removes document from collection + * .find(query) => *Cursor* - Returns a Cursor + * .findOne(query) => Document - Retrieves first matching Document -### *Cursor* +#### *`Cursor`* ***Cursor* Methods:** * .obsrve() - Mirrors Meteor's observe behavior. Accepts object with the properties `added`, `changed`, and `removed`. From 9c142949d079c2fe76240479067d88db6dec493e Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 16 Sep 2020 15:17:42 -0400 Subject: [PATCH 16/44] Update Accounts Docs --- docs/api.md | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/docs/api.md b/docs/api.md index 1105e94..00ab818 100644 --- a/docs/api.md +++ b/docs/api.md @@ -73,7 +73,7 @@ https://atmospherejs.com/meteor/reactive-dict ## Mongo `import { Mongo } from '@meteorrn/core';` -#### `new Mongo.Collection(collectionName, options) => Collection` +#### `new Mongo.Collection(collectionName, options)` => `Collection` Creates and returns a *Collection* **Arguments** @@ -85,7 +85,7 @@ Creates and returns a *Collection* * .insert(document) - Inserts document into collection * .update(query, modifications) - Updates document in collection * .remove(query) - Removes document from collection - * .find(query) => *Cursor* - Returns a Cursor + * .find(query) => *`Cursor`* - Returns a Cursor * .findOne(query) => Document - Retrieves first matching Document @@ -99,13 +99,41 @@ Creates and returns a *Collection* ## Accounts `import { Accounts } from '@meteorrn/core';` -* [Accounts.createUser](http://docs.meteor.com/#/full/accounts_createuser) -* [Accounts.changePassword](http://docs.meteor.com/#/full/accounts_forgotpassword) +#### `Accounts.createUser(user, callback)` +Creates a user + +**Arguments** + * user - The user object + * callback - Called with a single error object or null on success + +#### `Accounts.changePassword(oldPassword, newPassword)` +Changes a user's password + +**Arguments** + * oldPassword - The user's current password + * newPassword - The user's new password + +#### `Accounts.onLogin(callback)` +Registers a callback to be called when user is logged in + +**Arguments** + * callback + +#### `Accounts.onLoginFailure(callback)` +Registers a callback to be called when login fails + +**Arguments** + * callback + +#### `Accounts._hashPassword(plaintext)` => `{algorithm:"sha-256", digest:"..."}` +Hashes a password using the sha-256 algorithm. Returns an object formatted for use in accounts calls. You can access the raw hashed string using the digest property. + +**Arguments** + * plaintext - The plaintext string you want to hash + + * [Accounts.forgotPassword](http://docs.meteor.com/#/full/accounts_changepassword) * [Accounts.resetPassword](http://docs.meteor.com/#/full/accounts_resetpassword) -* [Accounts.onLogin](http://docs.meteor.com/#/full/accounts_onlogin) -* [Accounts.onLoginFailure](http://docs.meteor.com/#/full/accounts_onloginfailure) -* `Accounts._hashPassword` - SHA-256 hashes password, for use with methods that may require authentication ## enableVerbose `import { enableVerbose } from '@meteorrn/core';` From 78af2c631a321c62cd6ba2b5734c079bf05ca0e9 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 16 Sep 2020 15:25:03 -0400 Subject: [PATCH 17/44] Update Tracker and Verbosity Docs --- docs/api.md | 68 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/docs/api.md b/docs/api.md index 00ab818..f219de2 100644 --- a/docs/api.md +++ b/docs/api.md @@ -47,27 +47,41 @@ Returns true if attempting to login ### `Meteor.logoutOtherClients` -## withTracker -`import { withTracker } from '@meteorrn/core'`; - -The `withTracker` component is used the same way as [`meteor/react-meteor-data`](https://guide.meteor.com/react.html#using-withTracker) - -```javascript -export default withTracker(() => { - let handle = Meteor.subscribe("mySubscription"); - let loading = !handle.ready(); - let myStuff = Stuff.find({}).fetch(); - - return { - myStuff - }; -})(MyComponent); -``` + + +## Tracker +`import { withTracker, useTracker } from '@meteorrn/core'`; + + +#### `withTracker(trackerFunc)(Component)` +Creates a new Tracker + +**Arguments:** + * trackerFunc - Function which will be re-run reactively when it's dependencies are updated. Must return an object that is passed as properties to `Component` + * Component - React Component which will receive properties from trackerFunc + + +#### `useTracker(trackerFunc)` => `React Hook` +Creates a new Tracker React Hook. Can only be used inside a function component. See React Docs for more info. + +**Arguments:** + * trackerFunc - Function which will be re-run reactively when it's dependencies are updated. + + ## ReactiveDict `import { ReactiveDict } from '@meteorrn/core'` -https://atmospherejs.com/meteor/reactive-dict +#### `new ReactiveDict()` => *`ReactiveDict`* +Creates a new reactive dictionary + + +#### *`ReactiveDict`* + +***ReactiveDict* Methods:** + * .get(key) - Gets value of key (Reactive) + * .set(key, value) - Sets value of key + ## Mongo @@ -79,6 +93,7 @@ Creates and returns a *Collection* **Arguments** * collectionName - Name of the remote collection, or pass `null` for a client-side collection + #### *`Collection`* ***Collection* Methods:** @@ -96,9 +111,11 @@ Creates and returns a *Collection* * .fetch() => `[Document]` - Retrieves an array of matching documents + ## Accounts `import { Accounts } from '@meteorrn/core';` + #### `Accounts.createUser(user, callback)` Creates a user @@ -106,6 +123,7 @@ Creates a user * user - The user object * callback - Called with a single error object or null on success + #### `Accounts.changePassword(oldPassword, newPassword)` Changes a user's password @@ -113,33 +131,39 @@ Changes a user's password * oldPassword - The user's current password * newPassword - The user's new password + #### `Accounts.onLogin(callback)` Registers a callback to be called when user is logged in **Arguments** * callback + #### `Accounts.onLoginFailure(callback)` Registers a callback to be called when login fails **Arguments** * callback + #### `Accounts._hashPassword(plaintext)` => `{algorithm:"sha-256", digest:"..."}` Hashes a password using the sha-256 algorithm. Returns an object formatted for use in accounts calls. You can access the raw hashed string using the digest property. **Arguments** * plaintext - The plaintext string you want to hash +Other: * [Accounts.forgotPassword](http://docs.meteor.com/#/full/accounts_changepassword) * [Accounts.resetPassword](http://docs.meteor.com/#/full/accounts_resetpassword) -## enableVerbose + + +## Verbosity `import { enableVerbose } from '@meteorrn/core';` -Enables verbose mode which logs detailed information about accounts. **Note:** this will expose login tokens and other private information to the console. +Verbose Mode logs detailed information from various places around MeteorRN. **Note:** this will expose login tokens and other private information to the console. + -```` -enableVerbose() -```` +#### `enableVerbose()` +Enables verbose mode From 826b1392dfd7bed7f1bf65f45ccd457bd1e9d203 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 16 Sep 2020 15:27:00 -0400 Subject: [PATCH 18/44] Start adding table of contents --- docs/api.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/api.md b/docs/api.md index f219de2..4b345c2 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,7 +1,13 @@ +# Meteor React Native Docs -## Meteor +Table of Contents +- [Meteor](#meteor) +- [Tracker](#tracker) + +

Meteor

`import Meteor from '@meteorrn/core';` + ### `Meteor.connect(url, options)` Connect to the Meteor Server @@ -49,7 +55,7 @@ Returns true if attempting to login -## Tracker +

Tracker

`import { withTracker, useTracker } from '@meteorrn/core'`; From 3bab57379bc8ea6756c81a6dc2347f7e80aec88e Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 04:46:54 +0000 Subject: [PATCH 19/44] Refactor to remove require cycle --- package.json | 2 +- src/Meteor.js | 6 ++---- src/index.js | 4 ++++ src/user/User.js | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 src/index.js diff --git a/package.json b/package.json index 54887ac..7f8fbf3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@meteorrn/core", "version": "2.1.0-beta2", "description": "Full Meteor Client for React Native", - "main": "src/Meteor.js", + "main": "src/index.js", "repository": { "type": "git", "url": "git+https://github.com/TheRealNate/meteor-react-native.git" diff --git a/src/Meteor.js b/src/Meteor.js index fb7234e..0421516 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -21,12 +21,11 @@ import useTracker from './components/useTracker'; import ReactiveDict from './ReactiveDict'; -import User from './user/User'; import Accounts from './user/Accounts'; let isVerbose = false; -module.exports = { +const Meteor = { isVerbose, enableVerbose() { isVerbose = true; @@ -46,7 +45,6 @@ module.exports = { getData() { return Data; }, - ...User, status() { return { connected: Data.ddp ? Data.ddp.status == 'connected' : false, @@ -351,4 +349,4 @@ module.exports = { }, }; -export default module.exports; +export default Meteor; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..cc27d3d --- /dev/null +++ b/src/index.js @@ -0,0 +1,4 @@ +import Meteor from './Meteor.js'; +import './user/User.js'; + +export default Meteor; \ No newline at end of file diff --git a/src/user/User.js b/src/user/User.js index b2da824..3ed3ebc 100644 --- a/src/user/User.js +++ b/src/user/User.js @@ -130,4 +130,4 @@ const User = { }, }; -export default User; +Object.assign(Meteor, User); \ No newline at end of file From 8852e46e6132f1581d20da321596b4a1202b0ffe Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 04:47:05 +0000 Subject: [PATCH 20/44] 2.1.0-beta3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f8fbf3..ccd90f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0-beta2", + "version": "2.1.0-beta3", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From e914293f15a57d359cb6624143d077a76bb49c57 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 04:50:55 +0000 Subject: [PATCH 21/44] 2.1.0-beta4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ccd90f2..fb6510a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0-beta3", + "version": "2.1.0-beta4", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From 6c2e2fe033c5bbdb92b52c010726b35ccf6c8896 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 04:54:28 +0000 Subject: [PATCH 22/44] local: Automaticallly commit changes to storage after .insert, .update, or .remove --- companion-packages/meteorrn-local/README.md | 3 +-- companion-packages/meteorrn-local/index.js | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/companion-packages/meteorrn-local/README.md b/companion-packages/meteorrn-local/README.md index 29c81f8..b5842f8 100644 --- a/companion-packages/meteorrn-local/README.md +++ b/companion-packages/meteorrn-local/README.md @@ -6,8 +6,7 @@ This package introduces the `Local.Collection`, which will mirror the specified ### Caveats - This package (currently) works by creating a second local Mongo Collection. This means you are esentially keeping two copies of each document (that you store locally) in memory. This issue can be mitigated by keeping an "age" or "version" on all your documents, and only publishing documents that have been changed from local -- This package (currently) does not support the removal of documents. Once a document has been inserted into the local database, it is there forever (unless you manually call `remove` on the Local.Collection) -- Performing `.insert`, `.update`, `.remove`, etc on a Local.Collection only makes those modifications to the in-memory minimongo. Those changes won't be sent to the server, and those changes (currently) dont trigger the saving procedure, so they will not be committed to the disk (unless a remote change is made afterwards) +- This package (currently) does not support the automatic removal/expiry of documents. Once a document has been inserted into the local database, it is there forever (unless you manually call `remove` on the Local.Collection) ### Usage: diff --git a/companion-packages/meteorrn-local/index.js b/companion-packages/meteorrn-local/index.js index 19c5ac0..cf7c572 100644 --- a/companion-packages/meteorrn-local/index.js +++ b/companion-packages/meteorrn-local/index.js @@ -93,6 +93,24 @@ const Local = { }); }; + + LocalCol.insert = LocalCol.__insert; + LocalCol.update = LocalCol.__update; + LocalCol.remove = LocalCol.__remove; + + LocalCol.insert = (...args) => { + LocalCol.__insert(...args); + storeLocalCol(); + }; + LocalCol.update = (...args) => { + LocalCol.__update(...args); + storeLocalCol(); + }; + LocalCol.remove = (...args) => { + LocalCol.__remove(...args); + storeLocalCol(); + }; + LocalCol.loadPromise = loadData(); LocalCol.save = storeLocalCol; From 3039ba1763ce2ea9771cae4e0a87b3c8f145f92e Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Fri, 11 Dec 2020 00:03:50 -0500 Subject: [PATCH 23/44] Update User.js --- src/user/User.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/user/User.js b/src/user/User.js index 3ed3ebc..0270573 100644 --- a/src/user/User.js +++ b/src/user/User.js @@ -130,4 +130,5 @@ const User = { }, }; -Object.assign(Meteor, User); \ No newline at end of file +export default User; +Object.assign(Meteor, User); From cfd8f8e1e194d11bd0be993e6fb55fac96b5d4a6 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 05:07:32 +0000 Subject: [PATCH 24/44] 2.1.0-beta5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f870c76..5aa9a9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0-beta4", + "version": "2.1.0-beta5", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From 78e4db3ff2ff506a40c1b32820595eb536334844 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 20:16:06 +0000 Subject: [PATCH 25/44] Refactor code to remove require cycles --- src/Meteor.js | 23 ++++++++++++----------- src/components/withTracker.js | 2 +- src/index.js | 10 +++++++++- src/user/User.js | 1 - 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Meteor.js b/src/Meteor.js index 1c77c96..b933083 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -1,5 +1,3 @@ -import NetInfo from "@react-native-community/netinfo"; - import { name as packageName } from '../package.json'; if(packageName !== "@meteorrn/core") { @@ -21,8 +19,6 @@ import useTracker from './components/useTracker'; import ReactiveDict from './ReactiveDict'; -import Accounts from './user/Accounts'; - let isVerbose = false; const Meteor = { @@ -31,7 +27,6 @@ const Meteor = { isVerbose = true; }, Random, - Accounts, Mongo, Tracker: Trackr, EJSON, @@ -102,12 +97,18 @@ const Meteor = { SocketConstructor: WebSocket, ...options, }); - - NetInfo.addEventListener(({type, isConnected, isInternetReachable, isWifiEnabled}) => { - if (isConnected && Data.ddp.autoReconnect) { - Data.ddp.connect(); - } - }); + + try { + const NetInfo = require("@react-native-community/netinfo").default; + NetInfo.addEventListener(({type, isConnected, isInternetReachable, isWifiEnabled}) => { + if (isConnected && Data.ddp.autoReconnect) { + Data.ddp.connect(); + } + }); + } + catch(e) { + console.warn("Warning: NetInfo not installed, so DDP will not automatically reconnect"); + } Data.ddp.on('connected', () => { // Clear the collections of any stale data in case this is a reconnect diff --git a/src/components/withTracker.js b/src/components/withTracker.js index 749e15b..cede3e0 100644 --- a/src/components/withTracker.js +++ b/src/components/withTracker.js @@ -8,7 +8,7 @@ export default function withTracker (options) { const WithTracker = forwardRef((props, ref) => { const data = useTracker(() => getMeteorData(props) || {}); - return ; + return React.createElement(Component, {ref, ...props, ...data}); }); return pure ? memo(WithTracker) : WithTracker; diff --git a/src/index.js b/src/index.js index cc27d3d..7b5303f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,12 @@ import Meteor from './Meteor.js'; -import './user/User.js'; +import User from './user/User.js'; +import Accounts from './user/Accounts.js'; +Object.assign(Meteor, User); + +const { + withTracker, Mongo, packageInterface, ReactiveDict +} = Meteor; + +export { Accounts, withTracker, Mongo, packageInterface, ReactiveDict }; export default Meteor; \ No newline at end of file diff --git a/src/user/User.js b/src/user/User.js index 0270573..b2da824 100644 --- a/src/user/User.js +++ b/src/user/User.js @@ -131,4 +131,3 @@ const User = { }; export default User; -Object.assign(Meteor, User); From 65cda3e80b0a99b94b6b32ae773cb5772de5cc90 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 11 Dec 2020 20:16:52 +0000 Subject: [PATCH 26/44] Bump Package Version to 2.1.0-rc1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5aa9a9d..9fea6af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0-beta5", + "version": "2.1.0-rc1", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From 4310f0e58dce92b09743e8e54bf6515354789a2d Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Fri, 11 Dec 2020 15:27:30 -0500 Subject: [PATCH 27/44] Delete shiftleft-analysis.yml --- .github/workflows/shiftleft-analysis.yml | 36 ------------------------ 1 file changed, 36 deletions(-) delete mode 100644 .github/workflows/shiftleft-analysis.yml diff --git a/.github/workflows/shiftleft-analysis.yml b/.github/workflows/shiftleft-analysis.yml deleted file mode 100644 index 831315f..0000000 --- a/.github/workflows/shiftleft-analysis.yml +++ /dev/null @@ -1,36 +0,0 @@ -# This workflow integrates ShiftLeft Scan with GitHub's code scanning feature -# ShiftLeft Scan is a free open-source security tool for modern DevOps teams -# Visit https://slscan.io/en/latest/integrations/code-scan for help -name: ShiftLeft Scan - -# This section configures the trigger for the workflow. Feel free to customize depending on your convention -on: push - -jobs: - Scan-Build: - # Scan runs on ubuntu, mac and windows - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - # Instructions - # 1. Setup JDK, Node.js, Python etc depending on your project type - # 2. Compile or build the project before invoking scan - # Example: mvn compile, or npm install or pip install goes here - # 3. Invoke ShiftLeft Scan with the github token. Leave the workspace empty to use relative url - - - name: Perform ShiftLeft Scan - uses: ShiftLeftSecurity/scan-action@master - env: - WORKSPACE: "" - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SCAN_AUTO_BUILD: true - with: - output: reports - # Scan auto-detects the languages in your project. To override uncomment the below variable and set the type - # type: credscan,java - # type: python - - - name: Upload report - uses: github/codeql-action/upload-sarif@v1 - with: - sarif_file: reports From 1e420492462370fceee4c8cbe05196f4dbfa116e Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Thu, 17 Dec 2020 20:34:07 -0500 Subject: [PATCH 28/44] Update package version for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9fea6af..1f6414e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0-rc1", + "version": "2.1.0", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From bd962b087c5fd4c937712e9ad63db457139e48be Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Tue, 22 Dec 2020 16:15:46 -0500 Subject: [PATCH 29/44] Draft: Update Data.js to remove dependency on react-native --- src/Data.js | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/Data.js b/src/Data.js index e05d4de..3071f3d 100644 --- a/src/Data.js +++ b/src/Data.js @@ -1,15 +1,37 @@ -import ReactNative from 'react-native/Libraries/Renderer/shims/ReactNative'; import minimongo from 'minimongo-cache'; import Trackr from 'trackr'; -import { InteractionManager } from 'react-native'; -process.nextTick = setImmediate; + +const moduleExists = m => { + try { + require.resolve(m); + } + catch(e) { + return false; + } + return true; +} + +let afterInteractions; +if(moduleExists("react-native")) { + db.batchedUpdates = require('react-native/Libraries/Renderer/shims/ReactNative').unstable_batchedUpdates; + process.nextTick = setImmediate; + afterInteractions = require('react-native').InteractionManager.runAfterInteractions; +} +else { + afterInteractions = requestIdleCallback; + try { + db.batchedUpdates = require('react-dom').unstable_batchedUpdates; + } + catch(e) { + console.warn("react-dom isn't installed, so minimongo-cache performance may be reduced"); + } +} const db = new minimongo(); db.debug = false; -db.batchedUpdates = ReactNative.unstable_batchedUpdates; function runAfterOtherComputations(fn) { - InteractionManager.runAfterInteractions(() => { + afterInteractions(() => { Trackr.afterFlush(() => { fn(); }); From 3c7f718f74825707e073ffbf30cf15f298c9d336 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 22 Dec 2020 21:34:12 +0000 Subject: [PATCH 30/44] 2.1.1-beta1 --- companion-packages/meteorrn-local/index.js | 6 +- .../meteorrn-local/package.json | 2 +- package-lock.json | 3637 +++++++++++++++++ package.json | 2 +- src/Data.js | 2 +- 5 files changed, 3643 insertions(+), 6 deletions(-) create mode 100644 package-lock.json diff --git a/companion-packages/meteorrn-local/index.js b/companion-packages/meteorrn-local/index.js index cf7c572..b6c6c0a 100644 --- a/companion-packages/meteorrn-local/index.js +++ b/companion-packages/meteorrn-local/index.js @@ -94,9 +94,9 @@ const Local = { }; - LocalCol.insert = LocalCol.__insert; - LocalCol.update = LocalCol.__update; - LocalCol.remove = LocalCol.__remove; + LocalCol.__insert = LocalCol.insert; + LocalCol.__update = LocalCol.update; + LocalCol.__remove = LocalCol.remove; LocalCol.insert = (...args) => { LocalCol.__insert(...args); diff --git a/companion-packages/meteorrn-local/package.json b/companion-packages/meteorrn-local/package.json index 05088f5..8318367 100644 --- a/companion-packages/meteorrn-local/package.json +++ b/companion-packages/meteorrn-local/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/local", - "version": "1.0.1", + "version": "1.0.2", "description": "Store data locally", "main": "index.js", "scripts": { diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..81cdf7e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3637 @@ +{ + "name": "@meteorrn/core", + "version": "2.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@react-native-async-storage/async-storage": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.13.2.tgz", + "integrity": "sha512-isTDvUApRJPVWFxV15yrQSOGqarX7cIedq/y4N5yWSnotf68D9qvDEv1I7rCXhkBDi0u4OJt6GA9dksUT0D3wg==", + "optional": true, + "requires": { + "deep-assign": "^3.0.0" + } + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", + "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-react-transform": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz", + "integrity": "sha512-4vJGddwPiHAOgshzZdGwYy4zRjjIr5SMY7gkOaCyIASjgpcsyLTlZNuB5rHOFoaTvGlhfo8/g4pobXPyHqm/3w==", + "dev": true, + "requires": { + "lodash": "^4.6.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-assign": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz", + "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-react-native": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-native/-/babel-preset-react-native-4.0.1.tgz", + "integrity": "sha512-uhFXnl1WbEWNG4W8QB/jeQaVXkd0a0AD+wh4D2VqtdRnEyvscahqyHExnwKLU9N0sXRYwDyed4JfbiBtiOSGgA==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.5.0", + "babel-plugin-react-transform": "^3.0.0", + "babel-plugin-syntax-async-functions": "^6.5.0", + "babel-plugin-syntax-class-properties": "^6.5.0", + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-syntax-flow": "^6.5.0", + "babel-plugin-syntax-jsx": "^6.5.0", + "babel-plugin-syntax-trailing-function-commas": "^6.5.0", + "babel-plugin-transform-class-properties": "^6.5.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.5.0", + "babel-plugin-transform-es2015-block-scoping": "^6.5.0", + "babel-plugin-transform-es2015-classes": "^6.5.0", + "babel-plugin-transform-es2015-computed-properties": "^6.5.0", + "babel-plugin-transform-es2015-destructuring": "^6.5.0", + "babel-plugin-transform-es2015-for-of": "^6.5.0", + "babel-plugin-transform-es2015-function-name": "^6.5.0", + "babel-plugin-transform-es2015-literals": "^6.5.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.5.0", + "babel-plugin-transform-es2015-parameters": "^6.5.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.5.0", + "babel-plugin-transform-es2015-spread": "^6.5.0", + "babel-plugin-transform-es2015-template-literals": "^6.5.0", + "babel-plugin-transform-exponentiation-operator": "^6.5.0", + "babel-plugin-transform-flow-strip-types": "^6.5.0", + "babel-plugin-transform-object-assign": "^6.5.0", + "babel-plugin-transform-object-rest-spread": "^6.5.0", + "babel-plugin-transform-react-display-name": "^6.5.0", + "babel-plugin-transform-react-jsx": "^6.5.0", + "babel-plugin-transform-react-jsx-source": "^6.5.0", + "babel-plugin-transform-regenerator": "^6.5.0", + "babel-template": "^6.24.1", + "react-transform-hmr": "^1.0.4" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base-64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-js": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-3.0.0.tgz", + "integrity": "sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw==", + "optional": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "ejson": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ejson/-/ejson-2.2.0.tgz", + "integrity": "sha512-kWa0AKAxDhmr4t6c4pgQqk6yL52/M67xOMh60HRnAeydzo5QIxOitN5bE1+e0rbdnxfly7FTB9e2Ny0ypLMbag==" + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.4.tgz", + "integrity": "sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "lint-staged": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.3.0.tgz", + "integrity": "sha512-AXk40M9DAiPi7f4tdJggwuKIViUplYtVj1os1MVEteW7qOkU50EOehayCfO9TsoGK24o/EsWb41yrEgfJDDjCw==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "commander": "^2.14.1", + "cosmiconfig": "^5.0.2", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "execa": "^0.9.0", + "find-parent-dir": "^0.3.0", + "is-glob": "^4.0.0", + "is-windows": "^1.0.2", + "jest-validate": "^23.5.0", + "listr": "^0.14.1", + "lodash": "^4.17.5", + "log-symbols": "^2.2.0", + "micromatch": "^3.1.8", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "please-upgrade-node": "^3.0.2", + "staged-git-files": "1.1.1", + "string-argv": "^0.0.2", + "stringify-object": "^3.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + } + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimongo-cache": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/minimongo-cache/-/minimongo-cache-0.0.48.tgz", + "integrity": "sha1-pvu3i2YnVUJJr+78EkPPfLpr6gc=", + "requires": { + "eventemitter3": "^1.1.0", + "invariant": "^2.1.1", + "lodash": "~2.4.1" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, + "mock-socket": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-2.0.0.tgz", + "integrity": "sha1-0vlB64AQwr6ql5g+SCf7xiERq8s=", + "dev": true, + "requires": { + "urijs": "~1.17.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "node-require-fallback": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-require-fallback/-/node-require-fallback-1.0.0.tgz", + "integrity": "sha1-D5E4S2XJXrFwfSkoIOpbdjKojGo=" + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "^1.2.10" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prettier": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", + "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "raf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.1.0.tgz", + "integrity": "sha1-XYS/gbV/l5+MSSvgg3jFOLtO7Pw=", + "requires": { + "performance-now": "~0.2.0" + } + }, + "react-deep-force-update": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz", + "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA==", + "dev": true + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-proxy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", + "integrity": "sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo=", + "dev": true, + "requires": { + "lodash": "^4.6.1", + "react-deep-force-update": "^1.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + } + } + }, + "react-transform-hmr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz", + "integrity": "sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s=", + "dev": true, + "requires": { + "global": "^4.3.0", + "react-proxy": "^1.1.7" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "staged-git-files": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.1.tgz", + "integrity": "sha512-H89UNKr1rQJvI1c/PIR3kiAMBV23yvR7LItZiV74HWZwzt7f3YHuujJ9nJZlt58WlFox7XQsOahexwk7nTe69A==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string-argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", + "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trackr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trackr/-/trackr-2.0.2.tgz", + "integrity": "sha1-7jixO1gLMN9ejgJw0c89AhLEdF4=", + "requires": { + "raf": "~3.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "underscore": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.0.tgz", + "integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urijs": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.17.1.tgz", + "integrity": "sha1-Cii/LgDfwk7rCXT+uCaKI4x7rC0=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "wolfy87-eventemitter": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-4.3.0.tgz", + "integrity": "sha1-ZJc5bJXnQ1nwa241QJM5MY2Nlk8=" + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 1f6414e..2d21438 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.0", + "version": "2.1.1", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { diff --git a/src/Data.js b/src/Data.js index 3071f3d..090b726 100644 --- a/src/Data.js +++ b/src/Data.js @@ -9,7 +9,7 @@ const moduleExists = m => { return false; } return true; -} +}; let afterInteractions; if(moduleExists("react-native")) { From 44425b662b3ff3f5bac5f522ad8aef1dd60652a9 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Tue, 22 Dec 2020 21:35:22 +0000 Subject: [PATCH 31/44] Bump Package Version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d21438..66c9743 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.1", + "version": "2.1.1-beta1", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From b70c753071d898a09a3b52bf5db86ecf60d11e7b Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Tue, 22 Dec 2020 16:49:32 -0500 Subject: [PATCH 32/44] Update docs to note compatibility with react-dom --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 85a9288..24f737d 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,20 @@ For React Native <0.60.0 use [react-native-meteor](https://github.com/inProgress - Mixins (`connectMeteor`) have been removed - `composeWithTracker` has been removed +# Using on Web +While this package was designed with React Native in mind, it is also capable of running on web (using `react-dom`). This can be useful if you need a light-weight Meteor implementation, if you want to create a client app separate from your server codebase, etc. The only change required is providing an AsyncStorage implementation. Here is a simple example: + +```` +const AsyncStorage = { + setItem:async (key, value) => window.localStorage.setItem(key, value), + getItem:async (key) => window.localStorage.getItem(key) + removeItem:async (key) => window.localStorage.removeItem(key) +} + +Meteor.connect("wss://.../websock", {AsyncStorage}); + +```` + # Changelog The [GitHub Releases Tab](https://github.com/TheRealNate/meteor-react-native/releases) includes a full changelog From f3a99f7e0de7de4ac49cf5c615f787d6819f43af Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 11 Jan 2021 15:32:15 -0500 Subject: [PATCH 33/44] Close #52 --- src/user/Accounts.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/user/Accounts.js b/src/user/Accounts.js index e6d4f81..75288df 100644 --- a/src/user/Accounts.js +++ b/src/user/Accounts.js @@ -65,6 +65,9 @@ class AccountsPassword { }; onLogin = (cb) => { + if(Data._tokenIdSaved) { // Execute callback immediately if already logged in + return cb(); + } Data.on('onLogin', cb); }; From 512c96f54e981578f433c197f7bae031fb6cf19a Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 11 Jan 2021 17:35:33 -0500 Subject: [PATCH 34/44] Update Data.js --- src/Data.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Data.js b/src/Data.js index 090b726..1927e0e 100644 --- a/src/Data.js +++ b/src/Data.js @@ -1,6 +1,9 @@ import minimongo from 'minimongo-cache'; import Trackr from 'trackr'; +const db = new minimongo(); +db.debug = false; + const moduleExists = m => { try { require.resolve(m); @@ -27,9 +30,6 @@ else { } } -const db = new minimongo(); -db.debug = false; - function runAfterOtherComputations(fn) { afterInteractions(() => { Trackr.afterFlush(() => { From e4a555b147d48068a2f23d63f12b343d3935b1d0 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 11 Jan 2021 17:37:00 -0500 Subject: [PATCH 35/44] Remove unused variable --- src/Meteor.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Meteor.js b/src/Meteor.js index 5c9f636..f52f741 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -1,5 +1,3 @@ -import { name as packageName } from '../package.json'; - import Trackr from 'trackr'; import EJSON from 'ejson'; import DDP from '../lib/ddp.js'; From c3c6e40ad095f2314916ac249c04d9ed9c376b1a Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 11 Jan 2021 17:42:24 -0500 Subject: [PATCH 36/44] Bring dev up-to-date with master changes (#53) * Update Login example to bring up to date with latest version * Update api.md --- docs/api.md | 11 +++++++++-- examples/Login.jsx | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/api.md b/docs/api.md index 3af63e0..3cc69ca 100644 --- a/docs/api.md +++ b/docs/api.md @@ -3,8 +3,11 @@ Table of Contents - [Meteor](#meteor) - [Tracker](#tracker) +- [Mongo](#mongo) +- [Accounts](#accounts)

Meteor

+ `import Meteor from '@meteorrn/core';` @@ -56,6 +59,7 @@ Returns true if attempting to login

Tracker

+ `import { withTracker, useTracker } from '@meteorrn/core'`; @@ -76,6 +80,7 @@ Creates a new Tracker React Hook. Can only be used inside a function component. ## ReactiveDict + `import { ReactiveDict } from '@meteorrn/core'` #### `new ReactiveDict()` => *`ReactiveDict`* @@ -90,7 +95,8 @@ Creates a new reactive dictionary -## Mongo +

Mongo

+ `import { Mongo } from '@meteorrn/core';` #### `new Mongo.Collection(collectionName, options)` => `Collection` @@ -118,7 +124,8 @@ Creates and returns a *Collection* -## Accounts +

Accounts

+ `import { Accounts } from '@meteorrn/core';` diff --git a/examples/Login.jsx b/examples/Login.jsx index 75e8ba2..984c8d7 100644 --- a/examples/Login.jsx +++ b/examples/Login.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { View, TextInput, Button, Alert } from 'react-native'; -import { withTracker, Meteor } from 'meteor-react-native'; +import Meteor, { withTracker } from '@meteorrn/core'; class Login extends React.Component { From a9e226f604b89023c23ae44a64e4f85e48653013 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 13 Jan 2021 16:28:37 -0500 Subject: [PATCH 37/44] Update package version due to breaking changes --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2d21438..b54f937 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.1", + "version": "2.2.0", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From b260536e01b54ecf022d8fe9a8f8faed5c168c49 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 13 Jan 2021 21:28:06 -0500 Subject: [PATCH 38/44] Removing capability for running on web due to it requiring Metro >=0.59.0 --- src/Data.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Data.js b/src/Data.js index 1927e0e..36f6b18 100644 --- a/src/Data.js +++ b/src/Data.js @@ -21,6 +21,8 @@ if(moduleExists("react-native")) { afterInteractions = require('react-native').InteractionManager.runAfterInteractions; } else { + // This code allows the package to work on the web, but it causes an issue in Metro <0.59.0, which is hard to upgrade to due to the react native community CLI not supporting it + /* afterInteractions = requestIdleCallback; try { db.batchedUpdates = require('react-dom').unstable_batchedUpdates; @@ -28,6 +30,7 @@ else { catch(e) { console.warn("react-dom isn't installed, so minimongo-cache performance may be reduced"); } + */ } function runAfterOtherComputations(fn) { From 3f077b83d041a474fa081c5cdc98d33588a39ae4 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Wed, 13 Jan 2021 21:28:36 -0500 Subject: [PATCH 39/44] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b54f937..2d21438 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.2.0", + "version": "2.1.1", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { From 6f418ce81dccbfbce6414adc243f295abf7a978c Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Tue, 19 Jan 2021 20:38:42 -0500 Subject: [PATCH 40/44] Bring in new Meteor Tracker to replace 5 years outdated trackr package (#55) --- SECURITY.md | 2 +- package.json | 3 +- src/Collection.js | 2 +- src/Data.js | 4 +- src/Meteor.js | 12 +- src/Tracker.js | 635 +++++++++++++++++++++++++++++++++++ src/components/useTracker.js | 2 +- src/index.js | 3 +- 8 files changed, 649 insertions(+), 14 deletions(-) create mode 100644 src/Tracker.js diff --git a/SECURITY.md b/SECURITY.md index 0c26088..3104e5e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ | Version | Supported | | ------- | ------------------ | -| 2.0.x | :white_check_mark: | +| >=2.0.0 | :white_check_mark: | ## Reporting a Vulnerability diff --git a/package.json b/package.json index 2d21438..d1675a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.1", + "version": "2.1.2", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { @@ -29,7 +29,6 @@ "minimongo-cache": "0.0.48", "node-require-fallback": "^1.0.0", "prop-types": "^15.5.10", - "trackr": "^2.0.2", "underscore": "^1.8.3", "wolfy87-eventemitter": "^4.3.0" }, diff --git a/src/Collection.js b/src/Collection.js index 240564d..0e96478 100644 --- a/src/Collection.js +++ b/src/Collection.js @@ -1,4 +1,4 @@ -import Tracker from 'trackr'; +import Tracker from './Tracker.js'; import EJSON from 'ejson'; import _ from 'underscore'; diff --git a/src/Data.js b/src/Data.js index 36f6b18..789336c 100644 --- a/src/Data.js +++ b/src/Data.js @@ -1,5 +1,5 @@ import minimongo from 'minimongo-cache'; -import Trackr from 'trackr'; +import Tracker from './Tracker.js'; const db = new minimongo(); db.debug = false; @@ -35,7 +35,7 @@ else { function runAfterOtherComputations(fn) { afterInteractions(() => { - Trackr.afterFlush(() => { + Tracker.afterFlush(() => { fn(); }); }); diff --git a/src/Meteor.js b/src/Meteor.js index f52f741..cf6463f 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -1,4 +1,4 @@ -import Trackr from 'trackr'; +import Tracker from './Tracker.js'; import EJSON from 'ejson'; import DDP from '../lib/ddp.js'; import Random from '../lib/Random'; @@ -22,7 +22,7 @@ const Meteor = { }, Random, Mongo, - Tracker: Trackr, + Tracker, EJSON, ReactiveDict, Collection, @@ -290,7 +290,7 @@ const Meteor = { params: EJSON.clone(params), inactive: false, ready: false, - readyDeps: new Trackr.Dependency(), + readyDeps: new Tracker.Dependency(), readyCallback: callbacks.onReady, stopCallback: callbacks.onStop, stop: function() { @@ -320,19 +320,19 @@ const Meteor = { subscriptionId: id, }; - if (Trackr.active) { + if (Tracker.active) { // We're in a reactive computation, so we'd like to unsubscribe when the // computation is invalidated... but not if the rerun just re-subscribes // to the same subscription! When a rerun happens, we use onInvalidate // as a change to mark the subscription "inactive" so that it can // be reused from the rerun. If it isn't reused, it's killed from // an afterFlush. - Trackr.onInvalidate(function(c) { + Tracker.onInvalidate(function(c) { if (Data.subscriptions[id]) { Data.subscriptions[id].inactive = true; } - Trackr.afterFlush(function() { + Tracker.afterFlush(function() { if (Data.subscriptions[id] && Data.subscriptions[id].inactive) { handle.stop(); } diff --git a/src/Tracker.js b/src/Tracker.js new file mode 100644 index 0000000..cc26141 --- /dev/null +++ b/src/Tracker.js @@ -0,0 +1,635 @@ +///////////////////////////////////////////////////// +// Package docs at http://docs.meteor.com/#tracker // +///////////////////////////////////////////////////// + +/** + * @namespace Tracker + * @summary The namespace for Tracker-related methods. + */ +const Tracker = {}; + +/** + * @namespace Deps + * @deprecated + */ +const Deps = Tracker; + +// http://docs.meteor.com/#tracker_active + +/** + * @summary True if there is a current computation, meaning that dependencies on reactive data sources will be tracked and potentially cause the current computation to be rerun. + * @locus Client + * @type {Boolean} + */ +Tracker.active = false; + +// http://docs.meteor.com/#tracker_currentcomputation + +/** + * @summary The current computation, or `null` if there isn't one. The current computation is the [`Tracker.Computation`](#tracker_computation) object created by the innermost active call to `Tracker.autorun`, and it's the computation that gains dependencies when reactive data sources are accessed. + * @locus Client + * @type {Tracker.Computation} + */ +Tracker.currentComputation = null; + +function setCurrentComputation(c) { + Tracker.currentComputation = c; + Tracker.active = !! c; +} + +function _debugFunc() { + // We want this code to work without Meteor, and also without + // "console" (which is technically non-standard and may be missing + // on some browser we come across, like it was on IE 7). + // + // Lazy evaluation because `Meteor` does not exist right away.(??) + return (typeof Meteor !== "undefined" ? Meteor._debug : + ((typeof console !== "undefined") && console.error ? + function () { console.error.apply(console, arguments); } : + function () {})); +} + +function _maybeSuppressMoreLogs(messagesLength) { + // Sometimes when running tests, we intentionally suppress logs on expected + // printed errors. Since the current implementation of _throwOrLog can log + // multiple separate log messages, suppress all of them if at least one suppress + // is expected as we still want them to count as one. + if (typeof Meteor !== "undefined") { + if (Meteor._suppressed_log_expected()) { + Meteor._suppress_log(messagesLength - 1); + } + } +} + +function _throwOrLog(from, e) { + if (throwFirstError) { + throw e; + } else { + var printArgs = ["Exception from Tracker " + from + " function:"]; + if (e.stack && e.message && e.name) { + var idx = e.stack.indexOf(e.message); + if (idx < 0 || idx > e.name.length + 2) { // check for "Error: " + // message is not part of the stack + var message = e.name + ": " + e.message; + printArgs.push(message); + } + } + printArgs.push(e.stack); + _maybeSuppressMoreLogs(printArgs.length); + + for (var i = 0; i < printArgs.length; i++) { + _debugFunc()(printArgs[i]); + } + } +} + +// Takes a function `f`, and wraps it in a `Meteor._noYieldsAllowed` +// block if we are running on the server. On the client, returns the +// original function (since `Meteor._noYieldsAllowed` is a +// no-op). This has the benefit of not adding an unnecessary stack +// frame on the client. +function withNoYieldsAllowed(f) { + if ((typeof Meteor === 'undefined') || Meteor.isClient) { + return f; + } else { + return function () { + var args = arguments; + Meteor._noYieldsAllowed(function () { + f.apply(null, args); + }); + }; + } +} + +var nextId = 1; +// computations whose callbacks we should call at flush time +var pendingComputations = []; +// `true` if a Tracker.flush is scheduled, or if we are in Tracker.flush now +var willFlush = false; +// `true` if we are in Tracker.flush now +var inFlush = false; +// `true` if we are computing a computation now, either first time +// or recompute. This matches Tracker.active unless we are inside +// Tracker.nonreactive, which nullfies currentComputation even though +// an enclosing computation may still be running. +var inCompute = false; +// `true` if the `_throwFirstError` option was passed in to the call +// to Tracker.flush that we are in. When set, throw rather than log the +// first error encountered while flushing. Before throwing the error, +// finish flushing (from a finally block), logging any subsequent +// errors. +var throwFirstError = false; + +var afterFlushCallbacks = []; + +function requireFlush() { + if (! willFlush) { + // We want this code to work without Meteor, see debugFunc above + if (typeof Meteor !== "undefined") + Meteor._setImmediate(Tracker._runFlush); + else + setTimeout(Tracker._runFlush, 0); + willFlush = true; + } +} + +// Tracker.Computation constructor is visible but private +// (throws an error if you try to call it) +var constructingComputation = false; + +// +// http://docs.meteor.com/#tracker_computation + +/** + * @summary A Computation object represents code that is repeatedly rerun + * in response to + * reactive data changes. Computations don't have return values; they just + * perform actions, such as rerendering a template on the screen. Computations + * are created using Tracker.autorun. Use stop to prevent further rerunning of a + * computation. + * @instancename computation + */ +Tracker.Computation = class Computation { + constructor(f, parent, onError) { + if (! constructingComputation) + throw new Error( + "Tracker.Computation constructor is private; use Tracker.autorun"); + constructingComputation = false; + + // http://docs.meteor.com/#computation_stopped + + /** + * @summary True if this computation has been stopped. + * @locus Client + * @memberOf Tracker.Computation + * @instance + * @name stopped + */ + this.stopped = false; + + // http://docs.meteor.com/#computation_invalidated + + /** + * @summary True if this computation has been invalidated (and not yet rerun), or if it has been stopped. + * @locus Client + * @memberOf Tracker.Computation + * @instance + * @name invalidated + * @type {Boolean} + */ + this.invalidated = false; + + // http://docs.meteor.com/#computation_firstrun + + /** + * @summary True during the initial run of the computation at the time `Tracker.autorun` is called, and false on subsequent reruns and at other times. + * @locus Client + * @memberOf Tracker.Computation + * @instance + * @name firstRun + * @type {Boolean} + */ + this.firstRun = true; + + this._id = nextId++; + this._onInvalidateCallbacks = []; + this._onStopCallbacks = []; + // the plan is at some point to use the parent relation + // to constrain the order that computations are processed + this._parent = parent; + this._func = f; + this._onError = onError; + this._recomputing = false; + + var errored = true; + try { + this._compute(); + errored = false; + } finally { + this.firstRun = false; + if (errored) + this.stop(); + } + } + + // http://docs.meteor.com/#computation_oninvalidate + + /** + * @summary Registers `callback` to run when this computation is next invalidated, or runs it immediately if the computation is already invalidated. The callback is run exactly once and not upon future invalidations unless `onInvalidate` is called again after the computation becomes valid again. + * @locus Client + * @param {Function} callback Function to be called on invalidation. Receives one argument, the computation that was invalidated. + */ + onInvalidate(f) { + if (typeof f !== 'function') + throw new Error("onInvalidate requires a function"); + + if (this.invalidated) { + Tracker.nonreactive(() => { + withNoYieldsAllowed(f)(this); + }); + } else { + this._onInvalidateCallbacks.push(f); + } + } + + /** + * @summary Registers `callback` to run when this computation is stopped, or runs it immediately if the computation is already stopped. The callback is run after any `onInvalidate` callbacks. + * @locus Client + * @param {Function} callback Function to be called on stop. Receives one argument, the computation that was stopped. + */ + onStop(f) { + if (typeof f !== 'function') + throw new Error("onStop requires a function"); + + if (this.stopped) { + Tracker.nonreactive(() => { + withNoYieldsAllowed(f)(this); + }); + } else { + this._onStopCallbacks.push(f); + } + } + + // http://docs.meteor.com/#computation_invalidate + + /** + * @summary Invalidates this computation so that it will be rerun. + * @locus Client + */ + invalidate() { + if (! this.invalidated) { + // if we're currently in _recompute(), don't enqueue + // ourselves, since we'll rerun immediately anyway. + if (! this._recomputing && ! this.stopped) { + requireFlush(); + pendingComputations.push(this); + } + + this.invalidated = true; + + // callbacks can't add callbacks, because + // this.invalidated === true. + for(var i = 0, f; f = this._onInvalidateCallbacks[i]; i++) { + Tracker.nonreactive(() => { + withNoYieldsAllowed(f)(this); + }); + } + this._onInvalidateCallbacks = []; + } + } + + // http://docs.meteor.com/#computation_stop + + /** + * @summary Prevents this computation from rerunning. + * @locus Client + */ + stop() { + if (! this.stopped) { + this.stopped = true; + this.invalidate(); + for(var i = 0, f; f = this._onStopCallbacks[i]; i++) { + Tracker.nonreactive(() => { + withNoYieldsAllowed(f)(this); + }); + } + this._onStopCallbacks = []; + } + } + + _compute() { + this.invalidated = false; + + var previous = Tracker.currentComputation; + setCurrentComputation(this); + var previousInCompute = inCompute; + inCompute = true; + try { + withNoYieldsAllowed(this._func)(this); + } finally { + setCurrentComputation(previous); + inCompute = previousInCompute; + } + } + + _needsRecompute() { + return this.invalidated && ! this.stopped; + } + + _recompute() { + this._recomputing = true; + try { + if (this._needsRecompute()) { + try { + this._compute(); + } catch (e) { + if (this._onError) { + this._onError(e); + } else { + _throwOrLog("recompute", e); + } + } + } + } finally { + this._recomputing = false; + } + } + + /** + * @summary Process the reactive updates for this computation immediately + * and ensure that the computation is rerun. The computation is rerun only + * if it is invalidated. + * @locus Client + */ + flush() { + if (this._recomputing) + return; + + this._recompute(); + } + + /** + * @summary Causes the function inside this computation to run and + * synchronously process all reactive updtes. + * @locus Client + */ + run() { + this.invalidate(); + this.flush(); + } +}; + +// +// http://docs.meteor.com/#tracker_dependency + +/** + * @summary A Dependency represents an atomic unit of reactive data that a + * computation might depend on. Reactive data sources such as Session or + * Minimongo internally create different Dependency objects for different + * pieces of data, each of which may be depended on by multiple computations. + * When the data changes, the computations are invalidated. + * @class + * @instanceName dependency + */ +Tracker.Dependency = class Dependency { + constructor() { + this._dependentsById = Object.create(null); + } + + // http://docs.meteor.com/#dependency_depend + // + // Adds `computation` to this set if it is not already + // present. Returns true if `computation` is a new member of the set. + // If no argument, defaults to currentComputation, or does nothing + // if there is no currentComputation. + + /** + * @summary Declares that the current computation (or `fromComputation` if given) depends on `dependency`. The computation will be invalidated the next time `dependency` changes. + + If there is no current computation and `depend()` is called with no arguments, it does nothing and returns false. + + Returns true if the computation is a new dependent of `dependency` rather than an existing one. + * @locus Client + * @param {Tracker.Computation} [fromComputation] An optional computation declared to depend on `dependency` instead of the current computation. + * @returns {Boolean} + */ + depend(computation) { + if (! computation) { + if (! Tracker.active) + return false; + + computation = Tracker.currentComputation; + } + var id = computation._id; + if (! (id in this._dependentsById)) { + this._dependentsById[id] = computation; + computation.onInvalidate(() => { + delete this._dependentsById[id]; + }); + return true; + } + return false; + } + + // http://docs.meteor.com/#dependency_changed + + /** + * @summary Invalidate all dependent computations immediately and remove them as dependents. + * @locus Client + */ + changed() { + for (var id in this._dependentsById) + this._dependentsById[id].invalidate(); + } + + // http://docs.meteor.com/#dependency_hasdependents + + /** + * @summary True if this Dependency has one or more dependent Computations, which would be invalidated if this Dependency were to change. + * @locus Client + * @returns {Boolean} + */ + hasDependents() { + for (var id in this._dependentsById) + return true; + return false; + } +}; + +// http://docs.meteor.com/#tracker_flush + +/** + * @summary Process all reactive updates immediately and ensure that all invalidated computations are rerun. + * @locus Client + */ +Tracker.flush = function (options) { + Tracker._runFlush({ finishSynchronously: true, + throwFirstError: options && options._throwFirstError }); +}; + +/** + * @summary True if we are computing a computation now, either first time or recompute. This matches Tracker.active unless we are inside Tracker.nonreactive, which nullfies currentComputation even though an enclosing computation may still be running. + * @locus Client + * @returns {Boolean} + */ +Tracker.inFlush = function () { + return inFlush; +} + +// Run all pending computations and afterFlush callbacks. If we were not called +// directly via Tracker.flush, this may return before they're all done to allow +// the event loop to run a little before continuing. +Tracker._runFlush = function (options) { + // XXX What part of the comment below is still true? (We no longer + // have Spark) + // + // Nested flush could plausibly happen if, say, a flush causes + // DOM mutation, which causes a "blur" event, which runs an + // app event handler that calls Tracker.flush. At the moment + // Spark blocks event handlers during DOM mutation anyway, + // because the LiveRange tree isn't valid. And we don't have + // any useful notion of a nested flush. + // + // https://app.asana.com/0/159908330244/385138233856 + if (Tracker.inFlush()) + throw new Error("Can't call Tracker.flush while flushing"); + + if (inCompute) + throw new Error("Can't flush inside Tracker.autorun"); + + options = options || {}; + + inFlush = true; + willFlush = true; + throwFirstError = !! options.throwFirstError; + + var recomputedCount = 0; + var finishedTry = false; + try { + while (pendingComputations.length || + afterFlushCallbacks.length) { + + // recompute all pending computations + while (pendingComputations.length) { + var comp = pendingComputations.shift(); + comp._recompute(); + if (comp._needsRecompute()) { + pendingComputations.unshift(comp); + } + + if (! options.finishSynchronously && ++recomputedCount > 1000) { + finishedTry = true; + return; + } + } + + if (afterFlushCallbacks.length) { + // call one afterFlush callback, which may + // invalidate more computations + var func = afterFlushCallbacks.shift(); + try { + func(); + } catch (e) { + _throwOrLog("afterFlush", e); + } + } + } + finishedTry = true; + } finally { + if (! finishedTry) { + // we're erroring due to throwFirstError being true. + inFlush = false; // needed before calling `Tracker.flush()` again + // finish flushing + Tracker._runFlush({ + finishSynchronously: options.finishSynchronously, + throwFirstError: false + }); + } + willFlush = false; + inFlush = false; + if (pendingComputations.length || afterFlushCallbacks.length) { + // We're yielding because we ran a bunch of computations and we aren't + // required to finish synchronously, so we'd like to give the event loop a + // chance. We should flush again soon. + if (options.finishSynchronously) { + throw new Error("still have more to do?"); // shouldn't happen + } + setTimeout(requireFlush, 10); + } + } +}; + +// http://docs.meteor.com/#tracker_autorun +// +// Run f(). Record its dependencies. Rerun it whenever the +// dependencies change. +// +// Returns a new Computation, which is also passed to f. +// +// Links the computation to the current computation +// so that it is stopped if the current computation is invalidated. + +/** + * @callback Tracker.ComputationFunction + * @param {Tracker.Computation} + */ +/** + * @summary Run a function now and rerun it later whenever its dependencies + * change. Returns a Computation object that can be used to stop or observe the + * rerunning. + * @locus Client + * @param {Tracker.ComputationFunction} runFunc The function to run. It receives + * one argument: the Computation object that will be returned. + * @param {Object} [options] + * @param {Function} options.onError Optional. The function to run when an error + * happens in the Computation. The only argument it receives is the Error + * thrown. Defaults to the error being logged to the console. + * @returns {Tracker.Computation} + */ +Tracker.autorun = function (f, options) { + if (typeof f !== 'function') + throw new Error('Tracker.autorun requires a function argument'); + + options = options || {}; + + constructingComputation = true; + var c = new Tracker.Computation( + f, Tracker.currentComputation, options.onError); + + if (Tracker.active) + Tracker.onInvalidate(function () { + c.stop(); + }); + + return c; +}; + +// http://docs.meteor.com/#tracker_nonreactive +// +// Run `f` with no current computation, returning the return value +// of `f`. Used to turn off reactivity for the duration of `f`, +// so that reactive data sources accessed by `f` will not result in any +// computations being invalidated. + +/** + * @summary Run a function without tracking dependencies. + * @locus Client + * @param {Function} func A function to call immediately. + */ +Tracker.nonreactive = function (f) { + var previous = Tracker.currentComputation; + setCurrentComputation(null); + try { + return f(); + } finally { + setCurrentComputation(previous); + } +}; + +// http://docs.meteor.com/#tracker_oninvalidate + +/** + * @summary Registers a new [`onInvalidate`](#computation_oninvalidate) callback on the current computation (which must exist), to be called immediately when the current computation is invalidated or stopped. + * @locus Client + * @param {Function} callback A callback function that will be invoked as `func(c)`, where `c` is the computation on which the callback is registered. + */ +Tracker.onInvalidate = function (f) { + if (! Tracker.active) + throw new Error("Tracker.onInvalidate requires a currentComputation"); + + Tracker.currentComputation.onInvalidate(f); +}; + +// http://docs.meteor.com/#tracker_afterflush + +/** + * @summary Schedules a function to be called during the next flush, or later in the current flush if one is in progress, after all invalidated computations have been rerun. The function will be run once and not on subsequent flushes unless `afterFlush` is called again. + * @locus Client + * @param {Function} callback A function to call at flush time. + */ +Tracker.afterFlush = function (f) { + afterFlushCallbacks.push(f); + requireFlush(); +}; + +export default Tracker; diff --git a/src/components/useTracker.js b/src/components/useTracker.js index b32a510..7cfd833 100644 --- a/src/components/useTracker.js +++ b/src/components/useTracker.js @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import Tracker from 'trackr'; +import Tracker from '../Tracker.js'; import Data from '../Data'; export default (trackerFn, deps = []) => { diff --git a/src/index.js b/src/index.js index 7b5303f..e5f7b19 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import Meteor from './Meteor.js'; import User from './user/User.js'; import Accounts from './user/Accounts.js'; +import Tracker from './Tracker.js' Object.assign(Meteor, User); @@ -8,5 +9,5 @@ const { withTracker, Mongo, packageInterface, ReactiveDict } = Meteor; -export { Accounts, withTracker, Mongo, packageInterface, ReactiveDict }; +export { Accounts, withTracker, Mongo, packageInterface, ReactiveDict, Tracker }; export default Meteor; \ No newline at end of file From 903406fcc309a11a4818b578ba72a0398eba0ddd Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Sat, 5 Jun 2021 16:04:36 -0400 Subject: [PATCH 41/44] Make `useTracker` a named export from the package --- src/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index e5f7b19..72c2a8a 100644 --- a/src/index.js +++ b/src/index.js @@ -6,8 +6,8 @@ import Tracker from './Tracker.js' Object.assign(Meteor, User); const { - withTracker, Mongo, packageInterface, ReactiveDict + useTracker, withTracker, Mongo, packageInterface, ReactiveDict } = Meteor; -export { Accounts, withTracker, Mongo, packageInterface, ReactiveDict, Tracker }; -export default Meteor; \ No newline at end of file +export { useTracker, Accounts, withTracker, Mongo, packageInterface, ReactiveDict, Tracker }; +export default Meteor; From 3a32b2ac86cad0a780c87c0bea3aefbf631a2559 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Sat, 5 Jun 2021 16:05:10 -0400 Subject: [PATCH 42/44] Merge changes from master into dev (#63) * Update Login example to bring up to date with latest version * Update api.md * Note that observeChanges is unimplemented * Fix withTracker (#61) * Fix withTracker * Fix unused var * fix Co-authored-by: Zach Oligschlaeger * Introduce whazzup.co to README showcase Co-authored-by: schlaegerz Co-authored-by: Zach Oligschlaeger --- README.md | 11 +++++++++++ src/components/withTracker.js | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 24f737d..452f65d 100644 --- a/README.md +++ b/README.md @@ -115,3 +115,14 @@ import Meteor from '@meteorrn/core'; const {AsyncStorage} = Meteor.packageInterface(); ```` + + +### Differences from Meteor Core to Note: +- This API does not implement `observeChanges` (but it does implement `observe`) + +# Showcase + +| Whazzup.co | +| --- | +| | +| [Whazzup.co](https://whazzup.co/) uses Meteor React Native in their native app | diff --git a/src/components/withTracker.js b/src/components/withTracker.js index cede3e0..73553a4 100644 --- a/src/components/withTracker.js +++ b/src/components/withTracker.js @@ -7,10 +7,10 @@ export default function withTracker (options) { const { getMeteorData, pure = true } = expandedOptions; const WithTracker = forwardRef((props, ref) => { - const data = useTracker(() => getMeteorData(props) || {}); + const data = useTracker(() => getMeteorData(props) || {}, [props]); return React.createElement(Component, {ref, ...props, ...data}); }); return pure ? memo(WithTracker) : WithTracker; }; -} +} \ No newline at end of file From e9abc8bb9ce0eefef03dca0382bd391d7e45e372 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 7 Jun 2021 19:59:50 -0400 Subject: [PATCH 43/44] Updates to fix a bug on some react native versions --- src/Data.js | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/Data.js b/src/Data.js index 789336c..ec65c7b 100644 --- a/src/Data.js +++ b/src/Data.js @@ -3,35 +3,9 @@ import Tracker from './Tracker.js'; const db = new minimongo(); db.debug = false; - -const moduleExists = m => { - try { - require.resolve(m); - } - catch(e) { - return false; - } - return true; -}; - -let afterInteractions; -if(moduleExists("react-native")) { - db.batchedUpdates = require('react-native/Libraries/Renderer/shims/ReactNative').unstable_batchedUpdates; - process.nextTick = setImmediate; - afterInteractions = require('react-native').InteractionManager.runAfterInteractions; -} -else { - // This code allows the package to work on the web, but it causes an issue in Metro <0.59.0, which is hard to upgrade to due to the react native community CLI not supporting it - /* - afterInteractions = requestIdleCallback; - try { - db.batchedUpdates = require('react-dom').unstable_batchedUpdates; - } - catch(e) { - console.warn("react-dom isn't installed, so minimongo-cache performance may be reduced"); - } - */ -} +db.batchedUpdates = require('react-native/Libraries/Renderer/shims/ReactNative').unstable_batchedUpdates; +process.nextTick = setImmediate; +afterInteractions = require('react-native').InteractionManager.runAfterInteractions; function runAfterOtherComputations(fn) { afterInteractions(() => { From 759dea582b5b923828b55936f682ec564e4172c7 Mon Sep 17 00:00:00 2001 From: Nathaniel Dsouza Date: Mon, 7 Jun 2021 20:02:29 -0400 Subject: [PATCH 44/44] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1675a8..16a1fc7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.1.2", + "version": "2.2.0", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": {