├── .babelrc
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── index.js
├── lib
├── Random.js
├── ddp.js
├── mongo-id.js
├── queue.js
├── socket.js
└── utils.js
├── package.json
├── src
├── Call.js
├── Collection.js
├── Data.js
├── Meteor.js
├── ReactiveDict.js
├── components
│ ├── Mixin.js
│ ├── composeWithTracker.js
│ └── createContainer.js
└── user
│ ├── Accounts.js
│ └── User.js
├── test
├── lib
│ └── ddpShould.js
└── setup.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": [
3 | "transform-runtime"
4 | ],
5 | "presets": ["es2015", "react", "stage-0"]
6 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | node_modules/
3 | dist/
4 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "stable"
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # react-meteor
2 | 
3 |
4 | Meteor Reactivity for your React application :)
5 |
6 | Looking for a demo? Try to check out [react-meteor-todomvc](https://github.com/ZevenFang/react-meteor-todomvc).
7 |
8 | ## What is it for ?
9 |
10 | The purpose of this library is :
11 | * to set up and maintain a ddp connection with a ddp server, freeing the developer from having to do it on their own.
12 | * be fully compatible with react and help react developers.
13 | * **to match with [Meteor documentation](http://docs.meteor.com/) used with React.**
14 |
15 | ## Install
16 |
17 | npm i --save react-web-meteor
18 |
19 | ## Example usage
20 |
21 | ```javascript
22 |
23 | import React, { Component } from 'react';
24 | import Meteor, { createContainer } from 'react-web-meteor';
25 |
26 | Meteor.connect('ws://192.168.X.X:3000/websocket');//do this only once
27 |
28 | class Todo extends Component {
29 | renderRow(todo) {
30 | return (
31 | {todo.title}
32 | );
33 | }
34 | render() {
35 | const { settings, todosReady, todos } = this.props;
36 | return(
37 |
38 |
{settings.title}
39 | {!todosReady &&
Not ready}
40 |
{todos.map(v=>this.renderRow(v))}
41 |
42 | )
43 | }
44 | }
45 |
46 | export default createContainer(params=>{
47 | const handle = Meteor.subscribe('todos');
48 | Meteor.subscribe('settings');
49 | return {
50 | todosReady: handle.ready(),
51 | settings: Meteor.collection('settings').findOne()
52 | };
53 | }, Todo)
54 | ```
55 |
56 | # Connect your components
57 |
58 | [Since Meteor 1.3, createContainer is the recommended way to populate your React Components](http://guide.meteor.com/v1.3/react.html#using-createContainer).
59 |
60 | ## createContainer
61 |
62 | Very similar to getMeteorData but your separate container components from presentational components.
63 |
64 | ### Example
65 |
66 | ```javascript
67 | import Meteor, { createContainer } from 'react-web-meteor';
68 |
69 |
70 | class Orders extends Component {
71 | render() {
72 | const { pendingOrders } = this.props;
73 |
74 | //...
75 | );
76 | }
77 | }
78 |
79 | export default createContainer(params=>{
80 | return {
81 | pendingOrders: Meteor.collection('orders').find({status: "pending"}),
82 | };
83 | }, Orders)
84 | ```
85 |
86 | # Reactive variables
87 |
88 | These variables can be used inside getMeteorData or createContainer. They will be populated into your component if they change.
89 |
90 | * [Meteor.subscribe()](http://docs.meteor.com/#/full/meteor_subscribe)
91 | * Meteor.collection(collectionName, options)
92 | * [.find(selector, options)](http://docs.meteor.com/#/full/find)
93 | * [.findOne(selector, options)](http://docs.meteor.com/#/full/findone)
94 | * [Meteor.user()](http://docs.meteor.com/#/full/meteor_user)
95 | * [Meteor.userId()](http://docs.meteor.com/#/full/meteor_userid)
96 | * [Meteor.status()](http://docs.meteor.com/#/full/meteor_status)
97 | * [Meteor.loggingIn()](http://docs.meteor.com/#/full/meteor_loggingin)
98 | * [ReactiveDict()](https://atmospherejs.com/meteor/reactive-dict)
99 |
100 | # Additionals collection methods
101 |
102 | These methods (except update) work offline. That means that elements are correctly updated offline, and when you reconnect to ddp, Meteor calls are taken care of.
103 |
104 | * Meteor.collection(collectionName, options)
105 | * [.insert(doc, callback)](http://docs.meteor.com/#/full/insert)
106 | * [.update(id, modifier, [options], [callback])](http://docs.meteor.com/#/full/update)
107 | * [.remove(id, callback(err, countRemoved))](http://docs.meteor.com/#/full/remove)
108 |
109 | # API
110 |
111 | ## Meteor Collections
112 |
113 | ### Meteor.subscribe
114 | [Meteor.subscribe()](http://docs.meteor.com/#/full/meteor_subscribe) returns an handle. If the component which called subscribe is unmounted, the subscription is automatically canceled.
115 |
116 | ### Meteor.collection(collectionName, options)
117 | You need pass the `cursoredFind` option when you get your collection if you want to use cursor-like method:
118 |
119 | ```javascript
120 | Meteor.collection("collectionName", { cursoredFind: true })
121 | ```
122 |
123 | Or you can simply use `find()` to get an array of documents. The option default to false for backward compatibility. Cursor methods are available to share code more easily between a react app and a standard Meteor app.
124 |
125 |
126 | ## Meteor DDP connection
127 |
128 | ### Meteor.connect(endpoint, options)
129 |
130 | Connect to a DDP server. You only have to do this once in your app.
131 |
132 | *Arguments*
133 |
134 | - `url` **string** *required*
135 | - `options` **object** Available options are :
136 | - autoConnect **boolean** [true] whether to establish the connection to the server upon instantiation. When false, one can manually establish the connection with the Meteor.ddp.connect method.
137 | - autoReconnect **boolean** [true] whether to try to reconnect to the server when the socket connection closes, unless the closing was initiated by a call to the disconnect method.
138 | - reconnectInterval **number** [10000] the interval in ms between reconnection attempts.
139 |
140 | ### Meteor.disconnect()
141 |
142 | Disconnect from the DDP server.
143 |
144 | ## Meteor methods
145 |
146 | * [Meteor.call](http://docs.meteor.com/#/full/meteor_call)
147 | * [Meteor.loginWithPassword](http://docs.meteor.com/#/full/meteor_loginwithpassword) (Please note that user is auto-resigned in - like in Meteor Web applications.)
148 | * [Meteor.logout](http://docs.meteor.com/#/full/meteor_logout)
149 | * [Meteor.logoutOtherClients](http://docs.meteor.com/#/full/meteor_logoutotherclients)
150 |
151 | ## Availables packages
152 |
153 | ### Convenience packages
154 | Example `import { composeWithTracker } from 'react-web-meteor';``
155 |
156 | * EJSON
157 | * Tracker
158 | * composeWithTracker: If you want to use [react-komposer](https://github.com/kadirahq/react-komposer), you can use react-web-meteor compatible composeWithTracker
159 | * Accounts (see below)
160 |
161 | ### ReactiveDict
162 |
163 | See [documentation](https://atmospherejs.com/meteor/reactive-dict).
164 |
165 |
166 | ### Meteor.Accounts
167 |
168 | `import { Accounts } from 'react-web-meteor';``
169 |
170 | * [Accounts.createUser](http://docs.meteor.com/#/full/accounts_createuser)
171 | * [Accounts.changePassword](http://docs.meteor.com/#/full/accounts_forgotpassword)
172 | * [Accounts.forgotPassword](http://docs.meteor.com/#/full/accounts_changepassword)
173 | * [Accounts.resetPassword](http://docs.meteor.com/#/full/accounts_resetpassword)
174 | * [Accounts.onLogin](http://docs.meteor.com/#/full/accounts_onlogin)
175 | * [Accounts.onLoginFailure](http://docs.meteor.com/#/full/accounts_onloginfailure)
176 |
177 | ### Meteor.ddp
178 |
179 | Once connected to the ddp server, you can access every method available in [ddp.js](https://github.com/mondora/ddp.js/).
180 | * Meteor.ddp.on('connected')
181 | * Meteor.ddp.on('added')
182 | * Meteor.ddp.on('changed')
183 | * ...
184 |
185 | # Author
186 |
187 | * Zeven ([@ZevenFang](https://github.com/zevenfang))
188 |
189 | # Want to help ?
190 |
191 | Pull Requests and issues reported are welcome! :)
192 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | Object.defineProperty(exports, "__esModule", {
2 | value: true
3 | });
4 |
5 | exports.default = require('./src/Meteor');
6 | exports.createContainer = require('./src/Meteor').createContainer;
7 | exports.connectMeteor = require('./src/Meteor').connectMeteor;
8 | exports.Accounts = require('./src/Meteor').Accounts;
9 | exports.composeWithTracker = require('./src/Meteor').composeWithTracker;
10 | exports.ReactiveDict = require('./src/Meteor').ReactiveDict;
11 |
--------------------------------------------------------------------------------
/lib/Random.js:
--------------------------------------------------------------------------------
1 | const UNMISTAKABLE_CHARS = "23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz";
2 |
3 | module.exports = {
4 | id(count = 17) {
5 | let res = "";
6 | for(let i=0;i {
40 | if (this.status === "connected") {
41 | this.socket.send(message);
42 | return true;
43 | } else {
44 | return false;
45 | }
46 | });
47 |
48 | this.socket = new Socket(options.SocketConstructor, options.endpoint);
49 |
50 | this.socket.on("open", () => {
51 | // When the socket opens, send the `connect` message
52 | // to establish the DDP connection
53 | this.socket.send({
54 | msg: "connect",
55 | version: DDP_VERSION,
56 | support: [DDP_VERSION]
57 | });
58 | });
59 |
60 | this.socket.on("close", () => {
61 | this.status = "disconnected";
62 | this.messageQueue.empty();
63 | this.emit("disconnected");
64 | if (this.autoReconnect) {
65 | // Schedule a reconnection
66 | setTimeout(
67 | this.socket.open.bind(this.socket),
68 | this.reconnectInterval
69 | );
70 | }
71 | });
72 |
73 | this.socket.on("message:in", message => {
74 | if (message.msg === "connected") {
75 | this.status = "connected";
76 | this.messageQueue.process();
77 | this.emit("connected");
78 | } else if (message.msg === "ping") {
79 | // Reply with a `pong` message to prevent the server from
80 | // closing the connection
81 | this.socket.send({msg: "pong", id: message.id});
82 | } else if (contains(PUBLIC_EVENTS, message.msg)) {
83 | this.emit(message.msg, message);
84 | }
85 | });
86 |
87 | if (this.autoConnect) {
88 | this.connect();
89 | }
90 |
91 | }
92 |
93 | connect () {
94 | this.socket.open();
95 | }
96 |
97 | disconnect () {
98 | /*
99 | * If `disconnect` is called, the caller likely doesn't want the
100 | * the instance to try to auto-reconnect. Therefore we set the
101 | * `autoReconnect` flag to false.
102 | */
103 | this.autoReconnect = false;
104 | this.socket.close();
105 | }
106 |
107 | method (name, params) {
108 | const id = uniqueId();
109 | this.messageQueue.push({
110 | msg: "method",
111 | id: id,
112 | method: name,
113 | params: params
114 | });
115 | return id;
116 | }
117 |
118 | sub (name, params) {
119 | const id = uniqueId();
120 | this.messageQueue.push({
121 | msg: "sub",
122 | id: id,
123 | name: name,
124 | params: params
125 | });
126 | return id;
127 | }
128 |
129 | unsub (id) {
130 | this.messageQueue.push({
131 | msg: "unsub",
132 | id: id
133 | });
134 | return id;
135 | }
136 |
137 | }
--------------------------------------------------------------------------------
/lib/mongo-id.js:
--------------------------------------------------------------------------------
1 | //https://github.com/meteor/meteor/tree/master/packages/mongo-id
2 | import EJSON from "ejson";
3 |
4 | let MongoID = {};
5 |
6 | MongoID._looksLikeObjectID = function (str) {
7 | return str.length === 24 && str.match(/^[0-9a-f]*$/);
8 | };
9 |
10 | MongoID.ObjectID = function (hexString) {
11 | //random-based impl of Mongo ObjectID
12 | var self = this;
13 | if (hexString) {
14 | hexString = hexString.toLowerCase();
15 | if (!MongoID._looksLikeObjectID(hexString)) {
16 | throw new Error("Invalid hexadecimal string for creating an ObjectID");
17 | }
18 | // meant to work with _.isEqual(), which relies on structural equality
19 | self._str = hexString;
20 | } else {
21 | self._str = Random.hexString(24);
22 | }
23 | };
24 |
25 | MongoID.ObjectID.prototype.toString = function () {
26 | var self = this;
27 | return "ObjectID(\"" + self._str + "\")";
28 | };
29 |
30 | MongoID.ObjectID.prototype.equals = function (other) {
31 | var self = this;
32 | return other instanceof MongoID.ObjectID &&
33 | self.valueOf() === other.valueOf();
34 | };
35 |
36 | MongoID.ObjectID.prototype.clone = function () {
37 | var self = this;
38 | return new MongoID.ObjectID(self._str);
39 | };
40 |
41 | MongoID.ObjectID.prototype.typeName = function() {
42 | return "oid";
43 | };
44 |
45 | MongoID.ObjectID.prototype.getTimestamp = function() {
46 | var self = this;
47 | return parseInt(self._str.substr(0, 8), 16);
48 | };
49 |
50 | MongoID.ObjectID.prototype.valueOf =
51 | MongoID.ObjectID.prototype.toJSONValue =
52 | MongoID.ObjectID.prototype.toHexString =
53 | function () { return this._str; };
54 |
55 | EJSON.addType("oid", function (str) {
56 | return new MongoID.ObjectID(str);
57 | });
58 |
59 | MongoID.idStringify = function (id) {
60 | if (id instanceof MongoID.ObjectID) {
61 | return id.valueOf();
62 | } else if (typeof id === 'string') {
63 | if (id === "") {
64 | return id;
65 | } else if (id.substr(0, 1) === "-" || // escape previously dashed strings
66 | id.substr(0, 1) === "~" || // escape escaped numbers, true, false
67 | MongoID._looksLikeObjectID(id) || // escape object-id-form strings
68 | id.substr(0, 1) === '{') { // escape object-form strings, for maybe implementing later
69 | return "-" + id;
70 | } else {
71 | return id; // other strings go through unchanged.
72 | }
73 | } else if (id === undefined) {
74 | return '-';
75 | } else if (typeof id === 'object' && id !== null) {
76 | throw new Error("Meteor does not currently support objects other than ObjectID as ids");
77 | } else { // Numbers, true, false, null
78 | return "~" + JSON.stringify(id);
79 | }
80 | };
81 |
82 |
83 | MongoID.idParse = function (id) {
84 | if (id === "") {
85 | return id;
86 | } else if (id === '-') {
87 | return undefined;
88 | } else if (id.substr(0, 1) === '-') {
89 | return id.substr(1);
90 | } else if (id.substr(0, 1) === '~') {
91 | return JSON.parse(id.substr(1));
92 | } else if (MongoID._looksLikeObjectID(id)) {
93 | return new MongoID.ObjectID(id);
94 | } else {
95 | return id;
96 | }
97 | };
--------------------------------------------------------------------------------
/lib/queue.js:
--------------------------------------------------------------------------------
1 | export default class Queue {
2 |
3 | /*
4 | * As the name implies, `consumer` is the (sole) consumer of the queue.
5 | * It gets called with each element of the queue and its return value
6 | * serves as a ack, determining whether the element is removed or not from
7 | * the queue, allowing then subsequent elements to be processed.
8 | */
9 |
10 | constructor (consumer) {
11 | this.consumer = consumer;
12 | this.queue = [];
13 | }
14 |
15 | push (element) {
16 | this.queue.push(element);
17 | this.process();
18 | }
19 |
20 | process () {
21 | if (this.queue.length !== 0) {
22 | const ack = this.consumer(this.queue[0]);
23 | if (ack) {
24 | this.queue.shift();
25 | this.process();
26 | }
27 | }
28 | }
29 |
30 | empty () {
31 | this.queue = [];
32 | }
33 |
34 | }
--------------------------------------------------------------------------------
/lib/socket.js:
--------------------------------------------------------------------------------
1 | import EventEmitter from "wolfy87-eventemitter";
2 | import EJSON from "ejson";
3 | import "./mongo-id"; // Register mongo object ids */
4 |
5 | export default class Socket extends EventEmitter {
6 |
7 | constructor (SocketConstructor, endpoint) {
8 | super();
9 | this.SocketConstructor = SocketConstructor;
10 | this.endpoint = endpoint;
11 | this.rawSocket = null;
12 | }
13 |
14 | send (object) {
15 | if (!this.closing) {
16 | const message = EJSON.stringify(object);
17 | this.rawSocket.send(message);
18 | // Emit a copy of the object, as the listener might mutate it.
19 | this.emit("message:out", EJSON.parse(message));
20 | }
21 | }
22 |
23 | open () {
24 |
25 | /*
26 | * Makes `open` a no-op if there's already a `rawSocket`. This avoids
27 | * memory / socket leaks if `open` is called twice (e.g. by a user
28 | * calling `ddp.connect` twice) without properly disposing of the
29 | * socket connection. `rawSocket` gets automatically set to `null` only
30 | * when it goes into a closed or error state. This way `rawSocket` is
31 | * disposed of correctly: the socket connection is closed, and the
32 | * object can be garbage collected.
33 | */
34 | if (this.rawSocket) {
35 | return;
36 | }
37 | this.closing = false;
38 | this.rawSocket = new this.SocketConstructor(this.endpoint);
39 |
40 | /*
41 | * Calls to `onopen` and `onclose` directly trigger the `open` and
42 | * `close` events on the `Socket` instance.
43 | */
44 | this.rawSocket.onopen = () => this.emit("open");
45 | this.rawSocket.onclose = () => {
46 | this.rawSocket = null;
47 | this.emit("close");
48 | this.closing = false;
49 | };
50 | /*
51 | * Calls to `onmessage` trigger a `message:in` event on the `Socket`
52 | * instance only once the message (first parameter to `onmessage`) has
53 | * been successfully parsed into a javascript object.
54 | */
55 | this.rawSocket.onmessage = message => {
56 | var object;
57 | try {
58 | object = EJSON.parse(message.data);
59 | } catch (ignore) {
60 | // Simply ignore the malformed message and return
61 | return;
62 | }
63 | // Outside the try-catch block as it must only catch JSON parsing
64 | // errors, not errors that may occur inside a "message:in" event
65 | // handler
66 | this.emit("message:in", object);
67 | };
68 |
69 | }
70 |
71 | close () {
72 | /*
73 | * Avoid throwing an error if `rawSocket === null`
74 | */
75 | if (this.rawSocket) {
76 | this.closing = true;
77 | this.rawSocket.close();
78 | }
79 | }
80 |
81 | }
--------------------------------------------------------------------------------
/lib/utils.js:
--------------------------------------------------------------------------------
1 | import SHA256 from 'crypto-js/sha256';
2 | import _ from "underscore";
3 |
4 | var i = 0;
5 | export function uniqueId () {
6 | return (i++).toString();
7 | }
8 |
9 | export function contains (array, element) {
10 | return array.indexOf(element) !== -1;
11 | }
12 |
13 | export function hashPassword (password) {
14 | return {
15 | digest: SHA256(password).toString(),
16 | algorithm: "sha-256"
17 | }
18 | }
19 |
20 |
21 | //From Meteor core
22 | var class2type = {};
23 |
24 | var toString = class2type.toString;
25 |
26 | var hasOwn = class2type.hasOwnProperty;
27 |
28 | var support = {};
29 |
30 | // Populate the class2type map
31 | _.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(name, i) {
32 | class2type[ "[object " + name + "]" ] = name.toLowerCase();
33 | });
34 |
35 | function type( obj ) {
36 | if ( obj == null ) {
37 | return obj + "";
38 | }
39 | return typeof obj === "object" || typeof obj === "function" ?
40 | class2type[ toString.call(obj) ] || "object" :
41 | typeof obj;
42 | }
43 |
44 | function isWindow( obj ) {
45 | /* jshint eqeqeq: false */
46 | return obj != null && obj == obj.window;
47 | }
48 |
49 | export function isPlainObject ( obj ) {
50 | var key;
51 |
52 | // Must be an Object.
53 | // Because of IE, we also have to check the presence of the constructor property.
54 | // Make sure that DOM nodes and window objects don't pass through, as well
55 | if ( !obj || type(obj) !== "object" || obj.nodeType || isWindow( obj ) ) {
56 | return false;
57 | }
58 |
59 | try {
60 | // Not own constructor property must be Object
61 | if ( obj.constructor &&
62 | !hasOwn.call(obj, "constructor") &&
63 | !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
64 | return false;
65 | }
66 | } catch ( e ) {
67 | // IE8,9 Will throw exceptions on certain host objects #9897
68 | return false;
69 | }
70 |
71 | // Support: IE<9
72 | // Handle iteration over inherited properties before own properties.
73 | if ( support.ownLast ) {
74 | for ( key in obj ) {
75 | return hasOwn.call( obj, key );
76 | }
77 | }
78 |
79 | // Own properties are enumerated firstly, so to speed up,
80 | // if last one is own, then all properties are own.
81 | for ( key in obj ) {}
82 |
83 | return key === undefined || hasOwn.call( obj, key );
84 | };
85 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-web-meteor",
3 | "version": "0.2.3",
4 | "description": "Meteor Reactivity for your React application",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "rimraf dist && babel index.js -d dist && babel src -d dist/src && babel lib -d dist/lib && cp package.json LICENSE README.md dist",
8 | "test": "mocha --compilers js:babel-core/register --require test/setup --recursive"
9 | },
10 | "dependencies": {
11 | "base-64": "^0.1.0",
12 | "crypto-js": "^3.1.6",
13 | "ejson": "^2.1.2",
14 | "minimongo-cache": "0.0.48",
15 | "react-komposer": "^1.8.0",
16 | "react-mixin": "^3.0.3",
17 | "trackr": "^2.0.2",
18 | "underscore": "^1.8.3",
19 | "wolfy87-eventemitter": "^4.3.0"
20 | },
21 | "devDependencies": {
22 | "babel-cli": "^6.23.0",
23 | "babel-core": "^6.7.2",
24 | "babel-plugin-transform-runtime": "^6.23.0",
25 | "babel-preset-es2015": "^6.6.0",
26 | "babel-preset-react": "^6.5.0",
27 | "babel-preset-stage-0": "^6.5.0",
28 | "chai": "^3.5.0",
29 | "mocha": "^2.4.5",
30 | "mock-socket": "^2.0.0",
31 | "rimraf": "^2.6.1",
32 | "sinon": "^1.17.3"
33 | },
34 | "repository": {
35 | "type": "git",
36 | "url": "git+https://github.com/zevenfang/react-meteor.git"
37 | },
38 | "keywords": [
39 | "react",
40 | "meteor"
41 | ],
42 | "author": "Zeven Fang",
43 | "license": "Apache-2.0",
44 | "bugs": {
45 | "url": "https://github.com/zevenfang/react-meteor/issues"
46 | },
47 | "homepage": "https://github.com/zevenfang/react-meteor#readme"
48 | }
49 |
--------------------------------------------------------------------------------
/src/Call.js:
--------------------------------------------------------------------------------
1 | import Data from './Data';
2 |
3 | export default function(eventName) {
4 | var args = Array.prototype.slice.call(arguments, 1);
5 | if (args.length && typeof args[args.length - 1] === "function") {
6 | var callback = args.pop();
7 | }
8 |
9 |
10 | const id = Data.ddp.method(eventName, args);
11 | Data.calls.push({
12 | id: id,
13 | callback: callback
14 | });
15 | }
--------------------------------------------------------------------------------
/src/Collection.js:
--------------------------------------------------------------------------------
1 | import Tracker from 'trackr';
2 | import EJSON from 'ejson';
3 | import _ from 'underscore';
4 |
5 | import Data from './Data';
6 | import Random from '../lib/Random';
7 | import call from './Call';
8 | import { isPlainObject } from "../lib/utils.js";
9 |
10 | class Cursor {
11 | constructor(collection, docs) {
12 | this._docs = docs || [ ];
13 | this._collection = collection;
14 | }
15 |
16 | count() { return this._docs.length }
17 |
18 | fetch() { return this._transformedDocs() }
19 |
20 | forEach(callback) { this._transformedDocs().forEach(callback) }
21 |
22 | map(callback) { return this._transformedDocs().map(callback) }
23 |
24 | _transformedDocs() {
25 | return this._collection._transform ? this._docs.map(this._collection._transform) : this._docs;
26 | }
27 | }
28 |
29 | export class Collection {
30 | constructor(name, options = { }) {
31 | if (!Data.db[name]) Data.db.addCollection(name);
32 |
33 | this._collection = Data.db[name];
34 | this._cursoredFind = options.cursoredFind;
35 | this._name = name;
36 | this._transform = wrapTransform(options.transform);
37 | }
38 |
39 | find(selector, options) {
40 | let result;
41 | let docs;
42 |
43 | if(typeof selector == 'string') {
44 | if(options) {
45 | docs = this._collection.findOne({_id: selector}, options);
46 | } else {
47 | docs = this._collection.get(selector);
48 | }
49 |
50 | if (docs) docs = [ docs ];
51 | } else {
52 | docs = this._collection.find(selector, options);
53 | }
54 |
55 | if (this._cursoredFind) {
56 | result = new Cursor(this, docs);
57 | } else {
58 | if (docs && this._transform) docs = docs.map(this._transform);
59 |
60 | result = docs;
61 | }
62 |
63 | return result;
64 | }
65 |
66 | findOne(selector, options) {
67 | let result = this.find(selector, options);
68 |
69 | if (result) {
70 | if (this._cursoredFind) result = result.fetch();
71 |
72 | result = result[0];
73 | }
74 |
75 | return result;
76 | }
77 |
78 | insert(item, callback = ()=>{}) {
79 | let id;
80 |
81 | if('_id' in item) {
82 | if(!item._id || typeof item._id != 'string') {
83 | return callback("Meteor requires document _id fields to be non-empty strings");
84 | }
85 | id = item._id;
86 | } else {
87 | id = item._id = Random.id();
88 | }
89 |
90 | if(this._collection.get(id)) return callback({error: 409, reason: `Duplicate key _id with value ${id}`});
91 |
92 | this._collection.upsert(item);
93 | Data.waitDdpConnected(()=>{
94 | call(`/${this._name}/insert`, item, err => {
95 | if(err) {
96 | this._collection.del(id);
97 | return callback(err);
98 | }
99 |
100 | callback(null, id);
101 | });
102 | });
103 |
104 | return id;
105 | }
106 |
107 | update(id, modifier, options={}, callback=()=>{}) {
108 | if(typeof options == 'function') {
109 | callback = options;
110 | options = {};
111 | }
112 |
113 | if(!this._collection.get(id)) return callback({
114 | error: 409,
115 | reason: `Item not found in collection ${this._name} with id ${id}`
116 | });
117 |
118 | Data.waitDdpConnected(()=>{
119 | call(`/${this._name}/update`, {_id: id}, modifier, err => {
120 | if(err) {
121 | return callback(err);
122 | }
123 |
124 | callback(null, id);
125 | });
126 | });
127 | }
128 |
129 | remove(id, callback = ()=>{}) {
130 | const element = this.findOne(id);
131 |
132 | if(element) {
133 | this._collection.del(element._id);
134 |
135 | Data.waitDdpConnected(()=>{
136 | call(`/${this._name}/remove`, {_id: id}, (err, res) => {
137 | if(err) {
138 | this._collection.upsert(element);
139 | return callback(err);
140 | }
141 | callback(null, res);
142 | });
143 | });
144 | } else {
145 | callback(`No document with _id : ${id}`);
146 | }
147 | }
148 |
149 | helpers(helpers) {
150 | var self = this;
151 | let _transform;
152 |
153 | if (this._transform && ! this._helpers)
154 | _transform = this._transform;
155 |
156 | if (! this._helpers) {
157 | this._helpers = function Document(doc) { return _.extend(this, doc); };
158 | this._transform = doc => {
159 | if (_transform) {
160 | doc = _transform(doc);
161 | };
162 | return new this._helpers(doc);
163 | };
164 | }
165 |
166 | _.each(helpers, (helper, key) => {
167 | this._helpers.prototype[key] = helper;
168 | });
169 | }
170 | }
171 |
172 | //From Meteor core
173 |
174 | // Wrap a transform function to return objects that have the _id field
175 | // of the untransformed document. This ensures that subsystems such as
176 | // the observe-sequence package that call `observe` can keep track of
177 | // the documents identities.
178 | //
179 | // - Require that it returns objects
180 | // - If the return value has an _id field, verify that it matches the
181 | // original _id field
182 | // - If the return value doesn't have an _id field, add it back.
183 | function wrapTransform(transform) {
184 | if (! transform)
185 | return null;
186 |
187 | // No need to doubly-wrap transforms.
188 | if (transform.__wrappedTransform__)
189 | return transform;
190 |
191 | var wrapped = function (doc) {
192 | if (!_.has(doc, '_id')) {
193 | // XXX do we ever have a transform on the oplog's collection? because that
194 | // collection has no _id.
195 | throw new Error("can only transform documents with _id");
196 | }
197 |
198 | var id = doc._id;
199 | // XXX consider making tracker a weak dependency and checking Package.tracker here
200 | var transformed = Tracker.nonreactive(function () {
201 | return transform(doc);
202 | });
203 |
204 | if (!isPlainObject(transformed)) {
205 | throw new Error("transform must return object");
206 | }
207 |
208 | if (_.has(transformed, '_id')) {
209 | if (!EJSON.equals(transformed._id, id)) {
210 | throw new Error("transformed document can't have different _id");
211 | }
212 | } else {
213 | transformed._id = id;
214 | }
215 | return transformed;
216 | };
217 | wrapped.__wrappedTransform__ = true;
218 | return wrapped;
219 | };
--------------------------------------------------------------------------------
/src/Data.js:
--------------------------------------------------------------------------------
1 | // import ReactNative from 'react-native';
2 | import minimongo from 'minimongo-cache';
3 | import Trackr from 'trackr';
4 | // import { InteractionManager } from 'react-native';
5 | process.nextTick = setImmediate;
6 |
7 | const db = new minimongo();
8 | db.debug = false;
9 | // db.batchedUpdates = ReactNative.unstable_batchedUpdates;
10 |
11 | function runAfterOtherComputations(fn){
12 | // InteractionManager.runAfterInteractions(() => {
13 | Trackr.afterFlush(() => {
14 | fn();
15 | });
16 | // });
17 | }
18 |
19 | export default {
20 | _endpoint: null,
21 | _options: null,
22 | ddp: null,
23 | subscriptions: {},
24 | db: db,
25 | calls: [],
26 |
27 | getUrl() {
28 | return this._endpoint.substring(0, this._endpoint.indexOf('/websocket'));
29 | },
30 |
31 | waitDdpReady(cb) {
32 | if(this.ddp) {
33 | cb();
34 | } else {
35 | runAfterOtherComputations(()=>{
36 | this.waitDdpReady(cb);
37 | });
38 | }
39 | },
40 |
41 | _cbs: [],
42 | onChange(cb) {
43 | this.db.on('change', cb);
44 | this.ddp.on('connected', cb);
45 | this.ddp.on('disconnected', cb);
46 | this.on('loggingIn', cb);
47 | this.on('change', cb);
48 | },
49 | offChange(cb) {
50 | this.db.off('change', cb);
51 | this.ddp.off('connected', cb);
52 | this.ddp.off('disconnected', cb);
53 | this.off('loggingIn', cb);
54 | this.off('change', cb);
55 | },
56 | on(eventName, cb) {
57 | this._cbs.push({
58 | eventName: eventName,
59 | callback: cb
60 | });
61 | },
62 | off(eventName, cb) {
63 | this._cbs.splice(this._cbs.findIndex(_cb=>_cb.callback == cb && _cb.eventName == eventName), 1);
64 | },
65 | notify(eventName) {
66 | this._cbs.map(cb=>{
67 | if(cb.eventName == eventName && typeof cb.callback == 'function') {
68 | cb.callback();
69 | }
70 | });
71 | },
72 | waitDdpConnected(cb) {
73 | if(this.ddp && this.ddp.status == 'connected') {
74 | cb();
75 | } else if(this.ddp) {
76 | this.ddp.once('connected', cb);
77 | } else {
78 | setTimeout(()=>{ this.waitDdpConnected(cb) }, 10);
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/src/Meteor.js:
--------------------------------------------------------------------------------
1 |
2 | import reactMixin from 'react-mixin';
3 | import Trackr from 'trackr';
4 | import EJSON from 'ejson';
5 | import DDP from '../lib/ddp.js';
6 | import Random from '../lib/Random';
7 |
8 | import Data from './Data';
9 | import { Collection } from './Collection';
10 | import call from './Call';
11 |
12 | import Mixin from './components/Mixin';
13 | import createContainer from './components/createContainer';
14 | import composeWithTracker from './components/composeWithTracker';
15 |
16 | import ReactiveDict from './ReactiveDict';
17 |
18 | import User from './user/User';
19 | import Accounts from './user/Accounts';
20 |
21 |
22 | module.exports = {
23 | composeWithTracker,
24 | Accounts,
25 | Tracker: Trackr,
26 | EJSON,
27 | ReactiveDict,
28 | Collection,
29 | collection(name, options) { return new Collection(name, options) },
30 | createContainer,
31 | getData() {
32 | return Data;
33 | },
34 | connectMeteor(reactClass) {
35 | return reactMixin.onClass(reactClass, Mixin);
36 | },
37 | ...User,
38 | status() {
39 | return {
40 | connected: Data.ddp ? Data.ddp.status=="connected" : false,
41 | status: Data.ddp ? Data.ddp.status : "disconnected"
42 | //retryCount: 0
43 | //retryTime:
44 | //reason:
45 | }
46 | },
47 | call: call,
48 | disconnect() {
49 | if(Data.ddp) {
50 | Data.ddp.disconnect();
51 | }
52 | },
53 | _subscriptionsRestart() {
54 |
55 | for(var i in Data.subscriptions) {
56 | const sub = Data.subscriptions[i];
57 | Data.ddp.unsub(sub.subIdRemember);
58 | sub.subIdRemember = Data.ddp.sub(sub.name, sub.params);
59 | }
60 |
61 | },
62 | waitDdpConnected: Data.waitDdpConnected.bind(Data),
63 | reconnect() {
64 | Data.ddp && Data.ddp.connect();
65 | },
66 | connect(endpoint, options) {
67 | if(!endpoint) endpoint = Data._endpoint;
68 | if(!options) options = Data._options;
69 |
70 | Data._endpoint = endpoint;
71 | Data._options = options;
72 |
73 |
74 | this.ddp = Data.ddp = new DDP({
75 | endpoint: endpoint,
76 | SocketConstructor: WebSocket,
77 | ...options
78 | });
79 |
80 | // NetInfo.isConnected.addEventListener('change', isConnected=>{
81 | // if(isConnected && Data.ddp.autoReconnect) {
82 | // Data.ddp.connect();
83 | // }
84 | // });
85 |
86 | if(Data.ddp.autoReconnect) {
87 | Data.ddp.connect();
88 | }
89 |
90 | Data.ddp.on("connected", ()=>{
91 |
92 | Data.notify('change');
93 |
94 | console.info("Connected to DDP server.");
95 | this._loadInitialUser().then(() => {
96 | this._subscriptionsRestart();
97 | });
98 | });
99 |
100 | let lastDisconnect = null;
101 | Data.ddp.on("disconnected", ()=>{
102 |
103 | Data.notify('change');
104 |
105 | console.info("Disconnected from DDP server.");
106 |
107 | if (!Data.ddp.autoReconnect) return;
108 |
109 | if(!lastDisconnect || new Date() - lastDisconnect > 3000) {
110 | Data.ddp.connect();
111 | }
112 |
113 | lastDisconnect = new Date();
114 |
115 | });
116 |
117 | Data.ddp.on("added", message => {
118 | if(!Data.db[message.collection]) {
119 | Data.db.addCollection(message.collection)
120 | }
121 | Data.db[message.collection].upsert({_id: message.id, ...message.fields});
122 | });
123 |
124 | Data.ddp.on("ready", message => {
125 | const idsMap = new Map();
126 | for(var i in Data.subscriptions) {
127 | const sub = Data.subscriptions[i];
128 | idsMap.set(sub.subIdRemember, sub.id);
129 | }
130 | for(var i in message.subs) {
131 | const subId = idsMap.get(message.subs[i]);
132 | if(subId){
133 | const sub = Data.subscriptions[subId];
134 | sub.ready = true;
135 | sub.readyDeps.changed();
136 | sub.readyCallback && sub.readyCallback();
137 | }
138 | }
139 | });
140 |
141 | Data.ddp.on("changed", message => {
142 | Data.db[message.collection] && Data.db[message.collection].upsert({_id: message.id, ...message.fields});
143 | });
144 |
145 | Data.ddp.on("removed", message => {
146 | Data.db[message.collection] && Data.db[message.collection].del(message.id);
147 | });
148 | Data.ddp.on("result", message => {
149 | const call = Data.calls.find(call=>call.id==message.id);
150 | if(typeof call.callback == 'function') call.callback(message.error, message.result);
151 | Data.calls.splice(Data.calls.findIndex(call=>call.id==message.id), 1);
152 | });
153 |
154 | Data.ddp.on("nosub", message => {
155 | for(var i in Data.subscriptions) {
156 | const sub = Data.subscriptions[i];
157 | if(sub.subIdRemember == message.id) {
158 | console.warn("No subscription existing for", sub.name);
159 | }
160 | }
161 | });
162 |
163 | },
164 | subscribe(name) {
165 | var params = Array.prototype.slice.call(arguments, 1);
166 | var callbacks = {};
167 | if (params.length) {
168 | var lastParam = params[params.length - 1];
169 | if (typeof lastParam == 'function') {
170 | callbacks.onReady = params.pop();
171 | } else if (lastParam && (typeof lastParam.onReady == 'function' || typeof lastParam.onError == 'function' || typeof lastParam.onStop == 'function')) {
172 | callbacks = params.pop();
173 | }
174 | }
175 |
176 | // Is there an existing sub with the same name and param, run in an
177 | // invalidated Computation? This will happen if we are rerunning an
178 | // existing computation.
179 | //
180 | // For example, consider a rerun of:
181 | //
182 | // Tracker.autorun(function () {
183 | // Meteor.subscribe("foo", Session.get("foo"));
184 | // Meteor.subscribe("bar", Session.get("bar"));
185 | // });
186 | //
187 | // If "foo" has changed but "bar" has not, we will match the "bar"
188 | // subcribe to an existing inactive subscription in order to not
189 | // unsub and resub the subscription unnecessarily.
190 | //
191 | // We only look for one such sub; if there are N apparently-identical subs
192 | // being invalidated, we will require N matching subscribe calls to keep
193 | // them all active.
194 |
195 |
196 |
197 | let existing = false;
198 | for(var i in Data.subscriptions) {
199 | const sub = Data.subscriptions[i];
200 | if(sub.inactive && sub.name === name && EJSON.equals(sub.params, params)) existing = sub;
201 | }
202 |
203 | let id;
204 | if (existing) {
205 | id = existing.id;
206 | existing.inactive = false;
207 |
208 | if (callbacks.onReady) {
209 | // If the sub is not already ready, replace any ready callback with the
210 | // one provided now. (It's not really clear what users would expect for
211 | // an onReady callback inside an autorun; the semantics we provide is
212 | // that at the time the sub first becomes ready, we call the last
213 | // onReady callback provided, if any.)
214 | if (!existing.ready)
215 | existing.readyCallback = callbacks.onReady;
216 | }
217 | if (callbacks.onStop) {
218 | existing.stopCallback = callbacks.onStop;
219 | }
220 |
221 | } else {
222 |
223 | // New sub! Generate an id, save it locally, and send message.
224 |
225 | id = Random.id();
226 | const subIdRemember = Data.ddp.sub(name, params);
227 |
228 | Data.subscriptions[id] = {
229 | id: id,
230 | subIdRemember: subIdRemember,
231 | name: name,
232 | params: EJSON.clone(params),
233 | inactive: false,
234 | ready: false,
235 | readyDeps: new Trackr.Dependency,
236 | readyCallback: callbacks.onReady,
237 | stopCallback: callbacks.onStop,
238 | stop: function() {
239 | Data.ddp.unsub(this.subIdRemember);
240 | delete Data.subscriptions[this.id];
241 | this.ready && this.readyDeps.changed();
242 |
243 | if (callbacks.onStop) {
244 | callbacks.onStop();
245 | }
246 | }
247 | };
248 |
249 | }
250 |
251 |
252 | // return a handle to the application.
253 | var handle = {
254 | stop: function () {
255 | if(Data.subscriptions[id])
256 | Data.subscriptions[id].stop();
257 | },
258 | ready: function () {
259 | if (!Data.subscriptions[id]) return false;
260 |
261 | var record = Data.subscriptions[id];
262 | record.readyDeps.depend();
263 | return record.ready;
264 | },
265 | subscriptionId: id
266 | };
267 |
268 | if (Trackr.active) {
269 | // We're in a reactive computation, so we'd like to unsubscribe when the
270 | // computation is invalidated... but not if the rerun just re-subscribes
271 | // to the same subscription! When a rerun happens, we use onInvalidate
272 | // as a change to mark the subscription "inactive" so that it can
273 | // be reused from the rerun. If it isn't reused, it's killed from
274 | // an afterFlush.
275 | Trackr.onInvalidate(function (c) {
276 | if(Data.subscriptions[id]) {
277 | Data.subscriptions[id].inactive = true;
278 | }
279 |
280 | Trackr.afterFlush(function () {
281 | if (Data.subscriptions[id] && Data.subscriptions[id].inactive) {
282 | handle.stop();
283 | }
284 | });
285 | });
286 | }
287 |
288 | return handle;
289 |
290 | }
291 | }
292 |
--------------------------------------------------------------------------------
/src/ReactiveDict.js:
--------------------------------------------------------------------------------
1 | import EJSON from 'ejson';
2 |
3 | import Data from './Data';
4 |
5 | const stringify = function (value) {
6 | if (value === undefined)
7 | return 'undefined';
8 | return EJSON.stringify(value);
9 | };
10 |
11 | const parse = function (serialized) {
12 | if (serialized === undefined || serialized === 'undefined')
13 | return undefined;
14 | return EJSON.parse(serialized);
15 | };
16 |
17 | export default class ReactiveDict {
18 | constructor(dictName) {
19 | this.keys = {};
20 | if (typeof dictName === 'object') {
21 | for(var i in dictName) {
22 | this.keys[i] = stringify(dictName[i])
23 | }
24 | }
25 | }
26 | set(keyOrObject, value) {
27 | if ((typeof keyOrObject === 'object') && (value === undefined)) {
28 | this._setObject(keyOrObject);
29 | return;
30 | }
31 | // the input isn't an object, so it must be a key
32 | // and we resume with the rest of the function
33 | const key = keyOrObject;
34 |
35 | value = stringify(value);
36 |
37 | let oldSerializedValue = 'undefined';
38 | if(Object.keys(this.keys).indexOf(key) != -1) {
39 | oldSerializedValue = this.keys[key];
40 | }
41 | if (value === oldSerializedValue)
42 | return;
43 |
44 | this.keys[key] = value;
45 |
46 | Data.notify('change');
47 | }
48 | setDefault(key, value) {
49 | // for now, explicitly check for undefined, since there is no
50 | // ReactiveDict.clear(). Later we might have a ReactiveDict.clear(), in which case
51 | // we should check if it has the key.
52 | if (this.keys[key] === undefined) {
53 | this.set(key, value);
54 | }
55 | }
56 | get(key) {
57 | return parse(this.keys[key]);
58 | }
59 | equals(key, value) {
60 | // We don't allow objects (or arrays that might include objects) for
61 | // .equals, because JSON.stringify doesn't canonicalize object key
62 | // order. (We can make equals have the right return value by parsing the
63 | // current value and using EJSON.equals, but we won't have a canonical
64 | // element of keyValueDeps[key] to store the dependency.) You can still use
65 | // "EJSON.equals(reactiveDict.get(key), value)".
66 | //
67 | // XXX we could allow arrays as long as we recursively check that there
68 | // are no objects
69 | if (typeof value !== 'string' &&
70 | typeof value !== 'number' &&
71 | typeof value !== 'boolean' &&
72 | typeof value !== 'undefined' &&
73 | !(value instanceof Date) &&
74 | !(ObjectID && value instanceof ObjectID) &&
75 | value !== null)
76 | throw new Error("ReactiveDict.equals: value must be scalar");
77 |
78 | const serializedValue = stringify(value);
79 |
80 | let oldValue = undefined;
81 | if(Object.keys(this.keys).indexOf(key) != -1) {
82 | oldValue = parse(this.keys[key])
83 | }
84 | return EJSON.equals(oldValue, value);
85 | }
86 | _setObject(object) {
87 |
88 | const keys = Object.keys(object);
89 |
90 | for(let i in keys) {
91 | this.set(i, keys[i]);
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/src/components/Mixin.js:
--------------------------------------------------------------------------------
1 | import Trackr from 'trackr';
2 | import EJSON from 'ejson';
3 | import Data from '../Data';
4 |
5 | export default {
6 | componentWillMount() {
7 |
8 | Data.waitDdpReady(()=>{
9 | if(this.getMeteorData) {
10 | this.data = {};
11 | this._meteorDataManager = new MeteorDataManager(this);
12 | const newData = this._meteorDataManager.calculateData();
13 | this._meteorDataManager.updateData(newData);
14 | }
15 | });
16 |
17 |
18 | },
19 | componentWillUpdate(nextProps, nextState) {
20 |
21 | if(this.startMeteorSubscriptions) {
22 | if(!EJSON.equals(this.state, nextState) || !EJSON.equals(this.props, nextProps)) {
23 | this._meteorSubscriptionsManager._meteorDataChangedCallback()
24 | }
25 | }
26 |
27 | if(this.getMeteorData) {
28 | const saveProps = this.props;
29 | const saveState = this.state;
30 | let newData;
31 | try {
32 | // Temporarily assign this.state and this.props,
33 | // so that they are seen by getMeteorData!
34 | // This is a simulation of how the proposed Observe API
35 | // for React will work, which calls observe() after
36 | // componentWillUpdate and after props and state are
37 | // updated, but before render() is called.
38 | // See https://github.com/facebook/react/issues/3398.
39 | this.props = nextProps;
40 | this.state = nextState;
41 | newData = this._meteorDataManager.calculateData();
42 | } finally {
43 | this.props = saveProps;
44 | this.state = saveState;
45 | }
46 |
47 | this._meteorDataManager.updateData(newData);
48 | }
49 |
50 | },
51 | componentWillUnmount() {
52 | if(this._meteorDataManager) {
53 | this._meteorDataManager.dispose();
54 | }
55 |
56 | if(this._meteorSubscriptionsManager) {
57 | this._meteorSubscriptionsManager.dispose();
58 | }
59 |
60 | }
61 | };
62 |
63 |
64 | // A class to keep the state and utility methods needed to manage
65 | // the Meteor data for a component.
66 | class MeteorDataManager {
67 | constructor(component) {
68 | this.component = component;
69 | this.computation = null;
70 | this.oldData = null;
71 | this._meteorDataDep = new Trackr.Dependency();
72 |
73 | this._meteorDataChangedCallback = ()=>{this._meteorDataDep.changed()};
74 |
75 | Data.onChange(this._meteorDataChangedCallback);
76 | }
77 |
78 | dispose() {
79 | if (this.computation) {
80 | this.computation.stop();
81 | this.computation = null;
82 | }
83 |
84 | Data.offChange(this._meteorDataChangedCallback);
85 | }
86 |
87 | calculateData() {
88 | const component = this.component;
89 |
90 | if (!component.getMeteorData) {
91 | return null;
92 | }
93 |
94 | if (this.computation) {
95 | this.computation.stop();
96 | this.computation = null;
97 | }
98 |
99 | let data;
100 | // Use Tracker.nonreactive in case we are inside a Tracker Computation.
101 | // This can happen if someone calls `ReactDOM.render` inside a Computation.
102 | // In that case, we want to opt out of the normal behavior of nested
103 | // Computations, where if the outer one is invalidated or stopped,
104 | // it stops the inner one.
105 |
106 | this.computation = Trackr.nonreactive(() => {
107 | return Trackr.autorun((c) => {
108 | this._meteorDataDep.depend();
109 | if (c.firstRun) {
110 | const savedSetState = component.setState;
111 | try {
112 | component.setState = () => {
113 | throw new Error(
114 | "Can't call `setState` inside `getMeteorData` as this could cause an endless" +
115 | " loop. To respond to Meteor data changing, consider making this component" +
116 | " a \"wrapper component\" that only fetches data and passes it in as props to" +
117 | " a child component. Then you can use `componentWillReceiveProps` in that" +
118 | " child component.");
119 | };
120 |
121 | data = component.getMeteorData();
122 | } finally {
123 | component.setState = savedSetState;
124 | }
125 |
126 |
127 | } else {
128 | // Stop this computation instead of using the re-run.
129 | // We use a brand-new autorun for each call to getMeteorData
130 | // to capture dependencies on any reactive data sources that
131 | // are accessed. The reason we can't use a single autorun
132 | // for the lifetime of the component is that Tracker only
133 | // re-runs autoruns at flush time, while we need to be able to
134 | // re-call getMeteorData synchronously whenever we want, e.g.
135 | // from componentWillUpdate.
136 | c.stop();
137 | // Calling forceUpdate() triggers componentWillUpdate which
138 | // recalculates getMeteorData() and re-renders the component.
139 | try {
140 | component.forceUpdate();
141 | } catch(e) {
142 | console.error(e);
143 | }
144 |
145 | }
146 | });
147 | });
148 |
149 | return data;
150 | }
151 |
152 | updateData(newData) {
153 | const component = this.component;
154 | const oldData = this.oldData;
155 |
156 | if (! (newData && (typeof newData) === 'object')) {
157 | throw new Error("Expected object returned from getMeteorData");
158 | }
159 | // update componentData in place based on newData
160 | for (let key in newData) {
161 | component.data[key] = newData[key];
162 | }
163 | // if there is oldData (which is every time this method is called
164 | // except the first), delete keys in newData that aren't in
165 | // oldData. don't interfere with other keys, in case we are
166 | // co-existing with something else that writes to a component's
167 | // this.data.
168 | if (oldData) {
169 | for (let key in oldData) {
170 | if (!(key in newData)) {
171 | delete component.data[key];
172 | }
173 | }
174 | }
175 | this.oldData = newData;
176 | }
177 | }
178 |
179 |
--------------------------------------------------------------------------------
/src/components/composeWithTracker.js:
--------------------------------------------------------------------------------
1 | import Trackr from 'trackr';
2 | import { compose } from 'react-komposer';
3 |
4 | import Data from '../Data';
5 |
6 | export default function(reactiveFn, L, E, options) {
7 | const onPropsChange = (props, onData) => {
8 | let trackerCleanup;
9 |
10 | const _meteorDataDep = new Trackr.Dependency();
11 | const _meteorDataChangedCallback = ()=>{_meteorDataDep.changed()};
12 |
13 | Data.onChange(_meteorDataChangedCallback);
14 |
15 | const handler = Trackr.nonreactive(() => {
16 | return Trackr.autorun(() => {
17 | _meteorDataDep.depend();
18 | trackerCleanup = reactiveFn(props, onData);
19 | });
20 | });
21 |
22 | return () => {
23 | if (typeof (trackerCleanup) === 'function') {
24 | trackerCleanup();
25 | }
26 | Data.offChange(_meteorDataChangedCallback);
27 | return handler.stop();
28 | };
29 | };
30 |
31 | return compose(onPropsChange, L, E, options);
32 | }
--------------------------------------------------------------------------------
/src/components/createContainer.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Container helper using react-meteor-data.
3 | */
4 |
5 | import React from 'react';
6 |
7 | import Mixin from './Mixin';
8 |
9 | export default function createContainer(options = {}, Component) {
10 | let expandedOptions = options;
11 | if (typeof options === 'function') {
12 | expandedOptions = {
13 | getMeteorData: options,
14 | };
15 | }
16 |
17 | const {
18 | getMeteorData
19 | } = expandedOptions;
20 |
21 | return React.createClass({
22 | displayName: 'MeteorDataContainer',
23 | mixins: [Mixin],
24 | getMeteorData() {
25 | return getMeteorData(this.props);
26 | },
27 | render() {
28 | return ;
29 | },
30 | });
31 | }
32 |
--------------------------------------------------------------------------------
/src/user/Accounts.js:
--------------------------------------------------------------------------------
1 | import Data from '../Data';
2 | import call from '../Call';
3 | import User from './User';
4 | import { hashPassword } from '../../lib/utils';
5 |
6 |
7 | module.exports = {
8 | createUser(options, callback = ()=>{}) {
9 | if (options.username) options.username = options.username;
10 | if (options.email) options.email = options.email;
11 |
12 | // Replace password with the hashed password.
13 | options.password = hashPassword(options.password);
14 |
15 | User._startLoggingIn();
16 | call("createUser", options, (err, result)=>{
17 | User._endLoggingIn();
18 |
19 | User._handleLoginCallback(err, result);
20 |
21 | callback(err);
22 | });
23 | },
24 | changePassword(oldPassword, newPassword, callback = ()=>{}) {
25 |
26 | //TODO check Meteor.user() to prevent if not logged
27 |
28 | if(typeof newPassword != 'string' || !newPassword) {
29 | return callback("Password may not be empty");
30 | }
31 |
32 | call("changePassword",
33 | oldPassword ? hashPassword(oldPassword) : null,
34 | hashPassword(newPassword),
35 | (err, res) => {
36 |
37 | callback(err);
38 | });
39 | },
40 | forgotPassword(options, callback = ()=>{}) {
41 | if (!options.email) {
42 | return callback("Must pass options.email");
43 | }
44 |
45 | call("forgotPassword", options, err => {
46 | callback(err);
47 | });
48 | },
49 | resetPassword(token, newPassword, callback = ()=>{}) {
50 | if (!newPassword) {
51 | return callback("Must pass a new password");
52 | }
53 |
54 | call("resetPassword", token, hashPassword(newPassword), (err, result) => {
55 | if (!err) {
56 | User._loginWithToken(result.token);
57 | }
58 |
59 | callback(err);
60 | });
61 | },
62 | onLogin(cb) {
63 | Data.on('onLogin', cb);
64 | },
65 | onLoginFailure(cb) {
66 | Data.on('onLoginFailure', cb);
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/src/user/User.js:
--------------------------------------------------------------------------------
1 | // import { AsyncStorage } from 'react-native';
2 |
3 | import Data from '../Data';
4 | import { hashPassword } from '../../lib/utils';
5 | import call from '../Call';
6 |
7 | const TOKEN_KEY = 'reactnativemeteor_usertoken';
8 |
9 | module.exports = {
10 | user() {
11 | if(!this._userIdSaved) return null;
12 |
13 | return this.collection('users').findOne(this._userIdSaved);
14 | },
15 | userId() {
16 | if(!this._userIdSaved) return null;
17 |
18 | const user = this.collection('users').findOne(this._userIdSaved);
19 | return user && user._id;
20 | },
21 | _isLoggingIn: true,
22 | loggingIn() {
23 | return this._isLoggingIn;
24 | },
25 | logout(callback) {
26 | call("logout", err => {
27 | this.handleLogout();
28 | this.connect();
29 |
30 | typeof callback == 'function' && callback(err);
31 | });
32 | },
33 | handleLogout() {
34 | localStorage.removeItem(TOKEN_KEY);
35 | Data._tokenIdSaved = null;
36 | this._userIdSaved = null;
37 | },
38 | loginWithPassword(selector, password, callback) {
39 | if (typeof selector === 'string') {
40 | if (selector.indexOf('@') === -1)
41 | selector = {username: selector};
42 | else
43 | selector = {email: selector};
44 | }
45 |
46 | this._startLoggingIn();
47 | call("login", {
48 | user: selector,
49 | password: hashPassword(password)
50 | }, (err, result)=>{
51 | this._endLoggingIn();
52 |
53 | this._handleLoginCallback(err, result);
54 |
55 | typeof callback == 'function' && callback(err);
56 | });
57 | },
58 | logoutOtherClients(callback = ()=>{}) {
59 | call('getNewToken', (err, res) => {
60 | if(err) return callback(err);
61 |
62 | this._handleLoginCallback(err, res);
63 |
64 | call('removeOtherTokens', err=>{
65 | callback(err);
66 | })
67 | });
68 | },
69 | _login(user, callback) {
70 | this._startLoggingIn();
71 | this.call("login", user, (err, result)=>{
72 | this._endLoggingIn();
73 |
74 | this._handleLoginCallback(err, result);
75 |
76 | typeof callback == 'function' && callback(err);
77 | });
78 | },
79 | _startLoggingIn() {
80 | this._isLoggingIn = true;
81 | Data.notify('loggingIn');
82 | },
83 | _endLoggingIn() {
84 | this._isLoggingIn = false;
85 | Data.notify('loggingIn');
86 | },
87 | _handleLoginCallback(err, result) {
88 | if(!err) {//save user id and token
89 | localStorage.setItem(TOKEN_KEY, result.token);
90 | Data._tokenIdSaved = result.token;
91 | this._userIdSaved = result.id;
92 | Data.notify('onLogin');
93 | } else {
94 | Data.notify('onLoginFailure');
95 | this.handleLogout();
96 | }
97 | Data.notify('change');
98 | },
99 | _loginWithToken(value) {
100 | Data._tokenIdSaved = value;
101 | if (value !== null){
102 | this._startLoggingIn();
103 | call('login', { resume: value }, (err, result) => {
104 | this._endLoggingIn();
105 | this._handleLoginCallback(err, result);
106 | });
107 | } else {
108 | this._endLoggingIn();
109 | }
110 | },
111 | getAuthToken() {
112 | return Data._tokenIdSaved;
113 | },
114 | async _loadInitialUser() {
115 | var value = null;
116 | try {
117 | value = localStorage.getItem(TOKEN_KEY);
118 | } catch (error) {
119 | console.warn('localStorage error: ' + error.message);
120 | } finally {
121 | this._loginWithToken(value);
122 | }
123 |
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/test/lib/ddpShould.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | import DDP from '../../lib/ddp';
3 |
4 | describe('ddp', function() {
5 |
6 | let validOptions;
7 | const endpoint = 'ws://localhost:3000/websocket';
8 | let server;
9 |
10 | before(function() {
11 | server = new SocketServer(endpoint);
12 | });
13 |
14 | beforeEach(function() {
15 | validOptions = {
16 | SocketConstructor: WebSocket,
17 | endpoint
18 | };
19 | });
20 |
21 | it('should throw an error if not passed a socketConstructor', function() {
22 | (function() {
23 | let ddp = new DDP({});
24 | }).should.throw(Error);
25 | });
26 |
27 | it('should throw an error given no endpoint', function() {
28 | (function() {
29 | let ddp = new DDP({
30 | SocketConstructor: WebSocket
31 | });
32 | }).should.throw(Error);
33 | });
34 |
35 | it('should start in the disconnected state', function() {
36 | let ddp = new DDP(validOptions);
37 | ddp.status.should.equal('disconnected');
38 | });
39 |
40 | it('should start with autoreconnect true given no autoReconnect parameter', function() {
41 | let ddp = new DDP(validOptions);
42 | ddp.autoReconnect.should.equal(true);
43 | });
44 |
45 | it('should start with autoreconnect false given autoReconnect parameter set to false', function() {
46 | validOptions.autoReconnect = false;
47 | let ddp = new DDP(validOptions);
48 | ddp.autoReconnect.should.equal(false);
49 | });
50 |
51 | it('should start with autoconnect true given no autoConnect parameter', function() {
52 | let ddp = new DDP(validOptions);
53 | ddp.autoConnect.should.equal(true);
54 | });
55 |
56 | it('should start with autoconnect false given autoReconnect parameter set to false', function() {
57 | validOptions.autoConnect = false;
58 | let ddp = new DDP(validOptions);
59 | ddp.autoConnect.should.equal(false);
60 | });
61 |
62 |
63 |
64 | });
65 |
--------------------------------------------------------------------------------
/test/setup.js:
--------------------------------------------------------------------------------
1 | var sinon = require('sinon');
2 | var chai = require('chai');
3 | var should = chai.should();
4 | var mockWebSocket = require('mock-socket').WebSocket;
5 | var mockServer = require('mock-socket').Server;
6 |
7 | global.sinon = sinon;
8 | global.should = should;
9 | global.WebSocket = mockWebSocket;
10 | global.SocketServer = mockServer;
11 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | abbrev@1:
6 | version "1.1.0"
7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
8 |
9 | ajv@^4.9.1:
10 | version "4.11.5"
11 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd"
12 | dependencies:
13 | co "^4.6.0"
14 | json-stable-stringify "^1.0.1"
15 |
16 | ansi-regex@^2.0.0:
17 | version "2.1.1"
18 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
19 |
20 | ansi-styles@^2.2.1:
21 | version "2.2.1"
22 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
23 |
24 | anymatch@^1.3.0:
25 | version "1.3.0"
26 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
27 | dependencies:
28 | arrify "^1.0.0"
29 | micromatch "^2.1.5"
30 |
31 | aproba@^1.0.3:
32 | version "1.1.1"
33 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab"
34 |
35 | are-we-there-yet@~1.1.2:
36 | version "1.1.2"
37 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3"
38 | dependencies:
39 | delegates "^1.0.0"
40 | readable-stream "^2.0.0 || ^1.1.13"
41 |
42 | arr-diff@^2.0.0:
43 | version "2.0.0"
44 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
45 | dependencies:
46 | arr-flatten "^1.0.1"
47 |
48 | arr-flatten@^1.0.1:
49 | version "1.0.1"
50 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b"
51 |
52 | array-unique@^0.2.1:
53 | version "0.2.1"
54 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
55 |
56 | arrify@^1.0.0:
57 | version "1.0.1"
58 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
59 |
60 | asn1@~0.2.3:
61 | version "0.2.3"
62 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
63 |
64 | assert-plus@^0.2.0:
65 | version "0.2.0"
66 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
67 |
68 | assert-plus@^1.0.0:
69 | version "1.0.0"
70 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
71 |
72 | assertion-error@^1.0.1:
73 | version "1.0.2"
74 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c"
75 |
76 | async-each@^1.0.0:
77 | version "1.0.1"
78 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
79 |
80 | asynckit@^0.4.0:
81 | version "0.4.0"
82 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
83 |
84 | aws-sign2@~0.6.0:
85 | version "0.6.0"
86 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
87 |
88 | aws4@^1.2.1:
89 | version "1.6.0"
90 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
91 |
92 | babel-cli@^6.23.0:
93 | version "6.24.0"
94 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.0.tgz#a05ffd210dca0c288a26d5319c5ac8669a265ad0"
95 | dependencies:
96 | babel-core "^6.24.0"
97 | babel-polyfill "^6.23.0"
98 | babel-register "^6.24.0"
99 | babel-runtime "^6.22.0"
100 | commander "^2.8.1"
101 | convert-source-map "^1.1.0"
102 | fs-readdir-recursive "^1.0.0"
103 | glob "^7.0.0"
104 | lodash "^4.2.0"
105 | output-file-sync "^1.1.0"
106 | path-is-absolute "^1.0.0"
107 | slash "^1.0.0"
108 | source-map "^0.5.0"
109 | v8flags "^2.0.10"
110 | optionalDependencies:
111 | chokidar "^1.6.1"
112 |
113 | babel-code-frame@^6.22.0:
114 | version "6.22.0"
115 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
116 | dependencies:
117 | chalk "^1.1.0"
118 | esutils "^2.0.2"
119 | js-tokens "^3.0.0"
120 |
121 | babel-core@^6.24.0, babel-core@^6.7.2:
122 | version "6.24.0"
123 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.0.tgz#8f36a0a77f5c155aed6f920b844d23ba56742a02"
124 | dependencies:
125 | babel-code-frame "^6.22.0"
126 | babel-generator "^6.24.0"
127 | babel-helpers "^6.23.0"
128 | babel-messages "^6.23.0"
129 | babel-register "^6.24.0"
130 | babel-runtime "^6.22.0"
131 | babel-template "^6.23.0"
132 | babel-traverse "^6.23.1"
133 | babel-types "^6.23.0"
134 | babylon "^6.11.0"
135 | convert-source-map "^1.1.0"
136 | debug "^2.1.1"
137 | json5 "^0.5.0"
138 | lodash "^4.2.0"
139 | minimatch "^3.0.2"
140 | path-is-absolute "^1.0.0"
141 | private "^0.1.6"
142 | slash "^1.0.0"
143 | source-map "^0.5.0"
144 |
145 | babel-generator@^6.24.0:
146 | version "6.24.0"
147 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56"
148 | dependencies:
149 | babel-messages "^6.23.0"
150 | babel-runtime "^6.22.0"
151 | babel-types "^6.23.0"
152 | detect-indent "^4.0.0"
153 | jsesc "^1.3.0"
154 | lodash "^4.2.0"
155 | source-map "^0.5.0"
156 | trim-right "^1.0.1"
157 |
158 | babel-helper-bindify-decorators@^6.22.0:
159 | version "6.22.0"
160 | resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.22.0.tgz#d7f5bc261275941ac62acfc4e20dacfb8a3fe952"
161 | dependencies:
162 | babel-runtime "^6.22.0"
163 | babel-traverse "^6.22.0"
164 | babel-types "^6.22.0"
165 |
166 | babel-helper-builder-binary-assignment-operator-visitor@^6.22.0:
167 | version "6.22.0"
168 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz#29df56be144d81bdeac08262bfa41d2c5e91cdcd"
169 | dependencies:
170 | babel-helper-explode-assignable-expression "^6.22.0"
171 | babel-runtime "^6.22.0"
172 | babel-types "^6.22.0"
173 |
174 | babel-helper-builder-react-jsx@^6.23.0:
175 | version "6.23.0"
176 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.23.0.tgz#d53fc8c996e0bc56d0de0fc4cc55a7138395ea4b"
177 | dependencies:
178 | babel-runtime "^6.22.0"
179 | babel-types "^6.23.0"
180 | esutils "^2.0.0"
181 | lodash "^4.2.0"
182 |
183 | babel-helper-call-delegate@^6.22.0:
184 | version "6.22.0"
185 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef"
186 | dependencies:
187 | babel-helper-hoist-variables "^6.22.0"
188 | babel-runtime "^6.22.0"
189 | babel-traverse "^6.22.0"
190 | babel-types "^6.22.0"
191 |
192 | babel-helper-define-map@^6.23.0:
193 | version "6.23.0"
194 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7"
195 | dependencies:
196 | babel-helper-function-name "^6.23.0"
197 | babel-runtime "^6.22.0"
198 | babel-types "^6.23.0"
199 | lodash "^4.2.0"
200 |
201 | babel-helper-explode-assignable-expression@^6.22.0:
202 | version "6.22.0"
203 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.22.0.tgz#c97bf76eed3e0bae4048121f2b9dae1a4e7d0478"
204 | dependencies:
205 | babel-runtime "^6.22.0"
206 | babel-traverse "^6.22.0"
207 | babel-types "^6.22.0"
208 |
209 | babel-helper-explode-class@^6.22.0:
210 | version "6.22.0"
211 | resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.22.0.tgz#646304924aa6388a516843ba7f1855ef8dfeb69b"
212 | dependencies:
213 | babel-helper-bindify-decorators "^6.22.0"
214 | babel-runtime "^6.22.0"
215 | babel-traverse "^6.22.0"
216 | babel-types "^6.22.0"
217 |
218 | babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0:
219 | version "6.23.0"
220 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6"
221 | dependencies:
222 | babel-helper-get-function-arity "^6.22.0"
223 | babel-runtime "^6.22.0"
224 | babel-template "^6.23.0"
225 | babel-traverse "^6.23.0"
226 | babel-types "^6.23.0"
227 |
228 | babel-helper-get-function-arity@^6.22.0:
229 | version "6.22.0"
230 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce"
231 | dependencies:
232 | babel-runtime "^6.22.0"
233 | babel-types "^6.22.0"
234 |
235 | babel-helper-hoist-variables@^6.22.0:
236 | version "6.22.0"
237 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72"
238 | dependencies:
239 | babel-runtime "^6.22.0"
240 | babel-types "^6.22.0"
241 |
242 | babel-helper-optimise-call-expression@^6.23.0:
243 | version "6.23.0"
244 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5"
245 | dependencies:
246 | babel-runtime "^6.22.0"
247 | babel-types "^6.23.0"
248 |
249 | babel-helper-regex@^6.22.0:
250 | version "6.22.0"
251 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d"
252 | dependencies:
253 | babel-runtime "^6.22.0"
254 | babel-types "^6.22.0"
255 | lodash "^4.2.0"
256 |
257 | babel-helper-remap-async-to-generator@^6.22.0:
258 | version "6.22.0"
259 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.22.0.tgz#2186ae73278ed03b8b15ced089609da981053383"
260 | dependencies:
261 | babel-helper-function-name "^6.22.0"
262 | babel-runtime "^6.22.0"
263 | babel-template "^6.22.0"
264 | babel-traverse "^6.22.0"
265 | babel-types "^6.22.0"
266 |
267 | babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0:
268 | version "6.23.0"
269 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd"
270 | dependencies:
271 | babel-helper-optimise-call-expression "^6.23.0"
272 | babel-messages "^6.23.0"
273 | babel-runtime "^6.22.0"
274 | babel-template "^6.23.0"
275 | babel-traverse "^6.23.0"
276 | babel-types "^6.23.0"
277 |
278 | babel-helpers@^6.23.0:
279 | version "6.23.0"
280 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992"
281 | dependencies:
282 | babel-runtime "^6.22.0"
283 | babel-template "^6.23.0"
284 |
285 | babel-messages@^6.23.0:
286 | version "6.23.0"
287 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
288 | dependencies:
289 | babel-runtime "^6.22.0"
290 |
291 | babel-plugin-check-es2015-constants@^6.22.0:
292 | version "6.22.0"
293 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
294 | dependencies:
295 | babel-runtime "^6.22.0"
296 |
297 | babel-plugin-syntax-async-functions@^6.8.0:
298 | version "6.13.0"
299 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
300 |
301 | babel-plugin-syntax-async-generators@^6.5.0:
302 | version "6.13.0"
303 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
304 |
305 | babel-plugin-syntax-class-constructor-call@^6.18.0:
306 | version "6.18.0"
307 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
308 |
309 | babel-plugin-syntax-class-properties@^6.8.0:
310 | version "6.13.0"
311 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
312 |
313 | babel-plugin-syntax-decorators@^6.13.0:
314 | version "6.13.0"
315 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
316 |
317 | babel-plugin-syntax-do-expressions@^6.8.0:
318 | version "6.13.0"
319 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
320 |
321 | babel-plugin-syntax-dynamic-import@^6.18.0:
322 | version "6.18.0"
323 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
324 |
325 | babel-plugin-syntax-exponentiation-operator@^6.8.0:
326 | version "6.13.0"
327 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
328 |
329 | babel-plugin-syntax-export-extensions@^6.8.0:
330 | version "6.13.0"
331 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
332 |
333 | babel-plugin-syntax-flow@^6.18.0:
334 | version "6.18.0"
335 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
336 |
337 | babel-plugin-syntax-function-bind@^6.8.0:
338 | version "6.13.0"
339 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46"
340 |
341 | babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
342 | version "6.18.0"
343 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
344 |
345 | babel-plugin-syntax-object-rest-spread@^6.8.0:
346 | version "6.13.0"
347 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
348 |
349 | babel-plugin-syntax-trailing-function-commas@^6.22.0:
350 | version "6.22.0"
351 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
352 |
353 | babel-plugin-transform-async-generator-functions@^6.22.0:
354 | version "6.22.0"
355 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.22.0.tgz#a720a98153a7596f204099cd5409f4b3c05bab46"
356 | dependencies:
357 | babel-helper-remap-async-to-generator "^6.22.0"
358 | babel-plugin-syntax-async-generators "^6.5.0"
359 | babel-runtime "^6.22.0"
360 |
361 | babel-plugin-transform-async-to-generator@^6.22.0:
362 | version "6.22.0"
363 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.22.0.tgz#194b6938ec195ad36efc4c33a971acf00d8cd35e"
364 | dependencies:
365 | babel-helper-remap-async-to-generator "^6.22.0"
366 | babel-plugin-syntax-async-functions "^6.8.0"
367 | babel-runtime "^6.22.0"
368 |
369 | babel-plugin-transform-class-constructor-call@^6.22.0:
370 | version "6.22.0"
371 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.22.0.tgz#11a4d2216abb5b0eef298b493748f4f2f4869120"
372 | dependencies:
373 | babel-plugin-syntax-class-constructor-call "^6.18.0"
374 | babel-runtime "^6.22.0"
375 | babel-template "^6.22.0"
376 |
377 | babel-plugin-transform-class-properties@^6.22.0:
378 | version "6.23.0"
379 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.23.0.tgz#187b747ee404399013563c993db038f34754ac3b"
380 | dependencies:
381 | babel-helper-function-name "^6.23.0"
382 | babel-plugin-syntax-class-properties "^6.8.0"
383 | babel-runtime "^6.22.0"
384 | babel-template "^6.23.0"
385 |
386 | babel-plugin-transform-decorators@^6.22.0:
387 | version "6.22.0"
388 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.22.0.tgz#c03635b27a23b23b7224f49232c237a73988d27c"
389 | dependencies:
390 | babel-helper-explode-class "^6.22.0"
391 | babel-plugin-syntax-decorators "^6.13.0"
392 | babel-runtime "^6.22.0"
393 | babel-template "^6.22.0"
394 | babel-types "^6.22.0"
395 |
396 | babel-plugin-transform-do-expressions@^6.22.0:
397 | version "6.22.0"
398 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb"
399 | dependencies:
400 | babel-plugin-syntax-do-expressions "^6.8.0"
401 | babel-runtime "^6.22.0"
402 |
403 | babel-plugin-transform-es2015-arrow-functions@^6.22.0:
404 | version "6.22.0"
405 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
406 | dependencies:
407 | babel-runtime "^6.22.0"
408 |
409 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
410 | version "6.22.0"
411 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
412 | dependencies:
413 | babel-runtime "^6.22.0"
414 |
415 | babel-plugin-transform-es2015-block-scoping@^6.22.0:
416 | version "6.23.0"
417 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51"
418 | dependencies:
419 | babel-runtime "^6.22.0"
420 | babel-template "^6.23.0"
421 | babel-traverse "^6.23.0"
422 | babel-types "^6.23.0"
423 | lodash "^4.2.0"
424 |
425 | babel-plugin-transform-es2015-classes@^6.22.0:
426 | version "6.23.0"
427 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1"
428 | dependencies:
429 | babel-helper-define-map "^6.23.0"
430 | babel-helper-function-name "^6.23.0"
431 | babel-helper-optimise-call-expression "^6.23.0"
432 | babel-helper-replace-supers "^6.23.0"
433 | babel-messages "^6.23.0"
434 | babel-runtime "^6.22.0"
435 | babel-template "^6.23.0"
436 | babel-traverse "^6.23.0"
437 | babel-types "^6.23.0"
438 |
439 | babel-plugin-transform-es2015-computed-properties@^6.22.0:
440 | version "6.22.0"
441 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7"
442 | dependencies:
443 | babel-runtime "^6.22.0"
444 | babel-template "^6.22.0"
445 |
446 | babel-plugin-transform-es2015-destructuring@^6.22.0:
447 | version "6.23.0"
448 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
449 | dependencies:
450 | babel-runtime "^6.22.0"
451 |
452 | babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
453 | version "6.22.0"
454 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b"
455 | dependencies:
456 | babel-runtime "^6.22.0"
457 | babel-types "^6.22.0"
458 |
459 | babel-plugin-transform-es2015-for-of@^6.22.0:
460 | version "6.23.0"
461 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
462 | dependencies:
463 | babel-runtime "^6.22.0"
464 |
465 | babel-plugin-transform-es2015-function-name@^6.22.0:
466 | version "6.22.0"
467 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104"
468 | dependencies:
469 | babel-helper-function-name "^6.22.0"
470 | babel-runtime "^6.22.0"
471 | babel-types "^6.22.0"
472 |
473 | babel-plugin-transform-es2015-literals@^6.22.0:
474 | version "6.22.0"
475 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
476 | dependencies:
477 | babel-runtime "^6.22.0"
478 |
479 | babel-plugin-transform-es2015-modules-amd@^6.24.0:
480 | version "6.24.0"
481 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz#a1911fb9b7ec7e05a43a63c5995007557bcf6a2e"
482 | dependencies:
483 | babel-plugin-transform-es2015-modules-commonjs "^6.24.0"
484 | babel-runtime "^6.22.0"
485 | babel-template "^6.22.0"
486 |
487 | babel-plugin-transform-es2015-modules-commonjs@^6.24.0:
488 | version "6.24.0"
489 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz#e921aefb72c2cc26cb03d107626156413222134f"
490 | dependencies:
491 | babel-plugin-transform-strict-mode "^6.22.0"
492 | babel-runtime "^6.22.0"
493 | babel-template "^6.23.0"
494 | babel-types "^6.23.0"
495 |
496 | babel-plugin-transform-es2015-modules-systemjs@^6.22.0:
497 | version "6.23.0"
498 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0"
499 | dependencies:
500 | babel-helper-hoist-variables "^6.22.0"
501 | babel-runtime "^6.22.0"
502 | babel-template "^6.23.0"
503 |
504 | babel-plugin-transform-es2015-modules-umd@^6.24.0:
505 | version "6.24.0"
506 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz#fd5fa63521cae8d273927c3958afd7c067733450"
507 | dependencies:
508 | babel-plugin-transform-es2015-modules-amd "^6.24.0"
509 | babel-runtime "^6.22.0"
510 | babel-template "^6.23.0"
511 |
512 | babel-plugin-transform-es2015-object-super@^6.22.0:
513 | version "6.22.0"
514 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc"
515 | dependencies:
516 | babel-helper-replace-supers "^6.22.0"
517 | babel-runtime "^6.22.0"
518 |
519 | babel-plugin-transform-es2015-parameters@^6.22.0:
520 | version "6.23.0"
521 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b"
522 | dependencies:
523 | babel-helper-call-delegate "^6.22.0"
524 | babel-helper-get-function-arity "^6.22.0"
525 | babel-runtime "^6.22.0"
526 | babel-template "^6.23.0"
527 | babel-traverse "^6.23.0"
528 | babel-types "^6.23.0"
529 |
530 | babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
531 | version "6.22.0"
532 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723"
533 | dependencies:
534 | babel-runtime "^6.22.0"
535 | babel-types "^6.22.0"
536 |
537 | babel-plugin-transform-es2015-spread@^6.22.0:
538 | version "6.22.0"
539 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
540 | dependencies:
541 | babel-runtime "^6.22.0"
542 |
543 | babel-plugin-transform-es2015-sticky-regex@^6.22.0:
544 | version "6.22.0"
545 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593"
546 | dependencies:
547 | babel-helper-regex "^6.22.0"
548 | babel-runtime "^6.22.0"
549 | babel-types "^6.22.0"
550 |
551 | babel-plugin-transform-es2015-template-literals@^6.22.0:
552 | version "6.22.0"
553 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
554 | dependencies:
555 | babel-runtime "^6.22.0"
556 |
557 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
558 | version "6.23.0"
559 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
560 | dependencies:
561 | babel-runtime "^6.22.0"
562 |
563 | babel-plugin-transform-es2015-unicode-regex@^6.22.0:
564 | version "6.22.0"
565 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20"
566 | dependencies:
567 | babel-helper-regex "^6.22.0"
568 | babel-runtime "^6.22.0"
569 | regexpu-core "^2.0.0"
570 |
571 | babel-plugin-transform-exponentiation-operator@^6.22.0:
572 | version "6.22.0"
573 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.22.0.tgz#d57c8335281918e54ef053118ce6eb108468084d"
574 | dependencies:
575 | babel-helper-builder-binary-assignment-operator-visitor "^6.22.0"
576 | babel-plugin-syntax-exponentiation-operator "^6.8.0"
577 | babel-runtime "^6.22.0"
578 |
579 | babel-plugin-transform-export-extensions@^6.22.0:
580 | version "6.22.0"
581 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
582 | dependencies:
583 | babel-plugin-syntax-export-extensions "^6.8.0"
584 | babel-runtime "^6.22.0"
585 |
586 | babel-plugin-transform-flow-strip-types@^6.22.0:
587 | version "6.22.0"
588 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
589 | dependencies:
590 | babel-plugin-syntax-flow "^6.18.0"
591 | babel-runtime "^6.22.0"
592 |
593 | babel-plugin-transform-function-bind@^6.22.0:
594 | version "6.22.0"
595 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97"
596 | dependencies:
597 | babel-plugin-syntax-function-bind "^6.8.0"
598 | babel-runtime "^6.22.0"
599 |
600 | babel-plugin-transform-object-rest-spread@^6.22.0:
601 | version "6.23.0"
602 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921"
603 | dependencies:
604 | babel-plugin-syntax-object-rest-spread "^6.8.0"
605 | babel-runtime "^6.22.0"
606 |
607 | babel-plugin-transform-react-display-name@^6.23.0:
608 | version "6.23.0"
609 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37"
610 | dependencies:
611 | babel-runtime "^6.22.0"
612 |
613 | babel-plugin-transform-react-jsx-self@^6.22.0:
614 | version "6.22.0"
615 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
616 | dependencies:
617 | babel-plugin-syntax-jsx "^6.8.0"
618 | babel-runtime "^6.22.0"
619 |
620 | babel-plugin-transform-react-jsx-source@^6.22.0:
621 | version "6.22.0"
622 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
623 | dependencies:
624 | babel-plugin-syntax-jsx "^6.8.0"
625 | babel-runtime "^6.22.0"
626 |
627 | babel-plugin-transform-react-jsx@^6.23.0:
628 | version "6.23.0"
629 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.23.0.tgz#23e892f7f2e759678eb5e4446a8f8e94e81b3470"
630 | dependencies:
631 | babel-helper-builder-react-jsx "^6.23.0"
632 | babel-plugin-syntax-jsx "^6.8.0"
633 | babel-runtime "^6.22.0"
634 |
635 | babel-plugin-transform-regenerator@^6.22.0:
636 | version "6.22.0"
637 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6"
638 | dependencies:
639 | regenerator-transform "0.9.8"
640 |
641 | babel-plugin-transform-runtime@^6.23.0:
642 | version "6.23.0"
643 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
644 | dependencies:
645 | babel-runtime "^6.22.0"
646 |
647 | babel-plugin-transform-strict-mode@^6.22.0:
648 | version "6.22.0"
649 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c"
650 | dependencies:
651 | babel-runtime "^6.22.0"
652 | babel-types "^6.22.0"
653 |
654 | babel-polyfill@^6.23.0:
655 | version "6.23.0"
656 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
657 | dependencies:
658 | babel-runtime "^6.22.0"
659 | core-js "^2.4.0"
660 | regenerator-runtime "^0.10.0"
661 |
662 | babel-preset-es2015@^6.6.0:
663 | version "6.24.0"
664 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.0.tgz#c162d68b1932696e036cd3110dc1ccd303d2673a"
665 | dependencies:
666 | babel-plugin-check-es2015-constants "^6.22.0"
667 | babel-plugin-transform-es2015-arrow-functions "^6.22.0"
668 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
669 | babel-plugin-transform-es2015-block-scoping "^6.22.0"
670 | babel-plugin-transform-es2015-classes "^6.22.0"
671 | babel-plugin-transform-es2015-computed-properties "^6.22.0"
672 | babel-plugin-transform-es2015-destructuring "^6.22.0"
673 | babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
674 | babel-plugin-transform-es2015-for-of "^6.22.0"
675 | babel-plugin-transform-es2015-function-name "^6.22.0"
676 | babel-plugin-transform-es2015-literals "^6.22.0"
677 | babel-plugin-transform-es2015-modules-amd "^6.24.0"
678 | babel-plugin-transform-es2015-modules-commonjs "^6.24.0"
679 | babel-plugin-transform-es2015-modules-systemjs "^6.22.0"
680 | babel-plugin-transform-es2015-modules-umd "^6.24.0"
681 | babel-plugin-transform-es2015-object-super "^6.22.0"
682 | babel-plugin-transform-es2015-parameters "^6.22.0"
683 | babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
684 | babel-plugin-transform-es2015-spread "^6.22.0"
685 | babel-plugin-transform-es2015-sticky-regex "^6.22.0"
686 | babel-plugin-transform-es2015-template-literals "^6.22.0"
687 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
688 | babel-plugin-transform-es2015-unicode-regex "^6.22.0"
689 | babel-plugin-transform-regenerator "^6.22.0"
690 |
691 | babel-preset-flow@^6.23.0:
692 | version "6.23.0"
693 | resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
694 | dependencies:
695 | babel-plugin-transform-flow-strip-types "^6.22.0"
696 |
697 | babel-preset-react@^6.5.0:
698 | version "6.23.0"
699 | resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.23.0.tgz#eb7cee4de98a3f94502c28565332da9819455195"
700 | dependencies:
701 | babel-plugin-syntax-jsx "^6.3.13"
702 | babel-plugin-transform-react-display-name "^6.23.0"
703 | babel-plugin-transform-react-jsx "^6.23.0"
704 | babel-plugin-transform-react-jsx-self "^6.22.0"
705 | babel-plugin-transform-react-jsx-source "^6.22.0"
706 | babel-preset-flow "^6.23.0"
707 |
708 | babel-preset-stage-0@^6.5.0:
709 | version "6.22.0"
710 | resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.22.0.tgz#707eeb5b415da769eff9c42f4547f644f9296ef9"
711 | dependencies:
712 | babel-plugin-transform-do-expressions "^6.22.0"
713 | babel-plugin-transform-function-bind "^6.22.0"
714 | babel-preset-stage-1 "^6.22.0"
715 |
716 | babel-preset-stage-1@^6.22.0:
717 | version "6.22.0"
718 | resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.22.0.tgz#7da05bffea6ad5a10aef93e320cfc6dd465dbc1a"
719 | dependencies:
720 | babel-plugin-transform-class-constructor-call "^6.22.0"
721 | babel-plugin-transform-export-extensions "^6.22.0"
722 | babel-preset-stage-2 "^6.22.0"
723 |
724 | babel-preset-stage-2@^6.22.0:
725 | version "6.22.0"
726 | resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.22.0.tgz#ccd565f19c245cade394b21216df704a73b27c07"
727 | dependencies:
728 | babel-plugin-syntax-dynamic-import "^6.18.0"
729 | babel-plugin-transform-class-properties "^6.22.0"
730 | babel-plugin-transform-decorators "^6.22.0"
731 | babel-preset-stage-3 "^6.22.0"
732 |
733 | babel-preset-stage-3@^6.22.0:
734 | version "6.22.0"
735 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.22.0.tgz#a4e92bbace7456fafdf651d7a7657ee0bbca9c2e"
736 | dependencies:
737 | babel-plugin-syntax-trailing-function-commas "^6.22.0"
738 | babel-plugin-transform-async-generator-functions "^6.22.0"
739 | babel-plugin-transform-async-to-generator "^6.22.0"
740 | babel-plugin-transform-exponentiation-operator "^6.22.0"
741 | babel-plugin-transform-object-rest-spread "^6.22.0"
742 |
743 | babel-register@^6.24.0:
744 | version "6.24.0"
745 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.0.tgz#5e89f8463ba9970356d02eb07dabe3308b080cfd"
746 | dependencies:
747 | babel-core "^6.24.0"
748 | babel-runtime "^6.22.0"
749 | core-js "^2.4.0"
750 | home-or-tmp "^2.0.0"
751 | lodash "^4.2.0"
752 | mkdirp "^0.5.1"
753 | source-map-support "^0.4.2"
754 |
755 | babel-runtime@6.x.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0:
756 | version "6.23.0"
757 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
758 | dependencies:
759 | core-js "^2.4.0"
760 | regenerator-runtime "^0.10.0"
761 |
762 | babel-template@^6.22.0, babel-template@^6.23.0:
763 | version "6.23.0"
764 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638"
765 | dependencies:
766 | babel-runtime "^6.22.0"
767 | babel-traverse "^6.23.0"
768 | babel-types "^6.23.0"
769 | babylon "^6.11.0"
770 | lodash "^4.2.0"
771 |
772 | babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1:
773 | version "6.23.1"
774 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48"
775 | dependencies:
776 | babel-code-frame "^6.22.0"
777 | babel-messages "^6.23.0"
778 | babel-runtime "^6.22.0"
779 | babel-types "^6.23.0"
780 | babylon "^6.15.0"
781 | debug "^2.2.0"
782 | globals "^9.0.0"
783 | invariant "^2.2.0"
784 | lodash "^4.2.0"
785 |
786 | babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0:
787 | version "6.23.0"
788 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf"
789 | dependencies:
790 | babel-runtime "^6.22.0"
791 | esutils "^2.0.2"
792 | lodash "^4.2.0"
793 | to-fast-properties "^1.0.1"
794 |
795 | babylon@^6.11.0, babylon@^6.15.0:
796 | version "6.16.1"
797 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3"
798 |
799 | balanced-match@^0.4.1:
800 | version "0.4.2"
801 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
802 |
803 | base-64@^0.1.0:
804 | version "0.1.0"
805 | resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb"
806 |
807 | bcrypt-pbkdf@^1.0.0:
808 | version "1.0.1"
809 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
810 | dependencies:
811 | tweetnacl "^0.14.3"
812 |
813 | binary-extensions@^1.0.0:
814 | version "1.8.0"
815 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
816 |
817 | block-stream@*:
818 | version "0.0.9"
819 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
820 | dependencies:
821 | inherits "~2.0.0"
822 |
823 | boom@2.x.x:
824 | version "2.10.1"
825 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
826 | dependencies:
827 | hoek "2.x.x"
828 |
829 | brace-expansion@^1.0.0:
830 | version "1.1.6"
831 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9"
832 | dependencies:
833 | balanced-match "^0.4.1"
834 | concat-map "0.0.1"
835 |
836 | braces@^1.8.2:
837 | version "1.8.5"
838 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
839 | dependencies:
840 | expand-range "^1.8.1"
841 | preserve "^0.2.0"
842 | repeat-element "^1.1.2"
843 |
844 | buffer-shims@^1.0.0:
845 | version "1.0.0"
846 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
847 |
848 | caseless@~0.12.0:
849 | version "0.12.0"
850 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
851 |
852 | chai@^3.5.0:
853 | version "3.5.0"
854 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247"
855 | dependencies:
856 | assertion-error "^1.0.1"
857 | deep-eql "^0.1.3"
858 | type-detect "^1.0.0"
859 |
860 | chalk@^1.1.0:
861 | version "1.1.3"
862 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
863 | dependencies:
864 | ansi-styles "^2.2.1"
865 | escape-string-regexp "^1.0.2"
866 | has-ansi "^2.0.0"
867 | strip-ansi "^3.0.0"
868 | supports-color "^2.0.0"
869 |
870 | chokidar@^1.6.1:
871 | version "1.6.1"
872 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2"
873 | dependencies:
874 | anymatch "^1.3.0"
875 | async-each "^1.0.0"
876 | glob-parent "^2.0.0"
877 | inherits "^2.0.1"
878 | is-binary-path "^1.0.0"
879 | is-glob "^2.0.0"
880 | path-is-absolute "^1.0.0"
881 | readdirp "^2.0.0"
882 | optionalDependencies:
883 | fsevents "^1.0.0"
884 |
885 | co@^4.6.0:
886 | version "4.6.0"
887 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
888 |
889 | code-point-at@^1.0.0:
890 | version "1.1.0"
891 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
892 |
893 | combined-stream@^1.0.5, combined-stream@~1.0.5:
894 | version "1.0.5"
895 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
896 | dependencies:
897 | delayed-stream "~1.0.0"
898 |
899 | commander@0.6.1:
900 | version "0.6.1"
901 | resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06"
902 |
903 | commander@2.3.0:
904 | version "2.3.0"
905 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
906 |
907 | commander@^2.8.1:
908 | version "2.9.0"
909 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
910 | dependencies:
911 | graceful-readlink ">= 1.0.0"
912 |
913 | concat-map@0.0.1:
914 | version "0.0.1"
915 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
916 |
917 | console-control-strings@^1.0.0, console-control-strings@~1.1.0:
918 | version "1.1.0"
919 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
920 |
921 | convert-source-map@^1.1.0:
922 | version "1.4.0"
923 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3"
924 |
925 | core-js@^2.4.0:
926 | version "2.4.1"
927 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
928 |
929 | core-util-is@~1.0.0:
930 | version "1.0.2"
931 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
932 |
933 | cryptiles@2.x.x:
934 | version "2.0.5"
935 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
936 | dependencies:
937 | boom "2.x.x"
938 |
939 | crypto-js@^3.1.6:
940 | version "3.1.8"
941 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5"
942 |
943 | dashdash@^1.12.0:
944 | version "1.14.1"
945 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
946 | dependencies:
947 | assert-plus "^1.0.0"
948 |
949 | debug@2.2.0, debug@~2.2.0:
950 | version "2.2.0"
951 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
952 | dependencies:
953 | ms "0.7.1"
954 |
955 | debug@^2.1.1, debug@^2.2.0:
956 | version "2.6.2"
957 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.2.tgz#dfa96a861ee9b8c2f29349b3bcc41aa599a71e0f"
958 | dependencies:
959 | ms "0.7.2"
960 |
961 | deep-eql@^0.1.3:
962 | version "0.1.3"
963 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
964 | dependencies:
965 | type-detect "0.1.1"
966 |
967 | deep-extend@~0.4.0:
968 | version "0.4.1"
969 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"
970 |
971 | delayed-stream@~1.0.0:
972 | version "1.0.0"
973 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
974 |
975 | delegates@^1.0.0:
976 | version "1.0.0"
977 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
978 |
979 | detect-indent@^4.0.0:
980 | version "4.0.0"
981 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
982 | dependencies:
983 | repeating "^2.0.0"
984 |
985 | diff@1.4.0:
986 | version "1.4.0"
987 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
988 |
989 | ecc-jsbn@~0.1.1:
990 | version "0.1.1"
991 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
992 | dependencies:
993 | jsbn "~0.1.0"
994 |
995 | ejson@^2.1.2:
996 | version "2.1.2"
997 | resolved "https://registry.yarnpkg.com/ejson/-/ejson-2.1.2.tgz#0eed4055bc7e0e7561fe59e8c320edc3ff8ce7df"
998 | dependencies:
999 | underscore "1.8.x"
1000 |
1001 | escape-string-regexp@1.0.2, escape-string-regexp@^1.0.2:
1002 | version "1.0.2"
1003 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1"
1004 |
1005 | esutils@^2.0.0, esutils@^2.0.2:
1006 | version "2.0.2"
1007 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
1008 |
1009 | eventemitter3@^1.1.0:
1010 | version "1.2.0"
1011 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
1012 |
1013 | expand-brackets@^0.1.4:
1014 | version "0.1.5"
1015 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
1016 | dependencies:
1017 | is-posix-bracket "^0.1.0"
1018 |
1019 | expand-range@^1.8.1:
1020 | version "1.8.2"
1021 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
1022 | dependencies:
1023 | fill-range "^2.1.0"
1024 |
1025 | extend@~3.0.0:
1026 | version "3.0.0"
1027 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
1028 |
1029 | extglob@^0.3.1:
1030 | version "0.3.2"
1031 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
1032 | dependencies:
1033 | is-extglob "^1.0.0"
1034 |
1035 | extsprintf@1.0.2:
1036 | version "1.0.2"
1037 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
1038 |
1039 | filename-regex@^2.0.0:
1040 | version "2.0.0"
1041 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
1042 |
1043 | fill-range@^2.1.0:
1044 | version "2.2.3"
1045 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
1046 | dependencies:
1047 | is-number "^2.1.0"
1048 | isobject "^2.0.0"
1049 | randomatic "^1.1.3"
1050 | repeat-element "^1.1.2"
1051 | repeat-string "^1.5.2"
1052 |
1053 | for-in@^1.0.1:
1054 | version "1.0.2"
1055 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
1056 |
1057 | for-own@^0.1.4:
1058 | version "0.1.5"
1059 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
1060 | dependencies:
1061 | for-in "^1.0.1"
1062 |
1063 | forever-agent@~0.6.1:
1064 | version "0.6.1"
1065 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
1066 |
1067 | form-data@~2.1.1:
1068 | version "2.1.2"
1069 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4"
1070 | dependencies:
1071 | asynckit "^0.4.0"
1072 | combined-stream "^1.0.5"
1073 | mime-types "^2.1.12"
1074 |
1075 | formatio@1.1.1:
1076 | version "1.1.1"
1077 | resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9"
1078 | dependencies:
1079 | samsam "~1.1"
1080 |
1081 | fs-readdir-recursive@^1.0.0:
1082 | version "1.0.0"
1083 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
1084 |
1085 | fs.realpath@^1.0.0:
1086 | version "1.0.0"
1087 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1088 |
1089 | fsevents@^1.0.0:
1090 | version "1.1.1"
1091 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
1092 | dependencies:
1093 | nan "^2.3.0"
1094 | node-pre-gyp "^0.6.29"
1095 |
1096 | fstream-ignore@~1.0.5:
1097 | version "1.0.5"
1098 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
1099 | dependencies:
1100 | fstream "^1.0.0"
1101 | inherits "2"
1102 | minimatch "^3.0.0"
1103 |
1104 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10:
1105 | version "1.0.11"
1106 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
1107 | dependencies:
1108 | graceful-fs "^4.1.2"
1109 | inherits "~2.0.0"
1110 | mkdirp ">=0.5 0"
1111 | rimraf "2"
1112 |
1113 | gauge@~2.7.1:
1114 | version "2.7.3"
1115 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09"
1116 | dependencies:
1117 | aproba "^1.0.3"
1118 | console-control-strings "^1.0.0"
1119 | has-unicode "^2.0.0"
1120 | object-assign "^4.1.0"
1121 | signal-exit "^3.0.0"
1122 | string-width "^1.0.1"
1123 | strip-ansi "^3.0.1"
1124 | wide-align "^1.1.0"
1125 |
1126 | getpass@^0.1.1:
1127 | version "0.1.6"
1128 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6"
1129 | dependencies:
1130 | assert-plus "^1.0.0"
1131 |
1132 | glob-base@^0.3.0:
1133 | version "0.3.0"
1134 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
1135 | dependencies:
1136 | glob-parent "^2.0.0"
1137 | is-glob "^2.0.0"
1138 |
1139 | glob-parent@^2.0.0:
1140 | version "2.0.0"
1141 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
1142 | dependencies:
1143 | is-glob "^2.0.0"
1144 |
1145 | glob@3.2.11:
1146 | version "3.2.11"
1147 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
1148 | dependencies:
1149 | inherits "2"
1150 | minimatch "0.3"
1151 |
1152 | glob@^7.0.0, glob@^7.0.5:
1153 | version "7.1.1"
1154 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
1155 | dependencies:
1156 | fs.realpath "^1.0.0"
1157 | inflight "^1.0.4"
1158 | inherits "2"
1159 | minimatch "^3.0.2"
1160 | once "^1.3.0"
1161 | path-is-absolute "^1.0.0"
1162 |
1163 | globals@^9.0.0:
1164 | version "9.16.0"
1165 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80"
1166 |
1167 | graceful-fs@^4.1.2, graceful-fs@^4.1.4:
1168 | version "4.1.11"
1169 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1170 |
1171 | "graceful-readlink@>= 1.0.0":
1172 | version "1.0.1"
1173 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
1174 |
1175 | growl@1.9.2:
1176 | version "1.9.2"
1177 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
1178 |
1179 | har-schema@^1.0.5:
1180 | version "1.0.5"
1181 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
1182 |
1183 | har-validator@~4.2.1:
1184 | version "4.2.1"
1185 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
1186 | dependencies:
1187 | ajv "^4.9.1"
1188 | har-schema "^1.0.5"
1189 |
1190 | has-ansi@^2.0.0:
1191 | version "2.0.0"
1192 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1193 | dependencies:
1194 | ansi-regex "^2.0.0"
1195 |
1196 | has-unicode@^2.0.0:
1197 | version "2.0.1"
1198 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1199 |
1200 | hawk@~3.1.3:
1201 | version "3.1.3"
1202 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
1203 | dependencies:
1204 | boom "2.x.x"
1205 | cryptiles "2.x.x"
1206 | hoek "2.x.x"
1207 | sntp "1.x.x"
1208 |
1209 | hoek@2.x.x:
1210 | version "2.16.3"
1211 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
1212 |
1213 | hoist-non-react-statics@1.x.x:
1214 | version "1.2.0"
1215 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
1216 |
1217 | home-or-tmp@^2.0.0:
1218 | version "2.0.0"
1219 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
1220 | dependencies:
1221 | os-homedir "^1.0.0"
1222 | os-tmpdir "^1.0.1"
1223 |
1224 | http-signature@~1.1.0:
1225 | version "1.1.1"
1226 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
1227 | dependencies:
1228 | assert-plus "^0.2.0"
1229 | jsprim "^1.2.2"
1230 | sshpk "^1.7.0"
1231 |
1232 | inflight@^1.0.4:
1233 | version "1.0.6"
1234 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
1235 | dependencies:
1236 | once "^1.3.0"
1237 | wrappy "1"
1238 |
1239 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
1240 | version "2.0.3"
1241 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1242 |
1243 | inherits@2.0.1:
1244 | version "2.0.1"
1245 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
1246 |
1247 | ini@~1.3.0:
1248 | version "1.3.4"
1249 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
1250 |
1251 | invariant@2.x.x, invariant@^2.1.1, invariant@^2.2.0:
1252 | version "2.2.2"
1253 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
1254 | dependencies:
1255 | loose-envify "^1.0.0"
1256 |
1257 | is-binary-path@^1.0.0:
1258 | version "1.0.1"
1259 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
1260 | dependencies:
1261 | binary-extensions "^1.0.0"
1262 |
1263 | is-buffer@^1.0.2:
1264 | version "1.1.5"
1265 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
1266 |
1267 | is-dotfile@^1.0.0:
1268 | version "1.0.2"
1269 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
1270 |
1271 | is-equal-shallow@^0.1.3:
1272 | version "0.1.3"
1273 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
1274 | dependencies:
1275 | is-primitive "^2.0.0"
1276 |
1277 | is-extendable@^0.1.1:
1278 | version "0.1.1"
1279 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
1280 |
1281 | is-extglob@^1.0.0:
1282 | version "1.0.0"
1283 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
1284 |
1285 | is-finite@^1.0.0:
1286 | version "1.0.2"
1287 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
1288 | dependencies:
1289 | number-is-nan "^1.0.0"
1290 |
1291 | is-fullwidth-code-point@^1.0.0:
1292 | version "1.0.0"
1293 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1294 | dependencies:
1295 | number-is-nan "^1.0.0"
1296 |
1297 | is-glob@^2.0.0, is-glob@^2.0.1:
1298 | version "2.0.1"
1299 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
1300 | dependencies:
1301 | is-extglob "^1.0.0"
1302 |
1303 | is-number@^2.0.2, is-number@^2.1.0:
1304 | version "2.1.0"
1305 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
1306 | dependencies:
1307 | kind-of "^3.0.2"
1308 |
1309 | is-posix-bracket@^0.1.0:
1310 | version "0.1.1"
1311 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
1312 |
1313 | is-primitive@^2.0.0:
1314 | version "2.0.0"
1315 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
1316 |
1317 | is-typedarray@~1.0.0:
1318 | version "1.0.0"
1319 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1320 |
1321 | isarray@1.0.0, isarray@~1.0.0:
1322 | version "1.0.0"
1323 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1324 |
1325 | isobject@^2.0.0:
1326 | version "2.1.0"
1327 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
1328 | dependencies:
1329 | isarray "1.0.0"
1330 |
1331 | isstream@~0.1.2:
1332 | version "0.1.2"
1333 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
1334 |
1335 | jade@0.26.3:
1336 | version "0.26.3"
1337 | resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c"
1338 | dependencies:
1339 | commander "0.6.1"
1340 | mkdirp "0.3.0"
1341 |
1342 | jodid25519@^1.0.0:
1343 | version "1.0.2"
1344 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
1345 | dependencies:
1346 | jsbn "~0.1.0"
1347 |
1348 | js-tokens@^3.0.0:
1349 | version "3.0.1"
1350 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
1351 |
1352 | jsbn@~0.1.0:
1353 | version "0.1.1"
1354 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
1355 |
1356 | jsesc@^1.3.0:
1357 | version "1.3.0"
1358 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
1359 |
1360 | jsesc@~0.5.0:
1361 | version "0.5.0"
1362 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
1363 |
1364 | json-schema@0.2.3:
1365 | version "0.2.3"
1366 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
1367 |
1368 | json-stable-stringify@^1.0.1:
1369 | version "1.0.1"
1370 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
1371 | dependencies:
1372 | jsonify "~0.0.0"
1373 |
1374 | json-stringify-safe@~5.0.1:
1375 | version "5.0.1"
1376 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
1377 |
1378 | json5@^0.5.0:
1379 | version "0.5.1"
1380 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
1381 |
1382 | jsonify@~0.0.0:
1383 | version "0.0.0"
1384 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
1385 |
1386 | jsprim@^1.2.2:
1387 | version "1.3.1"
1388 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252"
1389 | dependencies:
1390 | extsprintf "1.0.2"
1391 | json-schema "0.2.3"
1392 | verror "1.3.6"
1393 |
1394 | kind-of@^3.0.2:
1395 | version "3.1.0"
1396 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47"
1397 | dependencies:
1398 | is-buffer "^1.0.2"
1399 |
1400 | lodash._getnative@^3.0.0:
1401 | version "3.9.1"
1402 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
1403 |
1404 | lodash.isarguments@^3.0.0:
1405 | version "3.1.0"
1406 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
1407 |
1408 | lodash.isarray@^3.0.0:
1409 | version "3.0.4"
1410 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
1411 |
1412 | lodash.keys@^3.1.2:
1413 | version "3.1.2"
1414 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
1415 | dependencies:
1416 | lodash._getnative "^3.0.0"
1417 | lodash.isarguments "^3.0.0"
1418 | lodash.isarray "^3.0.0"
1419 |
1420 | lodash@^4.2.0:
1421 | version "4.17.4"
1422 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
1423 |
1424 | lodash@~2.4.1:
1425 | version "2.4.2"
1426 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
1427 |
1428 | lolex@1.3.2:
1429 | version "1.3.2"
1430 | resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31"
1431 |
1432 | loose-envify@^1.0.0:
1433 | version "1.3.1"
1434 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
1435 | dependencies:
1436 | js-tokens "^3.0.0"
1437 |
1438 | lru-cache@2:
1439 | version "2.7.3"
1440 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
1441 |
1442 | micromatch@^2.1.5:
1443 | version "2.3.11"
1444 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
1445 | dependencies:
1446 | arr-diff "^2.0.0"
1447 | array-unique "^0.2.1"
1448 | braces "^1.8.2"
1449 | expand-brackets "^0.1.4"
1450 | extglob "^0.3.1"
1451 | filename-regex "^2.0.0"
1452 | is-extglob "^1.0.0"
1453 | is-glob "^2.0.1"
1454 | kind-of "^3.0.2"
1455 | normalize-path "^2.0.1"
1456 | object.omit "^2.0.0"
1457 | parse-glob "^3.0.4"
1458 | regex-cache "^0.4.2"
1459 |
1460 | mime-db@~1.26.0:
1461 | version "1.26.0"
1462 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff"
1463 |
1464 | mime-types@^2.1.12, mime-types@~2.1.7:
1465 | version "2.1.14"
1466 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee"
1467 | dependencies:
1468 | mime-db "~1.26.0"
1469 |
1470 | minimatch@0.3:
1471 | version "0.3.0"
1472 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
1473 | dependencies:
1474 | lru-cache "2"
1475 | sigmund "~1.0.0"
1476 |
1477 | minimatch@^3.0.0, minimatch@^3.0.2:
1478 | version "3.0.3"
1479 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
1480 | dependencies:
1481 | brace-expansion "^1.0.0"
1482 |
1483 | minimist@0.0.8:
1484 | version "0.0.8"
1485 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
1486 |
1487 | minimist@^1.2.0:
1488 | version "1.2.0"
1489 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1490 |
1491 | minimongo-cache@0.0.48:
1492 | version "0.0.48"
1493 | resolved "https://registry.yarnpkg.com/minimongo-cache/-/minimongo-cache-0.0.48.tgz#a6fbb78b6627554249afeefc1243cf7cba6bea07"
1494 | dependencies:
1495 | eventemitter3 "^1.1.0"
1496 | invariant "^2.1.1"
1497 | lodash "~2.4.1"
1498 |
1499 | mkdirp@0.3.0:
1500 | version "0.3.0"
1501 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
1502 |
1503 | mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
1504 | version "0.5.1"
1505 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
1506 | dependencies:
1507 | minimist "0.0.8"
1508 |
1509 | mobx@^2.3.4:
1510 | version "2.7.0"
1511 | resolved "https://registry.yarnpkg.com/mobx/-/mobx-2.7.0.tgz#cf3d82d18c0ca7f458d8f2a240817b3dc7e54a01"
1512 |
1513 | mocha@^2.4.5:
1514 | version "2.5.3"
1515 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58"
1516 | dependencies:
1517 | commander "2.3.0"
1518 | debug "2.2.0"
1519 | diff "1.4.0"
1520 | escape-string-regexp "1.0.2"
1521 | glob "3.2.11"
1522 | growl "1.9.2"
1523 | jade "0.26.3"
1524 | mkdirp "0.5.1"
1525 | supports-color "1.2.0"
1526 | to-iso-string "0.0.2"
1527 |
1528 | mock-socket@^2.0.0:
1529 | version "2.0.0"
1530 | resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-2.0.0.tgz#d2f941eb8010c2beaa97983e4827fbc62111abcb"
1531 | dependencies:
1532 | urijs "~1.17.0"
1533 |
1534 | ms@0.7.1:
1535 | version "0.7.1"
1536 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
1537 |
1538 | ms@0.7.2:
1539 | version "0.7.2"
1540 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
1541 |
1542 | nan@^2.3.0:
1543 | version "2.5.1"
1544 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2"
1545 |
1546 | node-pre-gyp@^0.6.29:
1547 | version "0.6.33"
1548 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9"
1549 | dependencies:
1550 | mkdirp "~0.5.1"
1551 | nopt "~3.0.6"
1552 | npmlog "^4.0.1"
1553 | rc "~1.1.6"
1554 | request "^2.79.0"
1555 | rimraf "~2.5.4"
1556 | semver "~5.3.0"
1557 | tar "~2.2.1"
1558 | tar-pack "~3.3.0"
1559 |
1560 | nopt@~3.0.6:
1561 | version "3.0.6"
1562 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
1563 | dependencies:
1564 | abbrev "1"
1565 |
1566 | normalize-path@^2.0.1:
1567 | version "2.0.1"
1568 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a"
1569 |
1570 | npmlog@^4.0.1:
1571 | version "4.0.2"
1572 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f"
1573 | dependencies:
1574 | are-we-there-yet "~1.1.2"
1575 | console-control-strings "~1.1.0"
1576 | gauge "~2.7.1"
1577 | set-blocking "~2.0.0"
1578 |
1579 | number-is-nan@^1.0.0:
1580 | version "1.0.1"
1581 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
1582 |
1583 | oauth-sign@~0.8.1:
1584 | version "0.8.2"
1585 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
1586 |
1587 | object-assign@^4.0.1, object-assign@^4.1.0:
1588 | version "4.1.1"
1589 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1590 |
1591 | object.omit@^2.0.0:
1592 | version "2.0.1"
1593 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
1594 | dependencies:
1595 | for-own "^0.1.4"
1596 | is-extendable "^0.1.1"
1597 |
1598 | once@^1.3.0:
1599 | version "1.4.0"
1600 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1601 | dependencies:
1602 | wrappy "1"
1603 |
1604 | once@~1.3.3:
1605 | version "1.3.3"
1606 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
1607 | dependencies:
1608 | wrappy "1"
1609 |
1610 | os-homedir@^1.0.0:
1611 | version "1.0.2"
1612 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
1613 |
1614 | os-tmpdir@^1.0.1:
1615 | version "1.0.2"
1616 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
1617 |
1618 | output-file-sync@^1.1.0:
1619 | version "1.1.2"
1620 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
1621 | dependencies:
1622 | graceful-fs "^4.1.4"
1623 | mkdirp "^0.5.1"
1624 | object-assign "^4.1.0"
1625 |
1626 | parse-glob@^3.0.4:
1627 | version "3.0.4"
1628 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
1629 | dependencies:
1630 | glob-base "^0.3.0"
1631 | is-dotfile "^1.0.0"
1632 | is-extglob "^1.0.0"
1633 | is-glob "^2.0.0"
1634 |
1635 | path-is-absolute@^1.0.0:
1636 | version "1.0.1"
1637 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1638 |
1639 | performance-now@^0.2.0, performance-now@~0.2.0:
1640 | version "0.2.0"
1641 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
1642 |
1643 | preserve@^0.2.0:
1644 | version "0.2.0"
1645 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
1646 |
1647 | private@^0.1.6:
1648 | version "0.1.7"
1649 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
1650 |
1651 | process-nextick-args@~1.0.6:
1652 | version "1.0.7"
1653 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
1654 |
1655 | punycode@^1.4.1:
1656 | version "1.4.1"
1657 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
1658 |
1659 | qs@~6.4.0:
1660 | version "6.4.0"
1661 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
1662 |
1663 | raf@~3.1.0:
1664 | version "3.1.0"
1665 | resolved "https://registry.yarnpkg.com/raf/-/raf-3.1.0.tgz#5d84bf81b57f979f8c492be08378c538bb4eecfc"
1666 | dependencies:
1667 | performance-now "~0.2.0"
1668 |
1669 | randomatic@^1.1.3:
1670 | version "1.1.6"
1671 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
1672 | dependencies:
1673 | is-number "^2.0.2"
1674 | kind-of "^3.0.2"
1675 |
1676 | rc@~1.1.6:
1677 | version "1.1.7"
1678 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea"
1679 | dependencies:
1680 | deep-extend "~0.4.0"
1681 | ini "~1.3.0"
1682 | minimist "^1.2.0"
1683 | strip-json-comments "~2.0.1"
1684 |
1685 | react-komposer@^1.8.0:
1686 | version "1.13.1"
1687 | resolved "https://registry.yarnpkg.com/react-komposer/-/react-komposer-1.13.1.tgz#4b8ac4bcc71323bd7413dcab95c831197f50eed0"
1688 | dependencies:
1689 | babel-runtime "6.x.x"
1690 | hoist-non-react-statics "1.x.x"
1691 | invariant "2.x.x"
1692 | mobx "^2.3.4"
1693 | shallowequal "0.2.x"
1694 |
1695 | react-mixin@^3.0.3:
1696 | version "3.0.5"
1697 | resolved "https://registry.yarnpkg.com/react-mixin/-/react-mixin-3.0.5.tgz#e0b7b6713fdc9ddc429267df808b6ac5184c6706"
1698 | dependencies:
1699 | object-assign "^4.0.1"
1700 | smart-mixin "^2.0.0"
1701 |
1702 | "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2:
1703 | version "2.2.3"
1704 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729"
1705 | dependencies:
1706 | buffer-shims "^1.0.0"
1707 | core-util-is "~1.0.0"
1708 | inherits "~2.0.1"
1709 | isarray "~1.0.0"
1710 | process-nextick-args "~1.0.6"
1711 | string_decoder "~0.10.x"
1712 | util-deprecate "~1.0.1"
1713 |
1714 | readable-stream@~2.1.4:
1715 | version "2.1.5"
1716 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
1717 | dependencies:
1718 | buffer-shims "^1.0.0"
1719 | core-util-is "~1.0.0"
1720 | inherits "~2.0.1"
1721 | isarray "~1.0.0"
1722 | process-nextick-args "~1.0.6"
1723 | string_decoder "~0.10.x"
1724 | util-deprecate "~1.0.1"
1725 |
1726 | readdirp@^2.0.0:
1727 | version "2.1.0"
1728 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
1729 | dependencies:
1730 | graceful-fs "^4.1.2"
1731 | minimatch "^3.0.2"
1732 | readable-stream "^2.0.2"
1733 | set-immediate-shim "^1.0.1"
1734 |
1735 | regenerate@^1.2.1:
1736 | version "1.3.2"
1737 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
1738 |
1739 | regenerator-runtime@^0.10.0:
1740 | version "0.10.3"
1741 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
1742 |
1743 | regenerator-transform@0.9.8:
1744 | version "0.9.8"
1745 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c"
1746 | dependencies:
1747 | babel-runtime "^6.18.0"
1748 | babel-types "^6.19.0"
1749 | private "^0.1.6"
1750 |
1751 | regex-cache@^0.4.2:
1752 | version "0.4.3"
1753 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
1754 | dependencies:
1755 | is-equal-shallow "^0.1.3"
1756 | is-primitive "^2.0.0"
1757 |
1758 | regexpu-core@^2.0.0:
1759 | version "2.0.0"
1760 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
1761 | dependencies:
1762 | regenerate "^1.2.1"
1763 | regjsgen "^0.2.0"
1764 | regjsparser "^0.1.4"
1765 |
1766 | regjsgen@^0.2.0:
1767 | version "0.2.0"
1768 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
1769 |
1770 | regjsparser@^0.1.4:
1771 | version "0.1.5"
1772 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
1773 | dependencies:
1774 | jsesc "~0.5.0"
1775 |
1776 | repeat-element@^1.1.2:
1777 | version "1.1.2"
1778 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
1779 |
1780 | repeat-string@^1.5.2:
1781 | version "1.6.1"
1782 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
1783 |
1784 | repeating@^2.0.0:
1785 | version "2.0.1"
1786 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
1787 | dependencies:
1788 | is-finite "^1.0.0"
1789 |
1790 | request@^2.79.0:
1791 | version "2.81.0"
1792 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
1793 | dependencies:
1794 | aws-sign2 "~0.6.0"
1795 | aws4 "^1.2.1"
1796 | caseless "~0.12.0"
1797 | combined-stream "~1.0.5"
1798 | extend "~3.0.0"
1799 | forever-agent "~0.6.1"
1800 | form-data "~2.1.1"
1801 | har-validator "~4.2.1"
1802 | hawk "~3.1.3"
1803 | http-signature "~1.1.0"
1804 | is-typedarray "~1.0.0"
1805 | isstream "~0.1.2"
1806 | json-stringify-safe "~5.0.1"
1807 | mime-types "~2.1.7"
1808 | oauth-sign "~0.8.1"
1809 | performance-now "^0.2.0"
1810 | qs "~6.4.0"
1811 | safe-buffer "^5.0.1"
1812 | stringstream "~0.0.4"
1813 | tough-cookie "~2.3.0"
1814 | tunnel-agent "^0.6.0"
1815 | uuid "^3.0.0"
1816 |
1817 | rimraf@2, rimraf@^2.6.1:
1818 | version "2.6.1"
1819 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
1820 | dependencies:
1821 | glob "^7.0.5"
1822 |
1823 | rimraf@~2.5.1, rimraf@~2.5.4:
1824 | version "2.5.4"
1825 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
1826 | dependencies:
1827 | glob "^7.0.5"
1828 |
1829 | safe-buffer@^5.0.1:
1830 | version "5.0.1"
1831 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
1832 |
1833 | samsam@1.1.2, samsam@~1.1:
1834 | version "1.1.2"
1835 | resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
1836 |
1837 | semver@~5.3.0:
1838 | version "5.3.0"
1839 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
1840 |
1841 | set-blocking@~2.0.0:
1842 | version "2.0.0"
1843 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1844 |
1845 | set-immediate-shim@^1.0.1:
1846 | version "1.0.1"
1847 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
1848 |
1849 | shallowequal@0.2.x:
1850 | version "0.2.2"
1851 | resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e"
1852 | dependencies:
1853 | lodash.keys "^3.1.2"
1854 |
1855 | sigmund@~1.0.0:
1856 | version "1.0.1"
1857 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
1858 |
1859 | signal-exit@^3.0.0:
1860 | version "3.0.2"
1861 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
1862 |
1863 | sinon@^1.17.3:
1864 | version "1.17.7"
1865 | resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf"
1866 | dependencies:
1867 | formatio "1.1.1"
1868 | lolex "1.3.2"
1869 | samsam "1.1.2"
1870 | util ">=0.10.3 <1"
1871 |
1872 | slash@^1.0.0:
1873 | version "1.0.0"
1874 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
1875 |
1876 | smart-mixin@^2.0.0:
1877 | version "2.0.0"
1878 | resolved "https://registry.yarnpkg.com/smart-mixin/-/smart-mixin-2.0.0.tgz#a34a1055e32a75b30d2b4e3ca323dc99cb53f437"
1879 |
1880 | sntp@1.x.x:
1881 | version "1.0.9"
1882 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
1883 | dependencies:
1884 | hoek "2.x.x"
1885 |
1886 | source-map-support@^0.4.2:
1887 | version "0.4.11"
1888 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322"
1889 | dependencies:
1890 | source-map "^0.5.3"
1891 |
1892 | source-map@^0.5.0, source-map@^0.5.3:
1893 | version "0.5.6"
1894 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
1895 |
1896 | sshpk@^1.7.0:
1897 | version "1.11.0"
1898 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77"
1899 | dependencies:
1900 | asn1 "~0.2.3"
1901 | assert-plus "^1.0.0"
1902 | dashdash "^1.12.0"
1903 | getpass "^0.1.1"
1904 | optionalDependencies:
1905 | bcrypt-pbkdf "^1.0.0"
1906 | ecc-jsbn "~0.1.1"
1907 | jodid25519 "^1.0.0"
1908 | jsbn "~0.1.0"
1909 | tweetnacl "~0.14.0"
1910 |
1911 | string-width@^1.0.1:
1912 | version "1.0.2"
1913 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
1914 | dependencies:
1915 | code-point-at "^1.0.0"
1916 | is-fullwidth-code-point "^1.0.0"
1917 | strip-ansi "^3.0.0"
1918 |
1919 | string_decoder@~0.10.x:
1920 | version "0.10.31"
1921 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
1922 |
1923 | stringstream@~0.0.4:
1924 | version "0.0.5"
1925 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
1926 |
1927 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
1928 | version "3.0.1"
1929 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
1930 | dependencies:
1931 | ansi-regex "^2.0.0"
1932 |
1933 | strip-json-comments@~2.0.1:
1934 | version "2.0.1"
1935 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1936 |
1937 | supports-color@1.2.0:
1938 | version "1.2.0"
1939 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e"
1940 |
1941 | supports-color@^2.0.0:
1942 | version "2.0.0"
1943 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
1944 |
1945 | tar-pack@~3.3.0:
1946 | version "3.3.0"
1947 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae"
1948 | dependencies:
1949 | debug "~2.2.0"
1950 | fstream "~1.0.10"
1951 | fstream-ignore "~1.0.5"
1952 | once "~1.3.3"
1953 | readable-stream "~2.1.4"
1954 | rimraf "~2.5.1"
1955 | tar "~2.2.1"
1956 | uid-number "~0.0.6"
1957 |
1958 | tar@~2.2.1:
1959 | version "2.2.1"
1960 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
1961 | dependencies:
1962 | block-stream "*"
1963 | fstream "^1.0.2"
1964 | inherits "2"
1965 |
1966 | to-fast-properties@^1.0.1:
1967 | version "1.0.2"
1968 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"
1969 |
1970 | to-iso-string@0.0.2:
1971 | version "0.0.2"
1972 | resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1"
1973 |
1974 | tough-cookie@~2.3.0:
1975 | version "2.3.2"
1976 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
1977 | dependencies:
1978 | punycode "^1.4.1"
1979 |
1980 | trackr@^2.0.2:
1981 | version "2.0.2"
1982 | resolved "https://registry.yarnpkg.com/trackr/-/trackr-2.0.2.tgz#ee38b13b580b30df5e8e0270d1cf3d0212c4745e"
1983 | dependencies:
1984 | raf "~3.1.0"
1985 |
1986 | trim-right@^1.0.1:
1987 | version "1.0.1"
1988 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
1989 |
1990 | tunnel-agent@^0.6.0:
1991 | version "0.6.0"
1992 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
1993 | dependencies:
1994 | safe-buffer "^5.0.1"
1995 |
1996 | tweetnacl@^0.14.3, tweetnacl@~0.14.0:
1997 | version "0.14.5"
1998 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
1999 |
2000 | type-detect@0.1.1:
2001 | version "0.1.1"
2002 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822"
2003 |
2004 | type-detect@^1.0.0:
2005 | version "1.0.0"
2006 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2"
2007 |
2008 | uid-number@~0.0.6:
2009 | version "0.0.6"
2010 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
2011 |
2012 | underscore@1.8.x, underscore@^1.8.3:
2013 | version "1.8.3"
2014 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
2015 |
2016 | urijs@~1.17.0:
2017 | version "1.17.1"
2018 | resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.17.1.tgz#0a28bf2e00dfc24eeb0974feb8268a238c7bac2d"
2019 |
2020 | user-home@^1.1.1:
2021 | version "1.1.1"
2022 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
2023 |
2024 | util-deprecate@~1.0.1:
2025 | version "1.0.2"
2026 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
2027 |
2028 | "util@>=0.10.3 <1":
2029 | version "0.10.3"
2030 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
2031 | dependencies:
2032 | inherits "2.0.1"
2033 |
2034 | uuid@^3.0.0:
2035 | version "3.0.1"
2036 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
2037 |
2038 | v8flags@^2.0.10:
2039 | version "2.0.11"
2040 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881"
2041 | dependencies:
2042 | user-home "^1.1.1"
2043 |
2044 | verror@1.3.6:
2045 | version "1.3.6"
2046 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
2047 | dependencies:
2048 | extsprintf "1.0.2"
2049 |
2050 | wide-align@^1.1.0:
2051 | version "1.1.0"
2052 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad"
2053 | dependencies:
2054 | string-width "^1.0.1"
2055 |
2056 | wolfy87-eventemitter@^4.3.0:
2057 | version "4.3.0"
2058 | resolved "https://registry.yarnpkg.com/wolfy87-eventemitter/-/wolfy87-eventemitter-4.3.0.tgz#6497396c95e74359f06b6e35409339318d8d964f"
2059 |
2060 | wrappy@1:
2061 | version "1.0.2"
2062 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
2063 |
--------------------------------------------------------------------------------