├── .babelrc
├── .gitignore
├── .npmignore
├── .travis.yml
├── README.md
├── changelog.md
├── example
├── README.md
├── package.json
├── src
│ ├── index.html
│ └── js
│ │ └── index.js
└── webpack.config.js
├── package-lock.json
├── package.json
├── src
├── AuthenticationWrapper.js
├── index.d.ts
├── index.js
├── makeAuth0Driver.js
└── protectComponent.js
└── tests
├── AuthenticationWrapper.js
└── makeAuth0Driver.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": ["es2015"],
3 | "plugins": ["transform-object-rest-spread"]
4 | }
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | example/public
3 | node_modules
4 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | src
2 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "6"
4 | cache:
5 | directories:
6 | - node_modules
7 | install:
8 | - npm install
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # cyclejs-auth0
2 |
3 | [](https://travis-ci.org/atomrc/cyclejs-auth0)
4 |
5 | `cyclejs-auth0` is composed of two entities (a [driver](#the-driver) and a [component wrapper](#the-component-wrapper)).
6 |
7 | The component wrapper allows you to:
8 | - protect any of your component from unlogged users [⬇](#protecting-a-component);
9 | - make authenticated HTTP request to your api endpoint[⬇](#decorating-component-sinks-with-the-token).
10 |
11 | The driver allows you to:
12 | - init the auth0 lock [⬇](#driver-initialisation);
13 | - send actions [⬇](#sending-action-to-the-auth0-lock) to the lock (like `show` or `getUserInfo`);
14 | - read responses [⬇](#reading-responses-from-auth0) from the lock;
15 | - store token [⬇](#i-want-my-token) in `localStorage` (or you can do it yourself if you want [⬇](#i-want-to-deal-with-storage-myself)).
16 |
17 | ## Compatibility note
18 |
19 | `cyclejs-auth0` is (for the moment) only compatible with `@cycle/xstream-run`.
20 | It will be compatible with any stream lib in the future, but if you are impatient, a PR will be welcomed ;)
21 |
22 | ## Installation
23 |
24 | npm install cyclejs-auth0
25 |
26 | ## The component wrapper
27 |
28 | This is, by far, the simplest way to integrate Auth0 into your cyclejs app. The component wrapper will protect any of your component from unlogged users (users that don't have a token in `localStorage`).
29 |
30 | ### Wrapper initialization
31 |
32 | The basic setup will look like that:
33 |
34 | ```javascript
35 | import {makeAuth0Driver, protect} from "cyclejs-auth0";
36 |
37 | function main(sources) {
38 | //sources include `auth0`
39 | const protectedComponent = protect(Component)(sources);
40 |
41 | return protectedComponent;
42 | }
43 |
44 | const drivers = {
45 | auth0: makeAuth0Driver("appkey", "appdomain")
46 | }
47 | ```
48 |
49 | ### Protecting a component
50 |
51 | Protecting a component is as simple as calling `const ProtectedComponent = protect(MyComponent)`. You then get a new protected component. You can use it as any cyclejs component: `const sinks = ProtectedComponent(sources)`.
52 |
53 | Here is a simple example of how to use `protect`
54 |
55 | ```javascript
56 | import {protect} from "cyclejs-auth0";
57 |
58 | function MyComponent(sources) {
59 | return {
60 | DOM: xs.of(div("hello fellow user"))
61 | };
62 | }
63 |
64 | function main(sources) {
65 | const ProtectedComponent = protect(MyComponent); //now the component is protected
66 |
67 | //when the component is initiated it will lookup for a jwt token in localStorage
68 | //if no token is found, it will spawn the auth0 login form
69 | //else it will just pass the decoded token to your component for you to consume it
70 | const sinks = protectedComponent(sources);
71 |
72 | return sinks;
73 | }
74 | ```
75 |
76 | Now if the user is not logged in when the component is instantiated, the Auth0 form will show up.
77 |
78 | ### Making authenticated HTTP calls
79 |
80 | Authentication in a single page app is often not only about protecting a component but also about sending the authentication token to your api endpoint. There is a simple way to do that with the component wrapper, the `decorators` option of the `protect` function.
81 |
82 | ```javascript
83 | const ProtectedComponent = protect(Component, {
84 | decorators: {
85 | //let's decorate the HTTP sink
86 | //the decorate function is given each produced value of the
87 | //initial sink + the user's tokens (accessToken and idToken)
88 | HTTP: (request, tokens) => {
89 | return {
90 | ...request,
91 | headers: {
92 | ...request.headers,
93 | //Will add an Authorization header containing the user's access token to
94 | //any of the http requests sent by the component
95 | "Authorization": "Bearer " + tokens.accessToken
96 | }
97 | }
98 | }
99 | }
100 | });
101 |
102 | const instance = ProtectedComponent(sources);
103 |
104 | instance.HTTP //< this sink will be decorated with the token
105 | instance.DOM //< this sink is the initial component's sink, untouched
106 | ```
107 |
108 | ### Retrieving user's profile
109 |
110 | You might want to access the user's profile in your application. It's common to display at least the user's name and picture.
111 |
112 | There are two ways to do that: decoding the JSON Web Token given by Auth0 to get basic information, or requesting the user's full profile from Auth0.
113 |
114 | Both methods need the user's token. Fortunately `protect` also passes a `props` object, that contains a `tokens$` stream, on to the component it's protecting.
115 |
116 | You guessed it, it's the stream of the user's tokens (accessToken and idToken).
117 |
118 | Let's try to decode `token$` to get some basic information about the user:
119 |
120 | ```javascript
121 | function Component(sources) {
122 | const tokens$ = sources.props.tokens$
123 |
124 | const user$ = tokens$
125 | .map(tokens => {
126 | return tokens ? // /!\ if user is not logged in, tokens is null
127 | jwtDecode(tokens.idToken) :
128 | null
129 | })
130 |
131 | return {
132 | DOM: user$
133 | .map(user => {
134 | return user ?
135 | div("hello " + user.nickname) : //logged
136 | div("Please log in") //not logged
137 | })
138 | }
139 | }
140 | ```
141 |
142 | Or if you want to request the full user profile from Auth0:
143 |
144 | ```diff
145 | function Component(sources) {
146 | const tokens$ = sources.props.tokens$
147 |
148 | const getUserInfoRequest$ = tokens$
149 | + .filter(tokens => !!tokens)
150 | + .map(tokens => {action: "getUserInfo", params: tokens.accessToken })
151 | - .map(tokens => {
152 | - return tokens ? // /!\ if user is not logged in, tokens is null
153 | - jwtDecode(tokens.idToken) :
154 | - null
155 | - })
156 |
157 | + const user$ = sources
158 | + .auth0
159 | + .select("getUserInfo")
160 | + .map(action => action.response)
161 |
162 | return {
163 | DOM: user$
164 | .map(user => {
165 | return user ?
166 | div("hello " + user.nickname) : //logged
167 | div("Please log in") //not logged
168 | }),
169 |
170 | + auth0: getUserInfoRequest$ //sending the user info request to the auth0 driver
171 | }
172 | }
173 | ```
174 |
175 | ## The driver
176 |
177 | ### Driver initialization
178 |
179 | ```javascript
180 | const drivers = {
181 | auth0: makeAuth0Driver(appKey, appDomain)
182 | }
183 |
184 | Cycle.run(main, drivers);
185 | ```
186 |
187 | The `makeAuth0Driver` will instantiate an Auth0 lock for your app. (See [Auth0 lock API documentation](https://github.com/auth0/lock#api).)
188 |
189 | ### Customizing the Auth0 login form
190 |
191 | You might also want to customize how the auth0 form displays. There is a config object you can pass on the the driver's constructor function to achieve that.
192 |
193 | ```javascript
194 | const auth0Config = {
195 | auth: {
196 | params: { scope: "openid nickname" },
197 | responseType: "token"
198 | }
199 | };
200 |
201 | const drivers = {
202 | auth0: makeAuth0Driver("appkey", "appdomain", auth0Config)
203 | }
204 | ```
205 |
206 | The parameters you can set are documented in the [Auth0 lock documentation](https://auth0.com/docs/libraries/lock/customization).
207 |
208 | ## The Auth0 lock
209 |
210 | ### Sending action to the Auth0 lock
211 |
212 | Now that your lock is instantiated and the driver configured, you can send an action to auth0. To do this you need to send a stream to the `auth0` driver in your app sinks.
213 |
214 | Right now the available actions are: `show`, `getUserInfo`, and `logout` (this logout replaces the [`lock` api logout](https://auth0.com/docs/libraries/lock/v10/api#logout-)).
215 |
216 | For example:
217 |
218 | ```javascript
219 | function main(sources) {
220 | return {
221 | auth0: xs.of({
222 | action: "show", //this will ask the auth0's lock to show the login form
223 | params: { //the options object that will be sent to the `show` method
224 | authParams: { scope: "openid nickname" },
225 | responseType: "token"
226 | }
227 | }),
228 |
229 | //... The other sinks of your app
230 | }
231 | }
232 | ```
233 |
234 | ### Reading responses from the Auth0 lock
235 |
236 | Whenever an action is run against the lock, the driver outputs a response stream. You can consume this stream using the `select` function. Then you can filter for the action you want to listen to. For example, if you want to do something when the lock has "shown", you can do the following:
237 |
238 | ```javascript
239 | function main({ auth0 }) {
240 | return {
241 | DOM: auth0
242 | .select("show")
243 | .map(div("Please log in")); //ok this example is lame ...
244 | }
245 | ```
246 |
247 | ## The tokens$
248 |
249 | ### I want my token
250 |
251 | Ok this whole authentication thing is here for one thing: getting the user's JSON Web Token.
252 | In order to get the token, the driver provides a `tokens$` stream that will output the user's idToken and accessToken. In case there are no tokens or the user is logged out the stream will output a `null` value (in that case you probably want to send the lock a `show` action).
253 |
254 | Here is a typical use of the `tokens$`:
255 |
256 | ```javascript
257 | function main({ auth0 }) {
258 | const userTokens$ = auth0.tokens$;
259 |
260 | const user$ = userTokens$
261 | .filter(token => !!token) //check that the token is not empty
262 | .map(token => jwtDecode(token.idToken)) //decode jwt to get the basic user's info
263 |
264 | return {
265 | auth0: userTokens$
266 | .filter(token => !token) //if token is null
267 | .mapTo({ action: "show" }) //then send auth0 the show action
268 | }
269 | }
270 | ```
271 |
272 | Nice thing about the `tokens$` is that it handles the **storage of the token into `localStorage`** for you. That means, if the user reloads the page, the `tokens$` will still output the token.
273 | To remove the token from the storage, don't forget to send the `logout` action.
274 |
275 | Here are the features of the `tokens$`:
276 |
277 | - stores the token in `localStorage` whenever an `authenticated` event is sent by the `lock`;
278 | - removes the token from `localStorage` when you send a `logout` action;
279 | - outputs the JWT token for you to consume.
280 |
281 | ### I want to deal with storage myself
282 |
283 | No problem, if you want to store the token yourself you need to:
284 | - **not** use the `tokens$` at all;
285 | - get the token by subscribing to `select("authenticated")`.
286 |
287 | Here is an example:
288 |
289 | ```javascript
290 | function main({ auth0, storage }) {
291 | var tokens$ = storage
292 | .local
293 | .getItem("token")
294 | .filter(tokens => !!tokens)
295 | .map(tokens => JSON.parse(tokens));
296 |
297 | //code that consumes the tokens$
298 |
299 | return {
300 | storage: auth0
301 | .select("authenticated")
302 | .map(response => ({ key: "token", value: JSON.stringify({
303 | idToken: response.idToken,
304 | accessToken: response.accessToken
305 | })})) //will send a store action to the storage driver
306 | }
307 | }
308 | ```
309 |
310 | ## Cycle.js Community
311 |
312 | To discover many awesome resources made by the community about Cycle.js (drivers, videos, components, utilities...) be sure to check [cyclejs-community/awesome-cyclejs](https://github.com/cyclejs-community/awesome-cyclejs) out. ;)
313 |
314 | ## Feedback
315 |
316 | - "OMG it's awesome, it has changed my life!"
317 | - "I use Auth0 like this, how can I do this with your driver?"
318 | - "Would you consider implementing this?"
319 | - "You should do this instead of that."
320 | - "You really don't know how to speak english you french guys."
321 |
322 | As long as it is constructive and polite, any feedback will be welcomed, so, please, be my guest :)
323 |
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | # 4.0.0
2 |
3 | - fix https://github.com/atomrc/cyclejs-auth0/issues/6 (access token in not available) (thanks @pauldailly)
4 |
5 | ## Breaking changes
6 |
7 | ### Component Wrapper's breaking changes
8 |
9 | - the signature of the decorator function has changed. Initialy, only the `idToken` was given to the function, now all the tokens are given (`idToken` + `accessToken`). To migrate your decorators, you just need to use the `idToken` of the `tokens` object
10 |
11 | ```diff
12 | const ProtectedComponent = protect(Component, {
13 | decorators: {
14 | - HTTP: (request, token) => {
15 | + HTTP: (request, tokens) => {
16 | return {
17 | ...request,
18 | headers: {
19 | ...request.headers,
20 | - "Authorization": "Bearer:" + token
21 | + "Authorization": "Bearer:" + tokens.accessToken
22 | }
23 | }
24 | }
25 | }
26 | });
27 | ```
28 |
29 |
30 | # 3.0.0
31 |
32 | Auth0 is deprecating the `getProfile` method. In order to be able to use the `getUserInfo` instead, the driver now send all the tokens given by Auth0 to your application
33 |
34 | ## Breaking changes
35 |
36 | ### Driver's breaking changes
37 | - the `token$` source is replaced with the `tokens$` source
38 | - the `tokens$` stream now emits an object instead of a single `token`
39 |
40 | ```javascript
41 | {
42 | idToken: "...", // the id token
43 | accessToken: "..." // the access token
44 | }
45 | ```
46 |
47 | ## New feature
48 |
49 | - the `getUserInfo` method is now available
50 |
51 |
--------------------------------------------------------------------------------
/example/README.md:
--------------------------------------------------------------------------------
1 | # Simple cyclejs-auth0 example
2 |
3 | Before running this example, please make sure you have an auth0 app created that you can feed to the driver.
4 | If not you can create one for free [here](https://auth0.com/)
5 |
6 | First you need to provide you auth0 app key and domain in the `src/index.js`.
7 | Then :
8 |
9 | npm install
10 | npm run build
11 | npm start
12 |
13 | Then you can open a browser at : [http://localhost:1337](http://localhost:1337)
14 |
15 |
--------------------------------------------------------------------------------
/example/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "example",
3 | "version": "1.0.0",
4 | "description": "cyclejs-auth0 example",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "build": "mkdir -p public; cp src/index.html public/index.html; webpack",
9 | "start": "http-server -p 1337 public"
10 | },
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "@cycle/dom": "^12.1.0",
15 | "@cycle/xstream-run": "^3.0.4",
16 | "cyclejs-auth0": "^3.0.0",
17 | "http-server": "^0.9.0",
18 | "json-loader": "^0.5.4",
19 | "jwt-decode": "^2.1.0"
20 | },
21 | "devDependencies": {
22 | "babel-core": "^6.13.2",
23 | "babel-loader": "^6.2.4",
24 | "babel-preset-es2015": "^6.13.2",
25 | "webpack": "^1.13.1"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/example/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/example/src/js/index.js:
--------------------------------------------------------------------------------
1 | import xs from "xstream";
2 | import {run} from "@cycle/xstream-run";
3 |
4 | import {makeAuth0Driver, protect} from "cyclejs-auth0";
5 | import {makeDOMDriver, div, button, pre} from "@cycle/dom";
6 | import jwt from "jwt-decode";
7 |
8 | const appKey = null; //TODO fill your app's key here
9 | const appDomain = null; //TODO fill your app's domain here
10 |
11 | function App({ DOM, auth0, props }) {
12 |
13 | const logout$ = DOM
14 | .select(".logout")
15 | .events("click")
16 | .mapTo({ action: "logout" });
17 |
18 | const showProfile$ = auth0
19 | .tokens$
20 | .map(tokens => DOM
21 | .select(".show-profile")
22 | .events("click")
23 | .mapTo({ action: "getUserInfo", params: tokens.accessToken })
24 | )
25 | .flatten()
26 |
27 | const profile$ = auth0
28 | .select("getUserInfo")
29 | .map(({ response }) => response);
30 |
31 | const state$ = xs
32 | .combine(props.tokens$, profile$.startWith(null))
33 | .map(([ tokens, profile ]) => ({
34 | user: tokens.idToken ? jwt(tokens.idToken): null,
35 | profile: profile
36 | }))
37 |
38 | return {
39 | DOM: state$
40 | .map(({ user, profile }) => {
41 |
42 | const profileNode = profile ?
43 | pre(JSON.stringify(profile, null, 2)) :
44 | null;
45 |
46 | return user ?
47 | div([
48 | div("hello " + user.nickname),
49 | button(".logout", "logout"),
50 | button(".show-profile", "Show profile"),
51 | profileNode
52 | ]) :
53 | div("please log in")
54 | }),
55 |
56 | auth0: xs.merge(logout$, showProfile$)
57 | }
58 | }
59 |
60 | function main(sources) {
61 | var app = protect(App)(sources);
62 |
63 | return {
64 | DOM: app.DOM,
65 | auth0: app.auth0
66 | };
67 | }
68 |
69 | var drivers = {
70 | DOM: makeDOMDriver("#main"),
71 | auth0: makeAuth0Driver(appKey, appDomain, {
72 | auth: {
73 | params: { scope: "openid nickname" },
74 | responseType: "token"
75 | }
76 | })
77 | };
78 |
79 | run(main, drivers);
80 |
--------------------------------------------------------------------------------
/example/webpack.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | entry: './src/js/index.js',
3 | output: {
4 | path: './public/js/',
5 | filename: 'index.js'
6 | },
7 |
8 | module: {
9 | loaders: [
10 | {
11 | test: /\.js/,
12 | exclude: /node_modules/,
13 | loader: 'babel-loader'
14 | }
15 | ]
16 | }
17 | };
18 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cyclejs-auth0",
3 | "version": "4.2.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "ansi-regex": {
8 | "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
9 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
10 | "dev": true
11 | },
12 | "ansi-styles": {
13 | "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
14 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
15 | "dev": true
16 | },
17 | "anymatch": {
18 | "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
19 | "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=",
20 | "dev": true,
21 | "optional": true,
22 | "requires": {
23 | "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
24 | "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz"
25 | }
26 | },
27 | "arr-diff": {
28 | "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
29 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
30 | "dev": true,
31 | "optional": true,
32 | "requires": {
33 | "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz"
34 | }
35 | },
36 | "arr-flatten": {
37 | "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz",
38 | "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=",
39 | "dev": true,
40 | "optional": true
41 | },
42 | "array-unique": {
43 | "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
44 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
45 | "dev": true,
46 | "optional": true
47 | },
48 | "arrify": {
49 | "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
50 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
51 | "dev": true,
52 | "optional": true
53 | },
54 | "asap": {
55 | "version": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz",
56 | "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8="
57 | },
58 | "async-each": {
59 | "version": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
60 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
61 | "dev": true,
62 | "optional": true
63 | },
64 | "asynckit": {
65 | "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
66 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
67 | },
68 | "auth0-js": {
69 | "version": "https://registry.npmjs.org/auth0-js/-/auth0-js-8.2.0.tgz",
70 | "integrity": "sha1-D8fpFqN4XahAkNXu1K4I23VTX74=",
71 | "requires": {
72 | "base64-js": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
73 | "idtoken-verifier": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.0.1.tgz",
74 | "superagent": "https://registry.npmjs.org/superagent/-/superagent-3.4.3.tgz",
75 | "url-join": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
76 | "winchan": "https://registry.npmjs.org/winchan/-/winchan-0.1.4.tgz"
77 | }
78 | },
79 | "auth0-lock": {
80 | "version": "https://registry.npmjs.org/auth0-lock/-/auth0-lock-10.11.0.tgz",
81 | "integrity": "sha1-X7O9vie55qPeMNwVROHGuu24bjA=",
82 | "requires": {
83 | "auth0-js": "https://registry.npmjs.org/auth0-js/-/auth0-js-8.2.0.tgz",
84 | "blueimp-md5": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.3.1.tgz",
85 | "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.3.2.tgz",
86 | "idtoken-verifier": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.0.1.tgz",
87 | "immutable": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz",
88 | "jsonp": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz",
89 | "password-sheriff": "https://registry.npmjs.org/password-sheriff/-/password-sheriff-1.0.1.tgz",
90 | "react": "https://registry.npmjs.org/react/-/react-15.4.2.tgz",
91 | "react-addons-css-transition-group": "https://registry.npmjs.org/react-addons-css-transition-group/-/react-addons-css-transition-group-15.4.2.tgz",
92 | "react-dom": "https://registry.npmjs.org/react-dom/-/react-dom-15.4.2.tgz",
93 | "superagent": "https://registry.npmjs.org/superagent/-/superagent-3.4.3.tgz",
94 | "trim": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
95 | "url-join": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz"
96 | }
97 | },
98 | "babel-cli": {
99 | "version": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.23.0.tgz",
100 | "integrity": "sha1-Uv+UaisPZGRcNee9XuomeqCUjA8=",
101 | "dev": true,
102 | "requires": {
103 | "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.23.1.tgz",
104 | "babel-polyfill": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
105 | "babel-register": "https://registry.npmjs.org/babel-register/-/babel-register-6.23.0.tgz",
106 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
107 | "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz",
108 | "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
109 | "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz",
110 | "fs-readdir-recursive": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz",
111 | "glob": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
112 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
113 | "output-file-sync": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
114 | "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
115 | "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
116 | "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
117 | "v8flags": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz"
118 | }
119 | },
120 | "babel-code-frame": {
121 | "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
122 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
123 | "dev": true,
124 | "requires": {
125 | "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
126 | "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
127 | "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz"
128 | }
129 | },
130 | "babel-core": {
131 | "version": "https://registry.npmjs.org/babel-core/-/babel-core-6.23.1.tgz",
132 | "integrity": "sha1-wUPLYhuy9iFxDCIMXVedFbikQt8=",
133 | "dev": true,
134 | "requires": {
135 | "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
136 | "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.23.0.tgz",
137 | "babel-helpers": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz",
138 | "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
139 | "babel-register": "https://registry.npmjs.org/babel-register/-/babel-register-6.23.0.tgz",
140 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
141 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
142 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
143 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
144 | "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.15.0.tgz",
145 | "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz",
146 | "debug": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
147 | "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
148 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
149 | "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
150 | "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
151 | "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
152 | "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
153 | "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
154 | }
155 | },
156 | "babel-generator": {
157 | "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.23.0.tgz",
158 | "integrity": "sha1-a47auVbvMRb3nYyExaPAXzKnS8U=",
159 | "dev": true,
160 | "requires": {
161 | "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
162 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
163 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
164 | "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
165 | "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
166 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
167 | "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
168 | "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz"
169 | }
170 | },
171 | "babel-helper-call-delegate": {
172 | "version": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz",
173 | "integrity": "sha1-EZkhtWEg8X6drj90tPXMe8wbN+8=",
174 | "dev": true,
175 | "requires": {
176 | "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz",
177 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
178 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
179 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
180 | }
181 | },
182 | "babel-helper-define-map": {
183 | "version": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz",
184 | "integrity": "sha1-FET5YMlpHWmiztaiBTFfj9AIBOc=",
185 | "dev": true,
186 | "requires": {
187 | "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz",
188 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
189 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
190 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz"
191 | }
192 | },
193 | "babel-helper-function-name": {
194 | "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz",
195 | "integrity": "sha1-JXQtZxdciQPb5LbLnZ4fy43PI6Y=",
196 | "dev": true,
197 | "requires": {
198 | "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz",
199 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
200 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
201 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
202 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
203 | }
204 | },
205 | "babel-helper-get-function-arity": {
206 | "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz",
207 | "integrity": "sha1-C+tGStadxzR0EKxq3p8DpQY09c4=",
208 | "dev": true,
209 | "requires": {
210 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
211 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
212 | }
213 | },
214 | "babel-helper-hoist-variables": {
215 | "version": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz",
216 | "integrity": "sha1-Pqy/cx2AcFhF3S6XGPYAz7m0unI=",
217 | "dev": true,
218 | "requires": {
219 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
220 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
221 | }
222 | },
223 | "babel-helper-optimise-call-expression": {
224 | "version": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz",
225 | "integrity": "sha1-8+5+7TVbQoITizPQK3g2nkcGIvU=",
226 | "dev": true,
227 | "requires": {
228 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
229 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
230 | }
231 | },
232 | "babel-helper-regex": {
233 | "version": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz",
234 | "integrity": "sha1-efUyvhZHsfDuNHS19cPaWAAdJH0=",
235 | "dev": true,
236 | "requires": {
237 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
238 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
239 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz"
240 | }
241 | },
242 | "babel-helper-replace-supers": {
243 | "version": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz",
244 | "integrity": "sha1-7q+K2bWOxDN8qUIjus3KH42bS/0=",
245 | "dev": true,
246 | "requires": {
247 | "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz",
248 | "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
249 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
250 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
251 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
252 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
253 | }
254 | },
255 | "babel-helpers": {
256 | "version": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.23.0.tgz",
257 | "integrity": "sha1-T48uCS0LaogIpL3nnCfx4uzw2ZI=",
258 | "dev": true,
259 | "requires": {
260 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
261 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
262 | }
263 | },
264 | "babel-messages": {
265 | "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
266 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
267 | "dev": true,
268 | "requires": {
269 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
270 | }
271 | },
272 | "babel-plugin-check-es2015-constants": {
273 | "version": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
274 | "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
275 | "dev": true,
276 | "requires": {
277 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
278 | }
279 | },
280 | "babel-plugin-syntax-object-rest-spread": {
281 | "version": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
282 | "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
283 | "dev": true
284 | },
285 | "babel-plugin-transform-es2015-arrow-functions": {
286 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
287 | "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
288 | "dev": true,
289 | "requires": {
290 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
291 | }
292 | },
293 | "babel-plugin-transform-es2015-block-scoped-functions": {
294 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
295 | "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
296 | "dev": true,
297 | "requires": {
298 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
299 | }
300 | },
301 | "babel-plugin-transform-es2015-block-scoping": {
302 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz",
303 | "integrity": "sha1-5IiVzws3W+FIzXyIebQicHoFO1E=",
304 | "dev": true,
305 | "requires": {
306 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
307 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
308 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
309 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
310 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz"
311 | }
312 | },
313 | "babel-plugin-transform-es2015-classes": {
314 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz",
315 | "integrity": "sha1-SbU/MmICov0bO7ql4u3YpPeGQ8E=",
316 | "dev": true,
317 | "requires": {
318 | "babel-helper-define-map": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz",
319 | "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz",
320 | "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz",
321 | "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz",
322 | "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
323 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
324 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
325 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
326 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
327 | }
328 | },
329 | "babel-plugin-transform-es2015-computed-properties": {
330 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz",
331 | "integrity": "sha1-fDg+lim7pIIMEbBCW91ikPfwV+c=",
332 | "dev": true,
333 | "requires": {
334 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
335 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
336 | }
337 | },
338 | "babel-plugin-transform-es2015-destructuring": {
339 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
340 | "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
341 | "dev": true,
342 | "requires": {
343 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
344 | }
345 | },
346 | "babel-plugin-transform-es2015-duplicate-keys": {
347 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz",
348 | "integrity": "sha1-ZyOXAxwhYQ1y3Su7C6n7Ynfhw2s=",
349 | "dev": true,
350 | "requires": {
351 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
352 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
353 | }
354 | },
355 | "babel-plugin-transform-es2015-for-of": {
356 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
357 | "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
358 | "dev": true,
359 | "requires": {
360 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
361 | }
362 | },
363 | "babel-plugin-transform-es2015-function-name": {
364 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz",
365 | "integrity": "sha1-9fzIsJCT+aI8dqw9njksPsS3cQQ=",
366 | "dev": true,
367 | "requires": {
368 | "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz",
369 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
370 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
371 | }
372 | },
373 | "babel-plugin-transform-es2015-literals": {
374 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
375 | "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
376 | "dev": true,
377 | "requires": {
378 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
379 | }
380 | },
381 | "babel-plugin-transform-es2015-modules-amd": {
382 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz",
383 | "integrity": "sha1-v2nNNIiaQcM9kN+3QOAJHM/1LyE=",
384 | "dev": true,
385 | "requires": {
386 | "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz",
387 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
388 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
389 | }
390 | },
391 | "babel-plugin-transform-es2015-modules-commonjs": {
392 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz",
393 | "integrity": "sha1-y6eqY3n7fsmSUObUbeKXOq/6e5I=",
394 | "dev": true,
395 | "requires": {
396 | "babel-plugin-transform-strict-mode": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz",
397 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
398 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
399 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
400 | }
401 | },
402 | "babel-plugin-transform-es2015-modules-systemjs": {
403 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz",
404 | "integrity": "sha1-rjRpIn/6w5sDENkP7HO/3E9jF7A=",
405 | "dev": true,
406 | "requires": {
407 | "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz",
408 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
409 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
410 | }
411 | },
412 | "babel-plugin-transform-es2015-modules-umd": {
413 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz",
414 | "integrity": "sha1-jShK4uGe2P4h0rGybW5+D82U8PE=",
415 | "dev": true,
416 | "requires": {
417 | "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz",
418 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
419 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz"
420 | }
421 | },
422 | "babel-plugin-transform-es2015-object-super": {
423 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz",
424 | "integrity": "sha1-2qYOEUoELqdp3VP+Uo/IIxHrmPw=",
425 | "dev": true,
426 | "requires": {
427 | "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz",
428 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
429 | }
430 | },
431 | "babel-plugin-transform-es2015-parameters": {
432 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz",
433 | "integrity": "sha1-OiqrtwyK+UXVzjhvGkJQYlqDrjs=",
434 | "dev": true,
435 | "requires": {
436 | "babel-helper-call-delegate": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz",
437 | "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz",
438 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
439 | "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
440 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
441 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
442 | }
443 | },
444 | "babel-plugin-transform-es2015-shorthand-properties": {
445 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz",
446 | "integrity": "sha1-i6d24K/6pgv/IekhQDuKZSov9yM=",
447 | "dev": true,
448 | "requires": {
449 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
450 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
451 | }
452 | },
453 | "babel-plugin-transform-es2015-spread": {
454 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
455 | "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
456 | "dev": true,
457 | "requires": {
458 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
459 | }
460 | },
461 | "babel-plugin-transform-es2015-sticky-regex": {
462 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz",
463 | "integrity": "sha1-qzFoKehm7j9LnrlpOXV9GaW8RZM=",
464 | "dev": true,
465 | "requires": {
466 | "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz",
467 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
468 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
469 | }
470 | },
471 | "babel-plugin-transform-es2015-template-literals": {
472 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
473 | "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
474 | "dev": true,
475 | "requires": {
476 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
477 | }
478 | },
479 | "babel-plugin-transform-es2015-typeof-symbol": {
480 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
481 | "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
482 | "dev": true,
483 | "requires": {
484 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
485 | }
486 | },
487 | "babel-plugin-transform-es2015-unicode-regex": {
488 | "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz",
489 | "integrity": "sha1-jZzCfn7h3s/mVFT7mGRSoEphPSA=",
490 | "dev": true,
491 | "requires": {
492 | "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz",
493 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
494 | "regexpu-core": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz"
495 | }
496 | },
497 | "babel-plugin-transform-object-rest-spread": {
498 | "version": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz",
499 | "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=",
500 | "dev": true,
501 | "requires": {
502 | "babel-plugin-syntax-object-rest-spread": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
503 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz"
504 | }
505 | },
506 | "babel-plugin-transform-regenerator": {
507 | "version": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz",
508 | "integrity": "sha1-ZXQFk6MZxEUiFXU41pC4QJRhfqY=",
509 | "dev": true,
510 | "requires": {
511 | "regenerator-transform": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.8.tgz"
512 | }
513 | },
514 | "babel-plugin-transform-strict-mode": {
515 | "version": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz",
516 | "integrity": "sha1-4AjfATQP3IfpWdplmRt+BZcMjHw=",
517 | "dev": true,
518 | "requires": {
519 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
520 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz"
521 | }
522 | },
523 | "babel-polyfill": {
524 | "version": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
525 | "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
526 | "dev": true,
527 | "requires": {
528 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
529 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
530 | "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz"
531 | },
532 | "dependencies": {
533 | "core-js": {
534 | "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
535 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
536 | "dev": true
537 | }
538 | }
539 | },
540 | "babel-preset-es2015": {
541 | "version": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz",
542 | "integrity": "sha1-r1qY7LNeuK92StiloF6zbcQ4aDU=",
543 | "dev": true,
544 | "requires": {
545 | "babel-plugin-check-es2015-constants": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
546 | "babel-plugin-transform-es2015-arrow-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
547 | "babel-plugin-transform-es2015-block-scoped-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
548 | "babel-plugin-transform-es2015-block-scoping": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz",
549 | "babel-plugin-transform-es2015-classes": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz",
550 | "babel-plugin-transform-es2015-computed-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz",
551 | "babel-plugin-transform-es2015-destructuring": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
552 | "babel-plugin-transform-es2015-duplicate-keys": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz",
553 | "babel-plugin-transform-es2015-for-of": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
554 | "babel-plugin-transform-es2015-function-name": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz",
555 | "babel-plugin-transform-es2015-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
556 | "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz",
557 | "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz",
558 | "babel-plugin-transform-es2015-modules-systemjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz",
559 | "babel-plugin-transform-es2015-modules-umd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz",
560 | "babel-plugin-transform-es2015-object-super": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz",
561 | "babel-plugin-transform-es2015-parameters": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz",
562 | "babel-plugin-transform-es2015-shorthand-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz",
563 | "babel-plugin-transform-es2015-spread": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
564 | "babel-plugin-transform-es2015-sticky-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz",
565 | "babel-plugin-transform-es2015-template-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
566 | "babel-plugin-transform-es2015-typeof-symbol": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
567 | "babel-plugin-transform-es2015-unicode-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz",
568 | "babel-plugin-transform-regenerator": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz"
569 | }
570 | },
571 | "babel-register": {
572 | "version": "https://registry.npmjs.org/babel-register/-/babel-register-6.23.0.tgz",
573 | "integrity": "sha1-yao9TMqUtR2jSCbEoPnggUXXT/M=",
574 | "dev": true,
575 | "requires": {
576 | "babel-core": "https://registry.npmjs.org/babel-core/-/babel-core-6.23.1.tgz",
577 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
578 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
579 | "home-or-tmp": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
580 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
581 | "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
582 | "source-map-support": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.11.tgz"
583 | },
584 | "dependencies": {
585 | "core-js": {
586 | "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
587 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
588 | "dev": true
589 | }
590 | }
591 | },
592 | "babel-runtime": {
593 | "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
594 | "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
595 | "dev": true,
596 | "requires": {
597 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
598 | "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz"
599 | },
600 | "dependencies": {
601 | "core-js": {
602 | "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
603 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
604 | "dev": true
605 | }
606 | }
607 | },
608 | "babel-template": {
609 | "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
610 | "integrity": "sha1-BNTycK27OqcEqBQ64m+qUpI45jg=",
611 | "dev": true,
612 | "requires": {
613 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
614 | "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
615 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
616 | "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.15.0.tgz",
617 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz"
618 | }
619 | },
620 | "babel-traverse": {
621 | "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
622 | "integrity": "sha1-08tZAQ7NBql9gTEAZflmtpnhT0g=",
623 | "dev": true,
624 | "requires": {
625 | "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
626 | "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
627 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
628 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
629 | "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.15.0.tgz",
630 | "debug": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
631 | "globals": "https://registry.npmjs.org/globals/-/globals-9.15.0.tgz",
632 | "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
633 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz"
634 | }
635 | },
636 | "babel-types": {
637 | "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
638 | "integrity": "sha1-uxcXnXU4utOM0MnhFdNA935+ms8=",
639 | "dev": true,
640 | "requires": {
641 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
642 | "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
643 | "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
644 | "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz"
645 | }
646 | },
647 | "babylon": {
648 | "version": "https://registry.npmjs.org/babylon/-/babylon-6.15.0.tgz",
649 | "integrity": "sha1-umXPoagOF1mw6J+1YuJ9zK5wNI4=",
650 | "dev": true
651 | },
652 | "balanced-match": {
653 | "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
654 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
655 | "dev": true
656 | },
657 | "base64-js": {
658 | "version": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
659 | "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE="
660 | },
661 | "base64url": {
662 | "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
663 | "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=",
664 | "dev": true
665 | },
666 | "binary-extensions": {
667 | "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz",
668 | "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=",
669 | "dev": true,
670 | "optional": true
671 | },
672 | "blueimp-md5": {
673 | "version": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.3.1.tgz",
674 | "integrity": "sha1-mSpnN3M7naHt1kFVDcOsqy6c/Fo="
675 | },
676 | "brace-expansion": {
677 | "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
678 | "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=",
679 | "dev": true,
680 | "requires": {
681 | "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
682 | "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
683 | }
684 | },
685 | "braces": {
686 | "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
687 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
688 | "dev": true,
689 | "optional": true,
690 | "requires": {
691 | "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
692 | "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
693 | "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz"
694 | }
695 | },
696 | "browser-stdout": {
697 | "version": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
698 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
699 | "dev": true
700 | },
701 | "buffer-equal-constant-time": {
702 | "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
703 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=",
704 | "dev": true
705 | },
706 | "buffer-shims": {
707 | "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
708 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E="
709 | },
710 | "chalk": {
711 | "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
712 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
713 | "dev": true,
714 | "requires": {
715 | "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
716 | "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
717 | "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
718 | "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
719 | "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
720 | }
721 | },
722 | "chokidar": {
723 | "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz",
724 | "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=",
725 | "dev": true,
726 | "optional": true,
727 | "requires": {
728 | "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz",
729 | "async-each": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
730 | "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
731 | "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
732 | "is-binary-path": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
733 | "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
734 | "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
735 | "readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz"
736 | }
737 | },
738 | "combined-stream": {
739 | "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
740 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
741 | "requires": {
742 | "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
743 | }
744 | },
745 | "commander": {
746 | "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
747 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
748 | "dev": true,
749 | "requires": {
750 | "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
751 | }
752 | },
753 | "component-emitter": {
754 | "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
755 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
756 | },
757 | "concat-map": {
758 | "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
759 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
760 | "dev": true
761 | },
762 | "convert-source-map": {
763 | "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz",
764 | "integrity": "sha1-49rRlb9hv+E6ejxz6YduwUoCaPM=",
765 | "dev": true
766 | },
767 | "cookiejar": {
768 | "version": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.0.tgz",
769 | "integrity": "sha1-hlSWiVObbQ4mm2Y3owS+UIGU2Jg="
770 | },
771 | "core-js": {
772 | "version": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
773 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
774 | },
775 | "core-util-is": {
776 | "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
777 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
778 | },
779 | "crypto-js": {
780 | "version": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
781 | "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg="
782 | },
783 | "debug": {
784 | "version": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
785 | "integrity": "sha1-eYVQkLosTjEVzH2HaUkdWPBJE1E=",
786 | "requires": {
787 | "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz"
788 | }
789 | },
790 | "delayed-stream": {
791 | "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
792 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
793 | },
794 | "detect-indent": {
795 | "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
796 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
797 | "dev": true,
798 | "requires": {
799 | "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz"
800 | }
801 | },
802 | "diff": {
803 | "version": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
804 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
805 | "dev": true
806 | },
807 | "ecdsa-sig-formatter": {
808 | "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
809 | "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
810 | "dev": true,
811 | "requires": {
812 | "base64url": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
813 | "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz"
814 | }
815 | },
816 | "encoding": {
817 | "version": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
818 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
819 | "requires": {
820 | "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz"
821 | }
822 | },
823 | "escape-string-regexp": {
824 | "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
825 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
826 | "dev": true
827 | },
828 | "esutils": {
829 | "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
830 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
831 | "dev": true
832 | },
833 | "expand-brackets": {
834 | "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
835 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
836 | "dev": true,
837 | "optional": true,
838 | "requires": {
839 | "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"
840 | }
841 | },
842 | "expand-range": {
843 | "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
844 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
845 | "dev": true,
846 | "optional": true,
847 | "requires": {
848 | "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz"
849 | }
850 | },
851 | "expect.js": {
852 | "version": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz",
853 | "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=",
854 | "dev": true
855 | },
856 | "extend": {
857 | "version": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
858 | "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ="
859 | },
860 | "extglob": {
861 | "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
862 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
863 | "dev": true,
864 | "optional": true,
865 | "requires": {
866 | "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
867 | }
868 | },
869 | "fbjs": {
870 | "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.3.2.tgz",
871 | "integrity": "sha1-AzpUBZUIS13jUJpAXQbxoqjlufs=",
872 | "requires": {
873 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
874 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
875 | "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
876 | "ua-parser-js": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz",
877 | "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz"
878 | }
879 | },
880 | "filename-regex": {
881 | "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz",
882 | "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=",
883 | "dev": true,
884 | "optional": true
885 | },
886 | "fill-range": {
887 | "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
888 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
889 | "dev": true,
890 | "optional": true,
891 | "requires": {
892 | "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
893 | "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
894 | "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
895 | "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
896 | "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
897 | }
898 | },
899 | "for-in": {
900 | "version": "https://registry.npmjs.org/for-in/-/for-in-0.1.6.tgz",
901 | "integrity": "sha1-yfluib+tGKVFr17D7TUqHZ5bTcg=",
902 | "dev": true,
903 | "optional": true
904 | },
905 | "for-own": {
906 | "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz",
907 | "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=",
908 | "dev": true,
909 | "optional": true,
910 | "requires": {
911 | "for-in": "https://registry.npmjs.org/for-in/-/for-in-0.1.6.tgz"
912 | }
913 | },
914 | "form-data": {
915 | "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz",
916 | "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=",
917 | "requires": {
918 | "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
919 | "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
920 | "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz"
921 | }
922 | },
923 | "formidable": {
924 | "version": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz",
925 | "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak="
926 | },
927 | "fs-readdir-recursive": {
928 | "version": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz",
929 | "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=",
930 | "dev": true
931 | },
932 | "fs.realpath": {
933 | "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
934 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
935 | "dev": true
936 | },
937 | "glob": {
938 | "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
939 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
940 | "dev": true,
941 | "requires": {
942 | "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
943 | "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
944 | "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
945 | "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
946 | "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
947 | "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
948 | }
949 | },
950 | "glob-base": {
951 | "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
952 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
953 | "dev": true,
954 | "optional": true,
955 | "requires": {
956 | "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
957 | "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
958 | }
959 | },
960 | "glob-parent": {
961 | "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
962 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
963 | "dev": true,
964 | "requires": {
965 | "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
966 | }
967 | },
968 | "globals": {
969 | "version": "https://registry.npmjs.org/globals/-/globals-9.15.0.tgz",
970 | "integrity": "sha1-el2P2GXmnekQsJCxWod3L5Qjxd4=",
971 | "dev": true
972 | },
973 | "graceful-fs": {
974 | "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
975 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
976 | "dev": true
977 | },
978 | "graceful-readlink": {
979 | "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
980 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
981 | "dev": true
982 | },
983 | "growl": {
984 | "version": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
985 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
986 | "dev": true
987 | },
988 | "has-ansi": {
989 | "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
990 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
991 | "dev": true,
992 | "requires": {
993 | "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
994 | }
995 | },
996 | "has-flag": {
997 | "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
998 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
999 | "dev": true
1000 | },
1001 | "hoek": {
1002 | "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
1003 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
1004 | "dev": true
1005 | },
1006 | "home-or-tmp": {
1007 | "version": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
1008 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
1009 | "dev": true,
1010 | "requires": {
1011 | "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1012 | "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
1013 | }
1014 | },
1015 | "iconv-lite": {
1016 | "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
1017 | "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
1018 | },
1019 | "idtoken-verifier": {
1020 | "version": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.0.1.tgz",
1021 | "integrity": "sha1-dWOvI437xaoplXRMN78B3qOtCKs=",
1022 | "requires": {
1023 | "base64-js": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
1024 | "crypto-js": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
1025 | "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1026 | "superagent": "https://registry.npmjs.org/superagent/-/superagent-3.4.3.tgz",
1027 | "url-join": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz"
1028 | }
1029 | },
1030 | "immutable": {
1031 | "version": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz",
1032 | "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI="
1033 | },
1034 | "inflight": {
1035 | "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1036 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1037 | "dev": true,
1038 | "requires": {
1039 | "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1040 | "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
1041 | }
1042 | },
1043 | "inherits": {
1044 | "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1045 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
1046 | },
1047 | "invariant": {
1048 | "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
1049 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
1050 | "dev": true,
1051 | "requires": {
1052 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz"
1053 | }
1054 | },
1055 | "is-binary-path": {
1056 | "version": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
1057 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
1058 | "dev": true,
1059 | "optional": true,
1060 | "requires": {
1061 | "binary-extensions": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz"
1062 | }
1063 | },
1064 | "is-buffer": {
1065 | "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz",
1066 | "integrity": "sha1-z8hszV3FpS+oBIkRHGkgxFfi2Ys=",
1067 | "dev": true
1068 | },
1069 | "is-dotfile": {
1070 | "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
1071 | "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=",
1072 | "dev": true,
1073 | "optional": true
1074 | },
1075 | "is-equal-shallow": {
1076 | "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
1077 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
1078 | "dev": true,
1079 | "optional": true,
1080 | "requires": {
1081 | "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
1082 | }
1083 | },
1084 | "is-extendable": {
1085 | "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
1086 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
1087 | "dev": true,
1088 | "optional": true
1089 | },
1090 | "is-extglob": {
1091 | "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
1092 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
1093 | "dev": true
1094 | },
1095 | "is-finite": {
1096 | "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
1097 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
1098 | "dev": true,
1099 | "requires": {
1100 | "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz"
1101 | }
1102 | },
1103 | "is-glob": {
1104 | "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
1105 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
1106 | "dev": true,
1107 | "requires": {
1108 | "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
1109 | }
1110 | },
1111 | "is-number": {
1112 | "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
1113 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
1114 | "dev": true,
1115 | "requires": {
1116 | "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz"
1117 | }
1118 | },
1119 | "is-posix-bracket": {
1120 | "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
1121 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
1122 | "dev": true,
1123 | "optional": true
1124 | },
1125 | "is-primitive": {
1126 | "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
1127 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
1128 | "dev": true
1129 | },
1130 | "is-stream": {
1131 | "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1132 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
1133 | },
1134 | "isarray": {
1135 | "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1136 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1137 | },
1138 | "isemail": {
1139 | "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
1140 | "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=",
1141 | "dev": true
1142 | },
1143 | "isobject": {
1144 | "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
1145 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
1146 | "dev": true,
1147 | "optional": true,
1148 | "requires": {
1149 | "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
1150 | }
1151 | },
1152 | "isomorphic-fetch": {
1153 | "version": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
1154 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
1155 | "requires": {
1156 | "node-fetch": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
1157 | "whatwg-fetch": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.2.tgz"
1158 | },
1159 | "dependencies": {
1160 | "whatwg-fetch": {
1161 | "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.2.tgz",
1162 | "integrity": "sha1-/ilNHYnjbFvosxlQV/LkvHT8mA4="
1163 | }
1164 | }
1165 | },
1166 | "joi": {
1167 | "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
1168 | "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
1169 | "dev": true,
1170 | "requires": {
1171 | "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
1172 | "isemail": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
1173 | "moment": "https://registry.npmjs.org/moment/-/moment-2.17.1.tgz",
1174 | "topo": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz"
1175 | }
1176 | },
1177 | "js-tokens": {
1178 | "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
1179 | "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc="
1180 | },
1181 | "jsbn": {
1182 | "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1183 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
1184 | },
1185 | "jsesc": {
1186 | "version": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
1187 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
1188 | "dev": true
1189 | },
1190 | "json3": {
1191 | "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
1192 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
1193 | "dev": true
1194 | },
1195 | "json5": {
1196 | "version": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
1197 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
1198 | "dev": true
1199 | },
1200 | "jsonp": {
1201 | "version": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz",
1202 | "integrity": "sha1-pltPoPEL2nGaBUQep7lMVfPhW64=",
1203 | "requires": {
1204 | "debug": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz"
1205 | }
1206 | },
1207 | "jsonwebtoken": {
1208 | "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.3.0.tgz",
1209 | "integrity": "sha1-hRGNanDj/M3xQ4n056HD+cip+7o=",
1210 | "dev": true,
1211 | "requires": {
1212 | "joi": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
1213 | "jws": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
1214 | "lodash.once": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1215 | "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
1216 | "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
1217 | }
1218 | },
1219 | "jwa": {
1220 | "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
1221 | "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
1222 | "dev": true,
1223 | "requires": {
1224 | "base64url": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
1225 | "buffer-equal-constant-time": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
1226 | "ecdsa-sig-formatter": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
1227 | "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz"
1228 | }
1229 | },
1230 | "jws": {
1231 | "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
1232 | "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
1233 | "dev": true,
1234 | "requires": {
1235 | "base64url": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
1236 | "jwa": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
1237 | "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz"
1238 | }
1239 | },
1240 | "kind-of": {
1241 | "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
1242 | "integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c=",
1243 | "dev": true,
1244 | "requires": {
1245 | "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz"
1246 | }
1247 | },
1248 | "lodash": {
1249 | "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
1250 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
1251 | "dev": true
1252 | },
1253 | "lodash._baseassign": {
1254 | "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
1255 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
1256 | "dev": true,
1257 | "requires": {
1258 | "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
1259 | "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz"
1260 | }
1261 | },
1262 | "lodash._basecopy": {
1263 | "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
1264 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
1265 | "dev": true
1266 | },
1267 | "lodash._basecreate": {
1268 | "version": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
1269 | "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
1270 | "dev": true
1271 | },
1272 | "lodash._getnative": {
1273 | "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
1274 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
1275 | "dev": true
1276 | },
1277 | "lodash._isiterateecall": {
1278 | "version": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
1279 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
1280 | "dev": true
1281 | },
1282 | "lodash.create": {
1283 | "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
1284 | "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
1285 | "dev": true,
1286 | "requires": {
1287 | "lodash._baseassign": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
1288 | "lodash._basecreate": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
1289 | "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"
1290 | }
1291 | },
1292 | "lodash.isarguments": {
1293 | "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
1294 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
1295 | "dev": true
1296 | },
1297 | "lodash.isarray": {
1298 | "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
1299 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
1300 | "dev": true
1301 | },
1302 | "lodash.keys": {
1303 | "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
1304 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
1305 | "dev": true,
1306 | "requires": {
1307 | "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
1308 | "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
1309 | "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz"
1310 | }
1311 | },
1312 | "lodash.once": {
1313 | "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1314 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
1315 | "dev": true
1316 | },
1317 | "loose-envify": {
1318 | "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1319 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
1320 | "requires": {
1321 | "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz"
1322 | }
1323 | },
1324 | "methods": {
1325 | "version": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1326 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1327 | },
1328 | "micromatch": {
1329 | "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
1330 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
1331 | "dev": true,
1332 | "optional": true,
1333 | "requires": {
1334 | "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
1335 | "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
1336 | "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
1337 | "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
1338 | "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
1339 | "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz",
1340 | "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
1341 | "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
1342 | "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
1343 | "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz",
1344 | "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
1345 | "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
1346 | "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz"
1347 | }
1348 | },
1349 | "mime": {
1350 | "version": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
1351 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
1352 | },
1353 | "mime-db": {
1354 | "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz",
1355 | "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8="
1356 | },
1357 | "mime-types": {
1358 | "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz",
1359 | "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=",
1360 | "requires": {
1361 | "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz"
1362 | }
1363 | },
1364 | "minimatch": {
1365 | "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
1366 | "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
1367 | "dev": true,
1368 | "requires": {
1369 | "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz"
1370 | }
1371 | },
1372 | "minimist": {
1373 | "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1374 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1375 | "dev": true
1376 | },
1377 | "mkdirp": {
1378 | "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1379 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1380 | "dev": true,
1381 | "requires": {
1382 | "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
1383 | }
1384 | },
1385 | "mocha": {
1386 | "version": "https://registry.npmjs.org/mocha/-/mocha-3.2.0.tgz",
1387 | "integrity": "sha1-fcT0XlCIB1FxpoiWgU5q6et6heM=",
1388 | "dev": true,
1389 | "requires": {
1390 | "browser-stdout": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
1391 | "commander": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
1392 | "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
1393 | "diff": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
1394 | "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1395 | "glob": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
1396 | "growl": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
1397 | "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
1398 | "lodash.create": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
1399 | "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1400 | "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz"
1401 | },
1402 | "dependencies": {
1403 | "debug": {
1404 | "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
1405 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
1406 | "dev": true,
1407 | "requires": {
1408 | "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
1409 | }
1410 | },
1411 | "glob": {
1412 | "version": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
1413 | "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=",
1414 | "dev": true,
1415 | "requires": {
1416 | "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1417 | "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1418 | "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1419 | "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
1420 | "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1421 | "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
1422 | }
1423 | },
1424 | "ms": {
1425 | "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
1426 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
1427 | "dev": true
1428 | },
1429 | "supports-color": {
1430 | "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
1431 | "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
1432 | "dev": true,
1433 | "requires": {
1434 | "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz"
1435 | }
1436 | }
1437 | }
1438 | },
1439 | "moment": {
1440 | "version": "https://registry.npmjs.org/moment/-/moment-2.17.1.tgz",
1441 | "integrity": "sha1-/tlQYGPzaxDwZsi1mhRNf66+HYI=",
1442 | "dev": true
1443 | },
1444 | "ms": {
1445 | "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
1446 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
1447 | },
1448 | "node-fetch": {
1449 | "version": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
1450 | "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
1451 | "requires": {
1452 | "encoding": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
1453 | "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz"
1454 | }
1455 | },
1456 | "normalize-path": {
1457 | "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz",
1458 | "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=",
1459 | "dev": true,
1460 | "optional": true
1461 | },
1462 | "number-is-nan": {
1463 | "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1464 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1465 | "dev": true
1466 | },
1467 | "object-assign": {
1468 | "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1469 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1470 | },
1471 | "object.omit": {
1472 | "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
1473 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
1474 | "dev": true,
1475 | "optional": true,
1476 | "requires": {
1477 | "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz",
1478 | "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
1479 | }
1480 | },
1481 | "once": {
1482 | "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1483 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1484 | "dev": true,
1485 | "requires": {
1486 | "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
1487 | }
1488 | },
1489 | "os-homedir": {
1490 | "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1491 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1492 | "dev": true
1493 | },
1494 | "os-tmpdir": {
1495 | "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1496 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1497 | "dev": true
1498 | },
1499 | "output-file-sync": {
1500 | "version": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
1501 | "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
1502 | "dev": true,
1503 | "requires": {
1504 | "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
1505 | "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1506 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
1507 | }
1508 | },
1509 | "parse-glob": {
1510 | "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
1511 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
1512 | "dev": true,
1513 | "optional": true,
1514 | "requires": {
1515 | "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
1516 | "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
1517 | "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
1518 | "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
1519 | }
1520 | },
1521 | "password-sheriff": {
1522 | "version": "https://registry.npmjs.org/password-sheriff/-/password-sheriff-1.0.1.tgz",
1523 | "integrity": "sha1-/WP7tEcUJYomQZ9IAMMSHg3LQLI=",
1524 | "requires": {
1525 | "underscore": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz"
1526 | }
1527 | },
1528 | "path-is-absolute": {
1529 | "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1530 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1531 | "dev": true
1532 | },
1533 | "preserve": {
1534 | "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
1535 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
1536 | "dev": true,
1537 | "optional": true
1538 | },
1539 | "private": {
1540 | "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
1541 | "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=",
1542 | "dev": true
1543 | },
1544 | "process-nextick-args": {
1545 | "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
1546 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
1547 | },
1548 | "promise": {
1549 | "version": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
1550 | "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=",
1551 | "requires": {
1552 | "asap": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz"
1553 | }
1554 | },
1555 | "qs": {
1556 | "version": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz",
1557 | "integrity": "sha1-9AOyZPI7wBIox0ExtAfxjV6l1EI="
1558 | },
1559 | "randomatic": {
1560 | "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
1561 | "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=",
1562 | "dev": true,
1563 | "optional": true,
1564 | "requires": {
1565 | "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
1566 | "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz"
1567 | }
1568 | },
1569 | "react": {
1570 | "version": "https://registry.npmjs.org/react/-/react-15.4.2.tgz",
1571 | "integrity": "sha1-QfeZGyYYU5K6m66WyIiefgGDl+8=",
1572 | "requires": {
1573 | "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.9.tgz",
1574 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1575 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
1576 | },
1577 | "dependencies": {
1578 | "fbjs": {
1579 | "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.9.tgz",
1580 | "integrity": "sha1-GAJH+9NH3MkARRe5BPhlQAoMjxQ=",
1581 | "requires": {
1582 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
1583 | "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
1584 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1585 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1586 | "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
1587 | "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
1588 | "ua-parser-js": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz"
1589 | }
1590 | }
1591 | }
1592 | },
1593 | "react-addons-css-transition-group": {
1594 | "version": "https://registry.npmjs.org/react-addons-css-transition-group/-/react-addons-css-transition-group-15.4.2.tgz",
1595 | "integrity": "sha1-t4KINN+hQin+B3UOMx6KjLb7d0U=",
1596 | "requires": {
1597 | "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.9.tgz",
1598 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
1599 | },
1600 | "dependencies": {
1601 | "fbjs": {
1602 | "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.9.tgz",
1603 | "integrity": "sha1-GAJH+9NH3MkARRe5BPhlQAoMjxQ=",
1604 | "requires": {
1605 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
1606 | "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
1607 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1608 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1609 | "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
1610 | "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
1611 | "ua-parser-js": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz"
1612 | }
1613 | }
1614 | }
1615 | },
1616 | "react-dom": {
1617 | "version": "https://registry.npmjs.org/react-dom/-/react-dom-15.4.2.tgz",
1618 | "integrity": "sha1-AVNj8FsKH9Uq6e/dOgBg2QaVII8=",
1619 | "requires": {
1620 | "fbjs": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.9.tgz",
1621 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1622 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
1623 | },
1624 | "dependencies": {
1625 | "fbjs": {
1626 | "version": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.9.tgz",
1627 | "integrity": "sha1-GAJH+9NH3MkARRe5BPhlQAoMjxQ=",
1628 | "requires": {
1629 | "core-js": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
1630 | "isomorphic-fetch": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
1631 | "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
1632 | "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1633 | "promise": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
1634 | "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
1635 | "ua-parser-js": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz"
1636 | }
1637 | }
1638 | }
1639 | },
1640 | "readable-stream": {
1641 | "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz",
1642 | "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=",
1643 | "requires": {
1644 | "buffer-shims": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
1645 | "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1646 | "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1647 | "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1648 | "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
1649 | "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1650 | "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
1651 | }
1652 | },
1653 | "readdirp": {
1654 | "version": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
1655 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
1656 | "dev": true,
1657 | "optional": true,
1658 | "requires": {
1659 | "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
1660 | "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
1661 | "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz",
1662 | "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"
1663 | }
1664 | },
1665 | "regenerate": {
1666 | "version": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz",
1667 | "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=",
1668 | "dev": true
1669 | },
1670 | "regenerator-runtime": {
1671 | "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz",
1672 | "integrity": "sha1-JX9BlhzkRVixj3gUr0jBdVn5+us=",
1673 | "dev": true
1674 | },
1675 | "regenerator-transform": {
1676 | "version": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.8.tgz",
1677 | "integrity": "sha1-D4i7K8A5Mt23trcxLmgHjwECbWw=",
1678 | "dev": true,
1679 | "requires": {
1680 | "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
1681 | "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
1682 | "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz"
1683 | }
1684 | },
1685 | "regex-cache": {
1686 | "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
1687 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
1688 | "dev": true,
1689 | "optional": true,
1690 | "requires": {
1691 | "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
1692 | "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
1693 | }
1694 | },
1695 | "regexpu-core": {
1696 | "version": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
1697 | "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
1698 | "dev": true,
1699 | "requires": {
1700 | "regenerate": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz",
1701 | "regjsgen": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
1702 | "regjsparser": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz"
1703 | }
1704 | },
1705 | "regjsgen": {
1706 | "version": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
1707 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
1708 | "dev": true
1709 | },
1710 | "regjsparser": {
1711 | "version": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
1712 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
1713 | "dev": true,
1714 | "requires": {
1715 | "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
1716 | },
1717 | "dependencies": {
1718 | "jsesc": {
1719 | "version": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
1720 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
1721 | "dev": true
1722 | }
1723 | }
1724 | },
1725 | "repeat-element": {
1726 | "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
1727 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
1728 | "dev": true
1729 | },
1730 | "repeat-string": {
1731 | "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1732 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
1733 | "dev": true,
1734 | "optional": true
1735 | },
1736 | "repeating": {
1737 | "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
1738 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
1739 | "dev": true,
1740 | "requires": {
1741 | "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz"
1742 | }
1743 | },
1744 | "safe-buffer": {
1745 | "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
1746 | "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
1747 | "dev": true
1748 | },
1749 | "set-immediate-shim": {
1750 | "version": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
1751 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
1752 | "dev": true,
1753 | "optional": true
1754 | },
1755 | "setimmediate": {
1756 | "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
1757 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
1758 | },
1759 | "slash": {
1760 | "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
1761 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
1762 | "dev": true
1763 | },
1764 | "source-map": {
1765 | "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
1766 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
1767 | "dev": true
1768 | },
1769 | "source-map-support": {
1770 | "version": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.11.tgz",
1771 | "integrity": "sha1-ZH+TmXizhTWQlTCIUwPa8jJ58yI=",
1772 | "dev": true,
1773 | "requires": {
1774 | "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
1775 | }
1776 | },
1777 | "string_decoder": {
1778 | "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1779 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
1780 | },
1781 | "strip-ansi": {
1782 | "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1783 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1784 | "dev": true,
1785 | "requires": {
1786 | "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
1787 | }
1788 | },
1789 | "superagent": {
1790 | "version": "https://registry.npmjs.org/superagent/-/superagent-3.4.3.tgz",
1791 | "integrity": "sha1-VWZI6VY29JFzcItwAvqvMIi86n8=",
1792 | "requires": {
1793 | "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
1794 | "cookiejar": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.0.tgz",
1795 | "debug": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz",
1796 | "extend": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
1797 | "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz",
1798 | "formidable": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz",
1799 | "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1800 | "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
1801 | "qs": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz",
1802 | "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz"
1803 | }
1804 | },
1805 | "supports-color": {
1806 | "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1807 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1808 | "dev": true
1809 | },
1810 | "to-fast-properties": {
1811 | "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz",
1812 | "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=",
1813 | "dev": true
1814 | },
1815 | "topo": {
1816 | "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
1817 | "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
1818 | "dev": true,
1819 | "requires": {
1820 | "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz"
1821 | }
1822 | },
1823 | "trim": {
1824 | "version": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
1825 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
1826 | },
1827 | "trim-right": {
1828 | "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
1829 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
1830 | "dev": true
1831 | },
1832 | "ua-parser-js": {
1833 | "version": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz",
1834 | "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs="
1835 | },
1836 | "underscore": {
1837 | "version": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
1838 | "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
1839 | },
1840 | "url-join": {
1841 | "version": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
1842 | "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg="
1843 | },
1844 | "user-home": {
1845 | "version": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
1846 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
1847 | "dev": true
1848 | },
1849 | "util-deprecate": {
1850 | "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1851 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1852 | },
1853 | "v8flags": {
1854 | "version": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz",
1855 | "integrity": "sha1-vKjzDw1tYGEswsAGQeaWLUKuaIE=",
1856 | "dev": true,
1857 | "requires": {
1858 | "user-home": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz"
1859 | }
1860 | },
1861 | "whatwg-fetch": {
1862 | "version": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz",
1863 | "integrity": "sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA="
1864 | },
1865 | "winchan": {
1866 | "version": "https://registry.npmjs.org/winchan/-/winchan-0.1.4.tgz",
1867 | "integrity": "sha1-iPoSQRzVQutiYBjDihlry7F5k7s="
1868 | },
1869 | "wrappy": {
1870 | "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1871 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1872 | "dev": true
1873 | },
1874 | "xstream": {
1875 | "version": "https://registry.npmjs.org/xstream/-/xstream-5.3.6.tgz",
1876 | "integrity": "sha1-PAfg4HcqMmVSMzkIqVzLxRGbgxo="
1877 | },
1878 | "xtend": {
1879 | "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
1880 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
1881 | "dev": true
1882 | }
1883 | }
1884 | }
1885 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cyclejs-auth0",
3 | "version": "4.2.0",
4 | "description": "Everything you need to start playing with Auth0 on your Cyclejs app (a driver and a component wrapper)",
5 | "main": "dist/index.js",
6 | "typings": "dist/index.d.ts",
7 | "scripts": {
8 | "test": "mocha --compilers js:babel-core/register tests/*.js",
9 | "dist": "babel src/ -d dist/ && shx cp src/index.d.ts dist/",
10 | "prepublish": "npm run dist"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "git+https://github.com/atomrc/cyclejs-auth0.git"
15 | },
16 | "keywords": [
17 | "auth0",
18 | "cyclejs",
19 | "authentication",
20 | "jwt"
21 | ],
22 | "author": "Thomas Belin ",
23 | "license": "MIT",
24 | "bugs": {
25 | "url": "https://github.com/atomrc/cyclejs-auth0/issues"
26 | },
27 | "homepage": "https://github.com/atomrc/cyclejs-auth0#readme",
28 | "dependencies": {
29 | "auth0-lock": "^10.19.0",
30 | "xstream": ">5.0.0"
31 | },
32 | "devDependencies": {
33 | "babel-cli": "^6.10.1",
34 | "babel-plugin-transform-object-rest-spread": "^6.8.0",
35 | "babel-preset-es2015": "^6.9.0",
36 | "babel-register": "^6.9.0",
37 | "expect.js": "^0.3.1",
38 | "jsonwebtoken": "^7.4.2",
39 | "mocha": "^3.0.0",
40 | "shx": "^0.2.2"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/AuthenticationWrapper.js:
--------------------------------------------------------------------------------
1 | import xs from "xstream";
2 |
3 | const defaultAuth0ShowParams = {
4 | authParams: { scope: "openid" },
5 | responseType: "token"
6 | };
7 |
8 | /**
9 | * Will decorate all sinks outputs using the corresponding decorate function
10 | *
11 | * @param {Object} sinks the sinks to decorate
12 | * @param {Stream} tokens$ the tokens that will be feeded to the decorator
13 | * @param {Object} decorators all the decorators, formatted like { sinkName: decorateFn }
14 | * @returns {Object} The decorated sinks
15 | */
16 | function decorateSinks(sinks, tokens$, decorators) {
17 | const sinksToDecorate = Object.keys(decorators); //get all the decorators
18 |
19 | sinksToDecorate.map(sinkName => {
20 | var sink = sinks[sinkName];
21 | var decorate = decorators[sinkName];
22 | if (!sink) { return; }
23 | sinks[sinkName] = tokens$
24 | .filter(tokens => !!tokens)
25 | .map(tokens => {
26 | return sink.map(data => decorate(data, tokens))
27 | })
28 | .flatten();
29 | })
30 |
31 | return sinks;
32 | }
33 |
34 | /**
35 | * Responsible for wrapping a generic component with an authentication layer
36 | * Will also decorate all http sinks of the child component with the user's tokens
37 | *
38 | * @param {Object} sources sources (that will also be used by the child component)
39 | * @returns {Object} sinks
40 | */
41 | function AuthenticationWrapper(sources) {
42 | const { auth0 } = sources;
43 | const {
44 | Child = () => { throw new Error("[Auth0Wrapper] missing child component") },
45 | auth0ShowParams = defaultAuth0ShowParams,
46 | decorators = {}
47 | } = sources.props.authWrapperParams;
48 |
49 | const tokens$ = auth0.tokens$;
50 |
51 | const childSources = { ...sources, props: { ...sources.props, tokens$ }};
52 | const sinks = Child(childSources);
53 |
54 | const showLoginRequest$ = tokens$
55 | .filter(tokens => !tokens)
56 | .mapTo({
57 | action: "show",
58 | params: auth0ShowParams
59 | });
60 |
61 | return decorateSinks({
62 | ...sinks,
63 | auth0: xs.merge(showLoginRequest$, sinks.auth0 || xs.empty())
64 | }, tokens$, decorators);
65 | }
66 |
67 | export default AuthenticationWrapper;
68 |
--------------------------------------------------------------------------------
/src/index.d.ts:
--------------------------------------------------------------------------------
1 | import { Stream, MemoryStream } from 'xstream'
2 |
3 | export interface Auth0LockOptions {
4 | [key: string]: any
5 | }
6 | export interface Auth0ShowOptions {
7 | [key: string]: any
8 | }
9 |
10 | export interface GetUserInfo {
11 | action: 'getUserInfo'
12 | params: string
13 | } // params = idToken
14 | export interface Show {
15 | action: 'show'
16 | params: Auth0ShowOptions
17 | }
18 | export interface Logout {
19 | action: 'logout'
20 | }
21 | export type Auth0Request = GetUserInfo | Show | Logout
22 |
23 | export interface Auth0Tokens {
24 | idToken: string
25 | accessToken: string
26 | }
27 | export interface Auth0Source {
28 | select(selector: string): Stream
29 | token$: Stream
30 | }
31 | export declare type Auth0Sink = Stream
32 | export declare type Auth0Driver = (sink: Auth0Sink) => Auth0Source
33 |
34 | export declare function makeAuth0Driver(
35 | auth0AppKey: string,
36 | auth0AppDomain: string,
37 | options?: Auth0LockOptions
38 | ): Auth0Driver
39 |
40 | export interface Sources {
41 | [key: string]: any
42 | }
43 | export interface Sinks {
44 | [key: string]: any
45 | }
46 | export type Component = (s: Sources) => Sinks
47 |
48 | export interface DecoratedSources extends Sources {
49 | props: {
50 | authWrapperParams: { Child: Component, [propName: string]: any; }
51 | tokens$: MemoryStream
52 | }
53 | }
54 |
55 | export interface ProtectOptions {
56 | decorators: {
57 | [driverKey: string]: (sinkData: any, tokens: Auth0Tokens) => any
58 | }
59 | [propName: string]: any
60 | }
61 |
62 | export declare function protect(
63 | component: Component,
64 | options?: ProtectOptions
65 | ): (sources: DecoratedSources) => Sinks
66 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import protectComponent from "./protectComponent";
2 | import buildDriver from "./makeAuth0Driver";
3 | import Auth0Lock from "auth0-lock";
4 |
5 | export const makeAuth0Driver = buildDriver(Auth0Lock, window.localStorage, window.location);
6 | export const protect = protectComponent;
7 | export default buildDriver(Auth0Lock, window.localStorage, window.location);
8 |
--------------------------------------------------------------------------------
/src/makeAuth0Driver.js:
--------------------------------------------------------------------------------
1 | import xs from "xstream";
2 |
3 |
4 | /**
5 | * Generate a function that will filter responses in order to have only those selected
6 | *
7 | * @param {Stream} response$$ the response stream
8 | * @return {Function} selectResponse
9 | */
10 | function responseSelector(lock, action$) {
11 | function selectEvent(event, lock, action$) {
12 | var driversEvents = ["getProfile", "getUserInfo", "logout"];
13 |
14 | if (driversEvents.indexOf(event) > -1) {
15 | return action$
16 | .filter(action => action.action === event)
17 | .map(action => action.response$)
18 | .flatten()
19 | .map(response => ({ event, response }))
20 | }
21 | return xs
22 | .create({
23 | start: (listener) => lock.on(event, (response) => listener.next({ event, response })),
24 | stop: () => {}
25 | })
26 | }
27 |
28 | return function selectResponse(selector) {
29 | const events = selector
30 | .split(",")
31 | .map(sel => sel.replace(/ */, ""))
32 | .filter(sel => !!sel);
33 |
34 | const events$ = events.map(event => selectEvent(event, lock, action$))
35 |
36 | return xs.merge(...events$);
37 | }
38 | }
39 |
40 | /**
41 | * it's needed to wrapper the makeAuth0Driver in a factory for testing purposes
42 | * as the Auth0Lock code tries to init at import (and fails because there is no document)
43 | *
44 | * @param {class} Auth0Lock the Auth0 code
45 | * @returns {Function} makeAuth0Driver
46 | */
47 | function buildDriver(Auth0Lock, localStorage, location) {
48 | var lock;
49 | const storageKey = "auh0-driver-tokens";
50 |
51 | /**
52 | * Contains all the available actions that can be done against the auth0 api
53 | *
54 | * @returns {Object}
55 | */
56 | const actions = {
57 | "show": function (lock) {
58 | lock.show();
59 | },
60 |
61 | "getProfile": function (lock, token) {
62 | console.warn("The getProfile method will soon be deprecated, use getUserInformation instead")
63 | return new Promise((resolve, reject) => {
64 | lock.getProfile(token, function (err, profile) {
65 | if (err) {
66 | return reject(err);
67 | }
68 | return resolve(profile);
69 | });
70 | })
71 | },
72 |
73 | "getUserInfo": function (lock, accessToken) {
74 | return new Promise((resolve, reject) => {
75 | lock.getUserInfo(accessToken, function (err, profile) {
76 | if (err) {
77 | return reject(err);
78 | }
79 | return resolve(profile);
80 | });
81 | })
82 | },
83 |
84 | "logout": function () {
85 | return new Promise(resolve => resolve(null));
86 | }
87 | };
88 |
89 | function auth0Driver(action$, streamAdapter) {
90 | const noop = () => {};
91 |
92 | const actionDone$ = action$
93 | .map(action => {
94 | var actionFn = actions[action.action];
95 | if (!actionFn) {
96 | console.error(`[Auth0Driver] not available method: ${action.action}`);
97 | return false;
98 | }
99 | var promise = actionFn(lock, action.params);
100 | return {
101 | action: action.action,
102 | response$: promise ? xs.fromPromise(promise) : xs.empty()
103 | }
104 | })
105 | .remember()
106 |
107 | const select = responseSelector(lock, actionDone$);
108 |
109 | actionDone$.addListener({ next: noop, error: noop, complete: noop })
110 |
111 | //if the location contains an id_token, do not send any initial token
112 | //because the lock will parse the token in hash and the initial token
113 | //will be given by either the authenticated event of any of the errors
114 | const initialToken$ = location.hash.indexOf("id_token") > -1 ?
115 | xs.empty() :
116 | xs.of(null).map(() => JSON.parse(localStorage.getItem(storageKey)));
117 |
118 | const removeToken$ = select("logout, unrecoverable_error, authorization_error")
119 | .map(() => {
120 | localStorage.removeItem(storageKey)
121 | return null;
122 | });
123 |
124 | const storeToken$ = select("authenticated")
125 | .map(({ response }) => {
126 | var tokens = {
127 | accessToken: response.accessToken,
128 | idToken: response.idToken
129 | }
130 | localStorage.setItem(storageKey, JSON.stringify(tokens))
131 | return tokens;
132 | });
133 |
134 | return {
135 | select: select,
136 | tokens$: xs
137 | .merge(initialToken$, storeToken$, removeToken$)
138 | .remember()
139 | };
140 | }
141 |
142 | return function makeAuth0Driver(key, domain, options = {}) {
143 | if (!key || !domain) {
144 | throw new Error("[Auth0] You must provide a key and a domain");
145 | }
146 | lock = new Auth0Lock(key, domain, options);
147 |
148 | return auth0Driver;
149 | }
150 | }
151 |
152 | export default buildDriver;
153 |
--------------------------------------------------------------------------------
/src/protectComponent.js:
--------------------------------------------------------------------------------
1 | import AuthenticationWrapper from "./AuthenticationWrapper";
2 |
3 | function protect(Component, options) {
4 | return function (sources) {
5 | const decoratedSources = {
6 | ...sources,
7 | props: { ...sources.props, authWrapperParams: { Child: Component, ...options }}
8 | };
9 |
10 | return AuthenticationWrapper(decoratedSources);
11 | }
12 | }
13 |
14 | export default protect
15 |
--------------------------------------------------------------------------------
/tests/AuthenticationWrapper.js:
--------------------------------------------------------------------------------
1 | /*global __dirname, it, describe, require*/
2 | "use strict";
3 | const APP_PATH = __dirname + "/../src";
4 |
5 | import expect from "expect.js";
6 | import jwt from "jsonwebtoken";
7 |
8 | import xs from "xstream";
9 |
10 | function getSources(overrides) {
11 | const defaultSources = {
12 | auth0: { select: () => {}, tokens$: xs.of(null) },
13 | props: {
14 | authWrapperParams: {
15 | Child: () => ({})
16 | }
17 | }
18 | };
19 | return {
20 | ...defaultSources,
21 | ...overrides
22 | };
23 | }
24 |
25 | function getListener(overrides) {
26 | const noop = () => null;
27 | const emptyListener = { next: noop, error: console.error.bind(console), complete: noop };
28 |
29 | return {
30 | ...emptyListener,
31 | ...overrides
32 | };
33 | }
34 |
35 |
36 | describe("AuthenticationWrapper", () => {
37 | const AuthenticationWrapper = require(APP_PATH + "/AuthenticationWrapper").default,
38 | tokens = { accessToken: "accessToken", idToken: jwt.sign({ nickname: "felix" }, "secret") };
39 |
40 | describe("Building", function () {
41 | it("should throw if child component is not given", (done) => {
42 | const sources = getSources({
43 | props: { authWrapperParams: {} }
44 | });
45 | const build = () => AuthenticationWrapper(sources)
46 |
47 | expect(build).to.throwError((e) => {
48 | expect(e.message).to.contain("[Auth0Wrapper]");
49 | done()
50 | });
51 | });
52 |
53 | it("should return undecorated sinks if child is given", (done) => {
54 | const sources = getSources({
55 | props: { authWrapperParams: { Child: () => ({ childSink: xs.of("from child") }) } }
56 | })
57 | const sinks = AuthenticationWrapper(sources)
58 |
59 | expect(sinks).to.have.property("childSink");
60 |
61 | sinks
62 | .childSink
63 | .addListener(getListener({
64 | next: value => {
65 | expect(value).to.be("from child");
66 | done();
67 | }
68 | }))
69 |
70 | });
71 |
72 | it("should decorate child sinks with token", (done) => {
73 | const sources = getSources({
74 | auth0: { select: () => xs.empty(), tokens$: xs.of(tokens) },
75 | props: {
76 | authWrapperParams: {
77 | Child: () => ({ childSink: xs.of("from child") }),
78 | decorators: {
79 | childSink: (value, tokens) => ({value, tokens})
80 | }
81 | }
82 | }
83 | })
84 |
85 | const {childSink} = AuthenticationWrapper(sources)
86 |
87 | childSink
88 | .addListener(getListener({
89 | next: data => {
90 | expect(data.value).to.be("from child");
91 | expect(data.tokens).to.be(tokens);
92 | done();
93 | }
94 | }))
95 |
96 | });
97 | });
98 |
99 | describe("Life cycle", function () {
100 | describe("No token in localStorage", () => {
101 | const { auth0 } = AuthenticationWrapper(getSources());
102 |
103 | it("should trigger Auth0 login form", (done) => {
104 | auth0.addListener(getListener({
105 | next: action => {
106 | expect(action.action).to.be("show");
107 | done();
108 | }
109 | }));
110 | });
111 | });
112 |
113 | describe("Token given by the driver", () => {
114 | it("should give token to child", (done) => {
115 | const sources = getSources({
116 | auth0: { select: () => xs.empty(), tokens$: xs.of(tokens) },
117 | props: {
118 | authWrapperParams: {
119 | Child: ({ props }) => {
120 | props
121 | .tokens$
122 | .addListener(getListener({
123 | next: (tok) => {
124 | expect(tok).to.be(tokens)
125 | done();
126 | }
127 | }))
128 |
129 | return {};
130 | }
131 | }
132 | }
133 | });
134 |
135 | AuthenticationWrapper(sources);
136 | });
137 | });
138 |
139 | describe("User logs out", () => {
140 | it("should re show Auth0 login form", (done) => {
141 | const sources = getSources({
142 | auth0: { select: () => xs.empty(), tokens$: xs.of(tokens, null) }
143 | });
144 |
145 | const { auth0 } = AuthenticationWrapper(sources);
146 |
147 | auth0
148 | .addListener(getListener({
149 | next: action => {
150 | expect(action.action).to.be("show")
151 | done();
152 | }
153 | }));
154 | });
155 | });
156 | });
157 | });
--------------------------------------------------------------------------------
/tests/makeAuth0Driver.js:
--------------------------------------------------------------------------------
1 | /* global it, describe */
2 | import xs from "xstream";
3 | import buildDriver from "../src/makeAuth0Driver";
4 | import expect from "expect.js";
5 | import EventEmitter from "events";
6 |
7 | var noop = () => {};
8 | function Auth0LockMock(/*key, domain*/) {
9 | }
10 | Auth0LockMock.prototype = Object.create(EventEmitter.prototype);
11 | Auth0LockMock.prototype.show = noop;
12 |
13 | const failingLocalStorage = {
14 | getItem: () => { throw new Error("getItem should not be called") },
15 | setItem: () => { throw new Error("setItem should not be called") },
16 | removeItem: () => { throw new Error("removeItem should not be called") }
17 | };
18 |
19 | const location = { hash: "" }
20 |
21 | function generateListener(overrides) {
22 | const defaults = {
23 | next: noop,
24 | complete: noop,
25 | error: console.error.bind(console)
26 | }
27 |
28 | return {
29 | ...defaults,
30 | ...overrides,
31 | };
32 | }
33 |
34 | describe("makeAuth0Driver", function () {
35 | const makeAuth0Driver = buildDriver(Auth0LockMock, failingLocalStorage, location);
36 |
37 | it("should throw if parameters are not given", () => {
38 | const build = () => makeAuth0Driver()
39 | expect(build).to.throwException(e => expect(e.message).to.contain("Auth0"));
40 | })
41 |
42 | it("should init lock if it has the needed parameters", () => {
43 | var lockCreated = false;
44 | const makeAuth0Driver = buildDriver(function (key, domain) {
45 | expect(key).to.be("appkey");
46 | expect(domain).to.be("appdomain");
47 | lockCreated = true;
48 | }, failingLocalStorage, location);
49 |
50 | const driver = makeAuth0Driver("appkey", "appdomain")(xs.empty());
51 | expect(driver).to.have.property("select")
52 | expect(driver).to.have.property("tokens$")
53 | expect(lockCreated).to.be(true);
54 | })
55 |
56 | describe("Actions", () => {
57 |
58 | describe("show action", () => {
59 |
60 | it("should show lock", () => {
61 | var showCalled = false;
62 | Auth0LockMock.prototype.show = function () {
63 | showCalled = true;
64 | }
65 | makeAuth0Driver("key", "domain")(xs.of({ action: "show" }));
66 | expect(showCalled).to.be(true);
67 | });
68 | });
69 |
70 | describe("getProfile action", () => {
71 | var getProfileCalled = false;
72 | var response = { sub: "user_id" };
73 | Auth0LockMock.prototype.getProfile = function (token, callback) {
74 | getProfileCalled = true;
75 | return callback(null, response);
76 | }
77 |
78 | const driver = makeAuth0Driver("key", "domain")(xs.of({ action: "getProfile" }));
79 |
80 | it("should get profile", () => {
81 | expect(getProfileCalled).to.be(true);
82 | });
83 |
84 | it("should send response", (done) => {
85 | driver
86 | .select("getProfile")
87 | .addListener(generateListener({
88 | next: response => {
89 | expect(response).to.be(response);
90 | done();
91 | }
92 | }));
93 | });
94 | });
95 |
96 | describe("getUserInfo action", () => {
97 | var getUserInfoCalled = false;
98 | var response = { sub: "user_id" };
99 | Auth0LockMock.prototype.getUserInfo = function (token, callback) {
100 | getUserInfoCalled = true;
101 | return callback(null, response);
102 | }
103 |
104 | const driver = makeAuth0Driver("key", "domain")(xs.of({ action: "getUserInfo" }));
105 |
106 | it("should get user info", () => {
107 | expect(getUserInfoCalled).to.be(true);
108 | });
109 |
110 | it("should send response", (done) => {
111 | driver
112 | .select("getUserInfo")
113 | .addListener(generateListener({
114 | next: response => {
115 | expect(response).to.be(response);
116 | done();
117 | },
118 | }));
119 | });
120 | });
121 |
122 | describe("logout action", () => {
123 | const makeAuth0Driver = buildDriver(Auth0LockMock, failingLocalStorage, location);
124 | const { select } = makeAuth0Driver("key", "domain")(xs.of({ action: "logout" }));
125 |
126 | it("should send response", (done) => {
127 | select("logout")
128 | .addListener(generateListener({
129 | next: event => {
130 | expect(event.response).to.be(null);
131 | done();
132 | }
133 | }));
134 | });
135 | });
136 | });
137 |
138 | describe("tokens$ stream", () => {
139 | function makeLocalStorage(overrides) {
140 | var defaults = {
141 | getItem: () => '{ "idToken": "defaulttoken" }',
142 | setItem: noop,
143 | removeItem: noop
144 | }
145 | return Object.assign({}, defaults, overrides);
146 | }
147 | const makeAuth0Driver = buildDriver(Auth0LockMock, makeLocalStorage(), location);
148 |
149 | it("should send initial token", (done) => {
150 | const { tokens$ } = makeAuth0Driver("key", "domain")(xs.empty());
151 |
152 | tokens$
153 | .addListener({
154 | next: response => {
155 | expect(response.idToken).to.be("defaulttoken");
156 | done();
157 | },
158 | error: console.error.bind(console),
159 | complete: noop
160 | });
161 | });
162 |
163 | it("should not send any token if token is in url's hash", done => {
164 | const location = { hash: "access_token=jfkdlmsq&id_token=token" };
165 | const makeAuth0Driver = buildDriver(Auth0LockMock, makeLocalStorage(), location);
166 |
167 | const { tokens$ } = makeAuth0Driver("key", "domain")(xs.empty());
168 |
169 |
170 | tokens$
171 | .addListener(generateListener({
172 | next: () => done("should not emit")
173 | }));
174 | setTimeout(done, 10);
175 | })
176 |
177 | describe("logout", () => {
178 | var itemRemoved = false;
179 | const localStorage = makeLocalStorage({
180 | removeItem: () => itemRemoved = true
181 | });
182 | const makeAuth0Driver = buildDriver(Auth0LockMock, localStorage, location);
183 |
184 | const driver = makeAuth0Driver("key", "domain")(xs.of({ action: "logout" }));
185 |
186 | it("should send empty token and remove from storage", (done) => {
187 | driver
188 | .tokens$
189 | .drop(1)
190 | .addListener({
191 | next: response => {
192 | expect(response).to.be(null);
193 | expect(itemRemoved).to.be(true);
194 | done();
195 | },
196 | error: console.error.bind(console),
197 | complete: noop
198 | });
199 | });
200 | });
201 |
202 | });
203 | });
204 |
--------------------------------------------------------------------------------