├── .babelrc ├── .editorconfig ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── banner.png ├── package.json ├── react-dream-logo.png ├── react-dream-logo.svg ├── src ├── ReactDream.js ├── createElementWithProps.js ├── index.js ├── internals │ ├── doAp.js │ ├── doConcat.js │ ├── doContramap.js │ ├── doMap.js │ ├── doPromap.js │ ├── doRotate.js │ ├── doScale.js │ └── doTranslate.js ├── isReferentiallyTransparentFunctionComponent.js ├── partialApplication │ ├── addProps.js │ ├── ap.js │ ├── chain.js │ ├── concat.js │ ├── contramap.js │ ├── debug.js │ ├── defaultProps.js │ ├── fork.js │ ├── log.js │ ├── map.js │ ├── name.js │ ├── promap.js │ ├── propTypes.js │ ├── removeProps.js │ ├── rotate.js │ ├── scale.js │ ├── style.js │ └── translate.js ├── styleFromProps.js └── withStyleFromProps.js ├── test ├── ReactDream.js ├── createElementWithProps.js ├── dsl.js ├── index.js ├── internals │ ├── doAp.js │ ├── doConcat.js │ ├── doContramap.js │ ├── doMap.js │ ├── doPromap.js │ └── index.js ├── partialApplication.js └── styleFromProps.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "es2015", 4 | "react", 5 | "stage-3" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | indent_style = space 8 | indent_size = 2 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .sagui 3 | coverage 4 | dist 5 | node_modules 6 | npm-debug.log 7 | yarn-error.log 8 | .next 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '7' 4 | before_script: 5 | - npm install 6 | script: 7 | - npm test 8 | deploy: 9 | skip_cleanup: true 10 | provider: npm 11 | email: fernando.via@gmail.com 12 | api_key: 13 | secure: Tbh+YgTCcdhInbJKuLwGGJLH2wUzDNNgNeBG618OG7Hfk5VO9O/ehuYeZ9KM6oQiVGXHC1w1mDCGaVcegYV/gBAliqktIrvfYi03Xv7KG9J6Wap3xwiF+Ji6doI/dFeEAC/2Z3cgEq//XbpssSjCuSC/YyppI4TvKPjNMRcYp2wOUM4M/bkkgBWe1bALFliQluB4GGzJ8YGmoENCvdUas2XRbbf1dbZTkuwHES2doYJMqGeG92m/6PS+KpkCLh/sf2CA/hOsLIURwH3KenhevpuoSsz7ZCLLZnqbgE6sWaVz6E5k7g+LOZ1wHIC8UIF49KfEZMZr4HGBuapT7NQqpCHQpFA9AevGnkLtavqs4fmrHfDehKROwfPU/4i3tAtuB1nu3MMnHkWj7temrLyyEGfcJcseUjGGngscbWnmt/xG08+atcl4krda9ZteyXRwrqI6dTrm+XmUvKzyVmVwGP+g0iIKAjfgA149EZSo1i9r1B9MhNrsqILycN3bzBbBaMwkLGNgVM9T1rU7yL/IUN+6W2A78yw09pfTglK3O35AZoR+GPLFnpQOhRsGnYZYfQE7A+Ch6iAAytgTaM3ZYtjys0KDcRXQa861WVY6SaNpXRISBfUR7++Azc1QnnHg5/xQx8kuWukRfJVOlrOTKQgK+qeKd1fZwtnXouaHXxE= 14 | on: 15 | tags: true 16 | repo: xaviervia/react-dream 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Fernando Via Canel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![react-dream-logo](banner.png) 2 | 3 | # React Dream 4 | 5 | [![Build Status](https://travis-ci.org/xaviervia/react-dream.svg)](https://travis-ci.org/xaviervia/react-dream) 6 | [![npm version](https://img.shields.io/npm/v/react-dream.svg?maxAge=1000)](https://www.npmjs.com/package/react-dream) 7 | 8 | [Fantasy Land](https://github.com/fantasyland/fantasy-land) type for [React Components](https://facebook.github.io/react/) 9 | 10 | **Caution: Experimental** (not _extremely_ anymore though) 11 | 12 | ## Installation 13 | 14 | ``` 15 | npm add react-dream 16 | ``` 17 | 18 | You will also need a couple of peer dependencies: 19 | 20 | ``` 21 | npm add react recompose 22 | ``` 23 | 24 | ## Table of contents 25 | 26 | - [Usage](#usage) 27 | - [API](#api) 28 | - [map](#mapcomponent--enhancedcomponent) 29 | - [contramap](#contramapprops--modifiedprops) 30 | - [promap](#promapprops--modifiedprops-component--enhancedcomponent) 31 | - [ap + of](#ap--of) 32 | - [concat](#concat) 33 | - [chain](#chain) 34 | - [fork](#forkcomponent--) 35 | - [addProps](#addpropsprops--propstoadd--object) 36 | - [removeProps](#removepropspropnamestoremove--string) 37 | - [defaultProps](#defaultpropsprops--object) 38 | - [propTypes](#proptypesproptypes--object) 39 | - [style](#styleprops--stylestoadd--object) 40 | - [name](#namenewdisplayname--string) 41 | - [rotate](#rotateprops--rotation--number) 42 | - [scale](#scaleprops--scalefactor--number) 43 | - [translate](#translateprops--x--number-y--number-z--number) 44 | - [log](#logprops--value--any) 45 | - [debug](#debug) 46 | - [Built-in primitives](#built-in-primitives) 47 | 48 | ## Usage 49 | 50 | ### Lifting React components into ReactDream 51 | 52 | For example, for a ReactNative View: 53 | 54 | ```js 55 | import ReactDream from 'react-dream' 56 | import { View } from 'react-native' 57 | 58 | const DreamView = ReactDream(View) 59 | ``` 60 | 61 | …or for a web `div`: 62 | 63 | ```js 64 | import React from 'react' 65 | import ReactDream from 'react-dream' 66 | 67 | const DreamView = ReactDream(props =>
) 68 | ``` 69 | 70 | ### Complete example 71 | 72 | Here is an extensive example that can be found in [examples](https://github.com/xaviervia/react-dream-examples/blob/master/pages/index.js): 73 | 74 | > If you are not familiar with Fantasy Land types, I can highly recommend the [video tutorials by Brian Lonsdorf](https://egghead.io/instructors/brian-lonsdorf) 75 | 76 | > Note that this and the following examples use already-built wrappers that you can pull from [react-dream-web-builtins](https://github.com/xaviervia/react-dream-web-builtins). This are convenient but might not be easy to tree shake when bundling, so use with caution. 77 | 78 | ```js 79 | import React from 'react' 80 | import { render } from 'react-dom' 81 | import { withHandlers, withState } from 'recompose' 82 | import { of } from 'react-dream' 83 | import { Html } from 'react-dream-web-builtins' 84 | 85 | const withChildren = North => South => Wrapper => ({ north, south, wrapper, ...props }) => 86 | 87 | 88 | 89 | 90 | 91 | const Title = Html.H1 92 | .style(() => ({ 93 | fontFamily: 'sans-serif', 94 | fontSize: 18, 95 | })) 96 | .name('Title') 97 | 98 | const Tagline = Html.P 99 | .style(() => ({ 100 | fontFamily: 'sans-serif', 101 | fontSize: 13, 102 | })) 103 | .name('Tagline') 104 | 105 | const HeaderWrapper = Html.Header 106 | .removeProps('clicked', 'updateClicked') 107 | .style(({ clicked }) => ({ 108 | backgroundColor: clicked ? 'red' : 'green', 109 | cursor: 'pointer', 110 | padding: 15, 111 | })) 112 | .name('HeaderWrapper') 113 | .map( 114 | withHandlers({ 115 | onClick: ({ clicked, updateClicked }) => () => updateClicked(!clicked), 116 | }) 117 | ) 118 | .map(withState('clicked', 'updateClicked', false)) 119 | 120 | const Header = of(withChildren) 121 | .ap(Title) 122 | .ap(Tagline) 123 | .ap(HeaderWrapper) 124 | .contramap(({ title, tagline }) => ({ 125 | north: { children: title }, 126 | south: { children: tagline }, 127 | })) 128 | .name('Header') 129 | 130 | Header.fork(Component => 131 | render( 132 | , 136 | document.getElementById('root') 137 | ) 138 | ) 139 | ``` 140 | 141 | Render part could also be written: 142 | 143 | ```js 144 | render( 145 | , 149 | document.getElementById('root') 150 | ) 151 | ``` 152 | 153 | ### Pointfree style 154 | 155 | All methods of `ReactDream` are available as functions that can be partially applied and then take the ReactDream component as the last argument. This makes it possible to write compositions that can then be applied to a ReactDream object. The elements of the example above could be rewritten as: 156 | 157 | ```js 158 | import React from 'react' 159 | import { render } from 'react-dom' 160 | import { compose, withHandlers, withState } from 'recompose' 161 | import { ap, removeProps, contramap, map, name, of, style } from 'react-dream' 162 | import { Html } from 'react-dream-web-builtins' 163 | 164 | const withChildren = North => South => Wrapper => ({ north, south, wrapper, ...props }) => 165 | 166 | 167 | 168 | 169 | 170 | const Title = compose( 171 | name('Title'), 172 | style(() => ({ 173 | fontFamily: 'sans-serif', 174 | fontSize: 18, 175 | })) 176 | )(Html.H1) 177 | 178 | const Tagline = compose( 179 | name('Tagline'), 180 | style(() => ({ 181 | fontFamily: 'sans-serif', 182 | fontSize: 13, 183 | })) 184 | )(Html.P) 185 | 186 | const HeaderWrapper = compose( 187 | map(withState('clicked', 'updateClicked', false)), 188 | map( 189 | withHandlers({ 190 | onClick: ({ clicked, updateClicked }) => () => updateClicked(!clicked), 191 | }) 192 | ), 193 | name('HeaderWrapper'), 194 | style(({ clicked }) => ({ 195 | backgroundColor: clicked ? 'red' : 'green', 196 | cursor: 'pointer', 197 | padding: 15, 198 | })), 199 | removeProps('clicked', 'updateClicked') 200 | )(Html.Header) 201 | 202 | const Header = compose( 203 | name('Header'), 204 | contramap(({ title, tagline }) => ({ 205 | north: { children: title }, 206 | south: { children: tagline }, 207 | })), 208 | ap(HeaderWrapper), 209 | ap(Tagline), 210 | ap(Title) 211 | )(of(withChildren)) 212 | ``` 213 | 214 | ## API 215 | 216 | The following are the methods of objects of the ReactDream type. There are two types of methods: 217 | 218 | - Algebras: they come from Fantasy Land, and they are defined following that specification. 219 | - Helpers: they are derivations (use cases) of the methods that come from the algebras. Added for convenience. 220 | 221 | ReactDream implements these Fantasy Land algebras: 222 | 223 | - Profunctor (map, contramap, promap) 224 | - Applicative (of, ap) 225 | - Semigroup (concat) 226 | - Monad (chain) 227 | 228 | Check [Fantasy Land](https://github.com/fantasyland/fantasy-land) for more details. 229 | 230 | ### map(Component => EnhancedComponent) 231 | 232 | `map` allows to wrap the function with regular higher-order components, such as the ones provided by [recompose](https://github.com/acdlite/recompose). 233 | 234 | ```js 235 | import React from 'react' 236 | import ReactDream from 'react-dream' 237 | import { withHandlers, withState } from 'recompose' 238 | 239 | const Counter = ReactDream(({counter, onClick}) => 240 |
241 | 242 |

{counter}

243 |
244 | ) 245 | .map( 246 | withHandlers({ 247 | onClick: ({ counter, updateCount }) => () => updateCount(counter + 1), 248 | }) 249 | ) 250 | .map(withState('counter', 'updateCount', 0)) 251 | ``` 252 | 253 | This is because `map` expects a function from `a -> b` in the general case but from `Component -> a` in this particular case since holding components is the intended usage of ReactDream. Higher-order components are functions from `Component -> Component`, so they perfectly fit the bill. 254 | 255 | ### contramap(props => modifiedProps) 256 | 257 | `contramap` allows to preprocess props before they reach the component. 258 | 259 | ```js 260 | const Title = H1 261 | .contramap(({label}) => ({ 262 | children: label 263 | })) 264 | .name('Title') 265 | 266 | render( 267 | , 270 | domElement 271 | ) 272 | ``` 273 | 274 | This is a common pattern for higher-order Components, and the key advantage of using `contramap` instead of `map` for this purpose is that if the wrapped component is a stateless, function component, you avoid an unnecessary call to React. Another advantage is that functions passed to `contramap` as an argument are simply pure functions, without mentioning React at all, with the signature `Props -> Props`. 275 | 276 | ### promap(props => modifiedProps, Component => EnhancedComponent) 277 | 278 | `promap` can be thought of as a shorthand for doing `contramap` and `map` at the same time. The first argument to it is the function that is going to be used to `contramap` and the second is the one to be used to `map`: 279 | 280 | ```js 281 | const Header = Html.Div 282 | .promap( 283 | ({title}) => ({children: title}), 284 | setDisplayName('Header') 285 | ) 286 | ``` 287 | 288 | ### ap + of 289 | 290 | `ap` allows you to apply a higher-order components to regular components, and `of` allows you to lift any value to `ReactDream`, which is useful for lifting higher-order components. 291 | 292 | Applying second-order components (`Component -> Component`) can also be done with `map`: where `ap` shines is in allowing you to apply a higher-order component that takes two or more components (third or higher order, such as `Component -> Component -> Component -> Component`), that is otherwise not possible with `map`. This makes it possible to abstract control flow or composition patterns in higher-order components: 293 | 294 | **Control flow example** 295 | 296 | ```js 297 | const eitherLeftOrRight = Left => Right => ({left, ...props}) => 298 | left 299 | ? 300 | : 301 | 302 | const TitleOrSubtitle = of(eitherLeftOrRight) 303 | .ap(Html.H1) 304 | .ap(Html.H2) 305 | .addProps({isTitle} => ({ 306 | left: isTitle 307 | })) 308 | 309 | render( 310 | 311 | This will be an H1 title 312 | 313 | , domElement 314 | ) 315 | ``` 316 | 317 | **Parent-children pattern example** 318 | 319 | ```js 320 | const withChildren = North => South => Wrapper => ({north, south, wrapper, ...props}) => 321 | 322 | 323 | 324 | 325 | 326 | const PageHeader = of(withChildren) 327 | .ap(Html.H1) 328 | .ap(Html.P) 329 | .ap(Html.Header) 330 | .addProps({title, subtitle} => ({ 331 | north: { children: title }, 332 | south: { children: subtitle }, 333 | })) 334 | 335 | render( 336 | 340 | , domElement 341 | ) 342 | ``` 343 | 344 | ### concat 345 | 346 | > Requires React 16+ 347 | 348 | `concat` constructs a new component that wraps the current component and another one being passed as siblings, passing the props to both of them. For example: 349 | 350 | ```js 351 | import { Html } from 'react-dream' 352 | 353 | const Header = Html.H1 354 | .concat(Html.P) 355 | ``` 356 | 357 | Since props are passed to both elements in the composition, invoking the above defined `Header` like this: 358 | 359 | ```js 360 | Hello 361 | ``` 362 | 363 | …will result in: 364 | 365 | ```html 366 |

Hello

367 |

Hello

368 | ``` 369 | 370 | So to make concatenation more useful, it is necessary for the elements to be configured to capture the props that are useful for them: 371 | 372 | ```js 373 | import { Html } from 'react-dream' 374 | 375 | const Header = Html.H1 376 | .contramap(({title}) => ({children: title})) 377 | .concat( 378 | Html.P 379 | .contramap(({description}) => ({children: description})) 380 | ) 381 | ``` 382 | 383 | This way the composition can be used like this: 384 | 385 | ```js 386 | 390 | ``` 391 | 392 | …and will result in: 393 | 394 | ```html 395 |

Hello

396 |

World!

397 | ``` 398 | 399 | Note: while `concat` is for all practical purposes associative (as far as the resulting elements in the DOM are concerned), the React Components themselves are not joined together in an associative way, and this can be seen in the React DevTools. This violation of associativity is what makes it impossible for ReactDream to implement Monoid. 400 | 401 | ### chain 402 | 403 | `chain` is useful as a escape hatch if you want to escape from ReactDream and do something very React-y 404 | 405 | ```js 406 | import ReactDream from 'react-dream' 407 | import { Svg } from 'react-dream-web-builtins' 408 | 409 | const wrapWithGLayer = Component => ReactDream(props => 410 | 411 | 412 | 413 | ) 414 | 415 | const LayerWithCircle = Svg.Circle 416 | .contramap(() => ({ 417 | r: 5, 418 | x: 10, 419 | y: 10 420 | }) 421 |  .chain(wrapWithGLayer) 422 | ``` 423 | 424 | Aside from Fantasy Land algebras, ReactDream provides the methods: 425 | 426 | ### fork(Component => {}) 427 | 428 | Calls the argument function with the actual component in the inside. This function is intended to be used to get the component for rendering, which is a side effect: 429 | 430 | ```js 431 | H1.fork(Component => render(Hello, domElement)) 432 | ``` 433 | 434 | ### addProps(props => propsToAdd : Object) 435 | 436 | `addProps` allows you to pass a function whose result will be merged with the regular props. This is useful to add derived props to a component: 437 | 438 | ```js 439 | import { Svg } from 'react-dream-web-builtins' 440 | 441 | const Picture = Svg.Svg 442 | .addProps(props => ({ 443 | viewBox: `0 0 ${props.width} ${props.height}` 444 | })) 445 | 446 | render( 447 | , 451 | domElement 452 | ) 453 | ``` 454 | 455 | The new props will be merged below the regular ones, so that the consumer can always override your props: 456 | 457 | ```diff 458 | import { Svg } from 'react-dream-web-builtins' 459 | 460 | const Picture = Svg.Svg 461 | .addProps(props => ({ 462 | + // This will be now ignored 463 | viewBox: `0 0 ${props.width} ${props.height}` 464 | })) 465 | 466 | render( 467 | , 472 | domElement 473 | ) 474 | ``` 475 | 476 | #### `addProps` is a use case of `contramap` 477 | 478 | ```js 479 | .addProps(({width, height}) => ({ 480 | viewBox: `0 0 ${props.width} ${props.height}` 481 | })) 482 | ``` 483 | 484 | …is equivalent to: 485 | 486 | ```js 487 | .contramap(props => ({ 488 | ...props, 489 | viewBox: `0 0 ${props.width} ${props.height}` 490 | })) 491 | ``` 492 | 493 | ### removeProps(...propNamesToRemove : [String]) 494 | 495 | `removeProps` filters out props. Very useful to avoid the React warnings of unrecognized props. 496 | 497 | ```js 498 | const ButtonWithStates = Html.Button 499 | .removeProps('hovered', 'pressed') 500 | .style(({hovered, pressed}) => ({ 501 | color: pressed ? 'red' : (hovered ? 'orange' : 'black') 502 | })) 503 | ``` 504 | 505 | #### `removeProps` is an use case of `contramap` 506 | 507 | ```js 508 | .removeProps('title', 'hovered') 509 | ``` 510 | 511 | …is equivalent to: 512 | 513 | ```js 514 | .contramap(({title, hovered, ...otherProps}) => otherProps) 515 | ``` 516 | 517 | ### defaultProps(props : Object) 518 | 519 | `defaultProps` allows you to set the, well, `defaultProps` of the wrapped React component. 520 | 521 | ```js 522 | const SubmitButton = Html.Button 523 | .defaultProps({ type: 'submit' }) 524 | ``` 525 | 526 | #### `defaultProps` is an use case of `map` 527 | 528 | ```js 529 | const SubmitButton = Html.Button 530 | .defaultProps({ type: 'submit' }) 531 | ``` 532 | 533 | Under the hood is using `recompose`’s `defaultProps` function: 534 | 535 | ```js 536 | import { defaultProps } from 'recompose' 537 | 538 | const SubmitButton = Html.Button 539 | .map(defaultProps({ type: 'submit' })) 540 | ``` 541 | 542 | ### propTypes(propTypes : Object) 543 | 544 | `propTypes` sets the `propTypes` of the React component. 545 | 546 | ```js 547 | import PropTypes from 'prop-types' 548 | 549 | const Title = Html.H1 550 | .style(({ highlighted }) => ({ 551 | backgroundColor: highlighted ? 'yellow' : 'transparent' 552 | })) 553 | .propTypes({ 554 | children: PropTypes.node, 555 | highlighted: PropTypes.bool 556 | }) 557 | ``` 558 | 559 | #### `propTypes` is an use case of `map` 560 | 561 | The example above is equivalent to: 562 | 563 | ```js 564 | import PropTypes from 'prop-types' 565 | import { setPropTypes } from 'recompose' 566 | 567 | const Title = Html.H1 568 | .style(({ highlighted }) => ({ 569 | backgroundColor: highlighted ? 'yellow' : 'transparent' 570 | })) 571 | .map(setPropTypes({ 572 | children: PropTypes.node, 573 | highlighted: PropTypes.bool 574 | })) 575 | ``` 576 | 577 | ### style(props => stylesToAdd : Object) 578 | 579 | The `style` helper gives a simple way of adding properties to the `style` prop of the target component. It takes a function from props to a style object. The function will be invoked each time with the props. The result will be set as the `style` prop of the wrapper component. If there are styles coming from outside, they will be merged together with the result of this function. For example: 580 | 581 | ```js 582 | const Title = Html.H1 583 | .style(props => ({color: highlighted ? 'red' : 'black'})) 584 | 585 | render( 586 | , 590 | domElement 591 | ) 592 | ``` 593 | 594 | The resulting style will be: `{ color: 'red', backgroundColor: 'green' }`. 595 | 596 | #### `style` is an use case of `contramap` 597 | 598 | ```js 599 | .style(({hovered}) => ({ 600 | color: hovered ? 'red' : 'black' 601 | })) 602 | ``` 603 | 604 | …is equivalent to: 605 | 606 | ```js 607 | .contramap(props => ({ 608 | style: { 609 | color: props.hovered ? 'red' : 'black', 610 | ...props.style 611 | }, 612 | ...props 613 | })) 614 | ``` 615 | 616 | ### name(newDisplayName : String) 617 | 618 | Sets the `displayName` of the component: 619 | 620 | ```js 621 | const Tagline = H2.name('Tagline') 622 | ``` 623 | 624 | #### `name` is an use case of `map` 625 | 626 | ```js 627 | .name('Tagline') 628 | ``` 629 | 630 | …is equivalent to: 631 | 632 | ```js 633 | import { setDisplayName } from 'recompose' 634 | 635 | .map(setDisplayName('Title')) 636 | ``` 637 | 638 | ### rotate(props => rotation : number) 639 | 640 | `rotate` sets up a style `transform` property with the specified rotation, in degrees. If there is a transform already, `rotate` will append to it: 641 | 642 | ```js 643 | const Title = Html.H1 644 | .rotate(props => 45) 645 | 646 | render( 647 | <Title.Component style={{ transform: 'rotate(45deg)' }} />, 648 | document.getElementById('root') 649 | ) 650 | ``` 651 | 652 | …will result in `transform: 'translateX(20px) rotate(45deg)'` 653 | 654 | > Just a reminder: rotations start from the top left edge as the axis, which is rarely what one wants. If you want the rotation to happen from the center, you can set `transform-origin: 'center'`, that with ReactDream would be `.style(props => ({transformOrigin: 'center'}))`. 655 | 656 | #### `rotate` is an use case of `contramap` 657 | 658 | ```js 659 | .rotate(props => 45) 660 | ``` 661 | 662 | …is equivalent to: 663 | 664 | ```js 665 | .contramap(props => ({ 666 | style: { 667 | transform: props.transform 668 | ? `${props.transform} rotate(45deg)` 669 | : 'rotate(45deg)' 670 | ...props.style 671 | }, 672 | ...props 673 | })) 674 | ``` 675 | 676 | ### scale(props => scaleFactor : number) 677 | 678 | `scale` sets up a style `transform` property with the specified scaling factor. If there is a transform already, `scale` will append to it: 679 | 680 | ```js 681 | const Title = Html.H1 682 | .scale(props => 1.5) 683 | 684 | render( 685 | <Title.Component style={{ transform: 'scale(1.5)' }} />, 686 | document.getElementById('root') 687 | ) 688 | ``` 689 | 690 | …will result in `transform: 'translateX(20px) scale(1.5)'` 691 | 692 | ##### `scale` is an use case of `contramap` 693 | 694 | ```js 695 | .scale(props => 2) 696 | ``` 697 | 698 | …is equivalent to: 699 | 700 | ```js 701 | .contramap(props => ({ 702 | style: { 703 | transform: props.transform 704 | ? `${props.transform} scale(2)` 705 | : 'scale(2)' 706 | ...props.style 707 | }, 708 | ...props 709 | })) 710 | ``` 711 | 712 | ### translate(props => [x : number, y : number, z : number]) 713 | 714 | `translate` allows you to easily set up the `transform` style property with the specified displacement. If there is a transform already, `translate` will append to it: 715 | 716 | ```js 717 | const Title = Html.H1 718 | .translate(props => [30]) 719 | .translate(props => [null, 30]) 720 | .translate(props => [null, null, 30]) 721 | ``` 722 | 723 | …will result in `transform: 'translateZ(30px) translateY(30px) translateX(30px)'` 724 | 725 | #### `translate` is an use case of `contramap` 726 | 727 | ```js 728 | .translate(({x, y}) => [x, y]) 729 | ``` 730 | 731 | …is equivalent to: 732 | 733 | ```js 734 | .contramap(props => ({ 735 | style: { 736 | transform: props.transform 737 | ? `${props.transform} translate(${x}px, ${y}px)` 738 | : `translate(${x}px, ${y}px)` 739 | ...props.style 740 | }, 741 | ...props 742 | })) 743 | ``` 744 | 745 | ## Debugging 746 | 747 | The downside of chaining method calls is that debugging is not super intuitive. Since there are no statements, it’s not possible to place a `console.log()` or `debugger` call in the middle of the chain without some overhead. To simplify that, two methods for debugging are bundled: 748 | 749 | ### log(props => value : any) 750 | 751 | Whenever the Component is called with new props, it will print: 752 | 753 | - The component displayName 754 | - The value by the argument function. The value can be anything, it will be passed as-is to the `console.log` function. 755 | 756 | Pretty useful to debug what exactly is happening in the chain: 757 | 758 | ```js 759 | const Title = Html.H1 760 | .log(props => 'what props gets to the H1?') 761 | .log(props => props) 762 | .contramap(({hovered, label}) => ({ 763 | children: hovered ? 'Hovered!' : label 764 | })) 765 | .log(({label}) => 'is there a label before the contramap? ' + label) 766 | .name('Title') 767 | .log(({label}) => 'does it also get a label from outside? ' + label) 768 | 769 | render( 770 | <Title.Component hovered label='Label from outside' />, 771 | domElement 772 | ) 773 | ``` 774 | 775 | `log` will become a no-op when the `NODE_ENV` is `production`. 776 | 777 | For more details check out [@hocs/with-log](https://github.com/deepsweet/hocs/tree/master/packages/with-log) documentation which React Dream is using under the hood. 778 | 779 | #### `log` is an use case of `map` 780 | 781 | ```js 782 | .log(({a}) => `a is: ${a}`) 783 | ``` 784 | 785 | …is equivalent to: 786 | 787 | ```js 788 | import withLog from '@hocs/with-log' 789 | 790 | .map(withLog(({a}) => `a is: ${a}`)) 791 | ``` 792 | 793 | ### debug() 794 | 795 | **Careful**: This method allows you to inject a `debugger` statement at that point in the chain. The result will allow you to inspect the Component and its props, from the JavaScript scope of the [@hocs/with-debugger higher-order component](https://github.com/deepsweet/hocs/tree/master/packages/with-debugger). 796 | 797 | ```js 798 | import React from 'react' 799 | import { render } from 'react-dom' 800 | import { Html } from 'react-dream-web-builtins' 801 | 802 | const App = Html.Div 803 | .debug() 804 | .removeProps('a', 'c', 'randomProp') 805 | .addProps(() => ({ 806 | a: '1', 807 | c: '4' 808 | })) 809 | ``` 810 | 811 | It will be called on each render of the component. 812 | 813 | `debug` will become a no-op when the `NODE_ENV` is `production`. 814 | 815 | For more details check out [@hocs/with-debugger](https://github.com/deepsweet/hocs/tree/master/packages/with-debugger) documentation which React Dream is using under the hood. 816 | 817 | #### `debug` is an use case of `map` 818 | 819 | ```js 820 | .debug() 821 | ``` 822 | 823 | …is equivalent to: 824 | 825 | ```js 826 | import withDebugger from '@hocs/with-debugger' 827 | 828 | .map(withDebugger) 829 | ``` 830 | 831 | ## Built-in Primitives 832 | 833 | A separate package, [react-dream-web-builtins](https://github.com/xaviervia/react-dream-web-builtins) ships with a complete set of HTML and SVG primitives lifted into the type. You can access them like: 834 | 835 | ```js 836 | import { Svg, Html } from 'react-dream-web-builtins' 837 | 838 | const MyDiv = Html.Div 839 | 840 | const MyLayer = Svg.G 841 | ``` 842 | 843 | Read more in the package [README]((https://github.com/xaviervia/react-dream-web-builtins)) 844 | 845 | ## License 846 | 847 | [MIT](LICENSE) 848 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xaviervia/react-dream/cc6fcd80dbf40a39824eaa25b7f1d6befc05335e/banner.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-dream", 3 | "version": "0.5.1", 4 | "description": "Fantasy Land type for React Components", 5 | "main": "dist/index.js", 6 | "files": [ 7 | "dist" 8 | ], 9 | "scripts": { 10 | "dist": "babel src/ -d dist/ --ignore spec.js", 11 | "prepublishOnly": "npm run dist", 12 | "test": "babel-node test" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/xaviervia/react-dream.git" 17 | }, 18 | "keywords": [ 19 | "react", 20 | "fantasy-land", 21 | "fantasyland", 22 | "functional", 23 | "functional-programming", 24 | "fp" 25 | ], 26 | "author": "Fernando Via Canel <fernando.via@gmail.com>", 27 | "license": "MIT", 28 | "bugs": { 29 | "url": "https://github.com/xaviervia/react-dream/issues" 30 | }, 31 | "homepage": "https://github.com/xaviervia/react-dream#readme", 32 | "devDependencies": { 33 | "@klarna/higher-order-components": "^3.0.1", 34 | "babel-cli": "^6.24.1", 35 | "babel-preset-es2015": "^6.24.1", 36 | "babel-preset-react": "^6.24.1", 37 | "babel-preset-stage-3": "^6.24.1", 38 | "jsdom": "^11.12.0", 39 | "jsdom-global": "^3.0.2", 40 | "prettier": "^1.5.3", 41 | "ramda": "^0.25.0", 42 | "react": "^16.0.0", 43 | "react-test-renderer": "^16.0.0", 44 | "recompose": "^0.24.0", 45 | "washington": "^2.0.0-rc.3" 46 | }, 47 | "peerDependencies": { 48 | "react": "^16.0.0", 49 | "recompose": "^0.24.0" 50 | }, 51 | "dependencies": { 52 | "@hocs/with-debugger": "^0.1.0", 53 | "@hocs/with-log": "^0.1.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /react-dream-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xaviervia/react-dream/cc6fcd80dbf40a39824eaa25b7f1d6befc05335e/react-dream-logo.png -------------------------------------------------------------------------------- /react-dream-logo.svg: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <svg width="100px" height="100px" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 3 | <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 4 | <g id="Artboard" fill-rule="nonzero"> 5 | <g id="Logo-Outlines" transform="translate(14.000000, 10.000000)"> 6 | <g id="logo" transform="translate(1.680672, 0.000000)"> 7 | <path d="M30.6102946,32.4230068 C25.1000784,41.977908 21.1708151,51.9499688 19.6160274,60.1385726 C17.927117,69.0334194 19.1653393,75.6644898 22.143641,77.3821204 C23.5432528,78.1892289 25.8588072,78.1597615 28.766023,77.1330144 C32.0013269,75.9903958 35.6724055,73.7183975 39.3357162,70.5161489 C45.1874049,65.4011422 51.3579598,57.338465 56.9624708,47.6200316 C62.2973677,38.3690579 66.1066069,29.0740413 67.6882042,21.3969263 C69.6747746,11.7539069 68.4453371,4.40024296 65.2834101,2.57686679 C62.3150424,0.865092734 55.7999635,3.26041404 48.8292041,9.32674245 C42.5526911,14.7889879 36.0524209,22.9862573 30.6102946,32.4230068 Z M27.1160882,30.4079241 C32.7704279,20.6031925 39.5468243,12.0577097 46.1812282,6.28400334 C54.3170443,-0.796219734 62.3726567,-3.75793064 67.2984311,-0.917375307 C72.4353929,2.04493648 73.939661,11.0424516 71.6388534,22.210811 C69.9622042,30.3493104 65.9927212,40.0353419 60.4566859,49.6350994 C54.647792,59.7079403 48.2177754,68.1096399 41.9903625,73.5530701 C33.7058824,80.7948706 25.1979082,83.7996484 20.1285639,80.8763301 C15.2205445,78.0458029 13.6783627,69.7869335 15.6532152,59.386139 C17.2979552,50.723783 21.3917977,40.334037 27.1160882,30.4079241 Z" id="Shape-Copy-5" fill="#000080"></path> 8 | <path d="M27.2489501,32.4230068 C21.7387338,41.977908 17.8094706,51.9499688 16.2546829,60.1385726 C14.5657725,69.0334194 15.8039948,75.6644898 18.7822965,77.3821204 C20.1819082,78.1892289 22.4974627,78.1597615 25.4046784,77.1330144 C28.6399824,75.9903958 32.311061,73.7183975 35.9743716,70.5161489 C41.8260604,65.4011422 47.9966152,57.338465 53.6011263,47.6200316 C58.9360232,38.3690579 62.7452624,29.0740413 64.3268596,21.3969263 C66.31343,11.7539069 65.0839926,4.40024296 61.9220656,2.57686679 C58.9536978,0.865092734 52.438619,3.26041404 45.4678595,9.32674245 C39.1913466,14.7889879 32.6910764,22.9862573 27.2489501,32.4230068 Z M23.7547436,30.4079241 C29.4090833,20.6031925 36.1854798,12.0577097 42.8198837,6.28400334 C50.9556997,-0.796219734 59.0113121,-3.75793064 63.9370866,-0.917375307 C69.0740483,2.04493648 70.5783164,11.0424516 68.2775088,22.210811 C66.6008597,30.3493104 62.6313766,40.0353419 57.0953414,49.6350994 C51.2864475,59.7079403 44.8564309,68.1096399 38.629018,73.5530701 C30.3445379,80.7948706 21.8365636,83.7996484 16.7672194,80.8763301 C11.8592,78.0458029 10.3170182,69.7869335 12.2918706,59.386139 C13.9366106,50.723783 18.0304532,40.334037 23.7547436,30.4079241 Z" id="Shape" fill="#00D8FF"></path> 9 | <path d="M23.8876056,32.4230068 C18.3773893,41.977908 14.448126,51.9499688 12.8933384,60.1385726 C11.204428,69.0334194 12.4426503,75.6644898 15.4209519,77.3821204 C16.8205637,78.1892289 19.1361181,78.1597615 22.0433339,77.1330144 C25.2786379,75.9903958 28.9497164,73.7183975 32.6130271,70.5161489 C38.4647159,65.4011422 44.6352707,57.338465 50.2397818,47.6200316 C55.5746786,38.3690579 59.3839178,29.0740413 60.9655151,21.3969263 C62.9520855,11.7539069 61.7226481,4.40024296 58.5607211,2.57686679 C55.5923533,0.865092734 49.0772744,3.26041404 42.106515,9.32674245 C35.8300021,14.7889879 29.3297318,22.9862573 23.8876056,32.4230068 Z M20.3933991,30.4079241 C26.0477388,20.6031925 32.8241352,12.0577097 39.4585391,6.28400334 C47.5943552,-0.796219734 55.6499676,-3.75793064 60.575742,-0.917375307 C65.7127038,2.04493648 67.2169719,11.0424516 64.9161643,22.210811 C63.2395151,30.3493104 59.2700321,40.0353419 53.7339969,49.6350994 C47.925103,59.7079403 41.4950864,68.1096399 35.2676734,73.5530701 C26.9831933,80.7948706 18.4752191,83.7996484 13.4058748,80.8763301 C8.49785541,78.0458029 6.95567363,69.7869335 8.93052609,59.386139 C10.5752661,50.723783 14.6691087,40.334037 20.3933991,30.4079241 Z" id="Shape-Copy" fill="#00FF00"></path> 10 | <path d="M20.526261,32.4230068 C15.0160448,41.977908 11.0867815,51.9499688 9.53199382,60.1385726 C7.84308343,69.0334194 9.08130572,75.6644898 12.0596074,77.3821204 C13.4592192,78.1892289 15.7747736,78.1597615 18.6819894,77.1330144 C21.9172933,75.9903958 25.5883719,73.7183975 29.2516826,70.5161489 C35.1033713,65.4011422 41.2739262,57.338465 46.8784372,47.6200316 C52.2133341,38.3690579 56.0225733,29.0740413 57.6041705,21.3969263 C59.590741,11.7539069 58.3613035,4.40024296 55.1993765,2.57686679 C52.2310087,0.865092734 45.7159299,3.26041404 38.7451704,9.32674245 C32.4686575,14.7889879 25.9683873,22.9862573 20.526261,32.4230068 Z M17.0320545,30.4079241 C22.6863943,20.6031925 29.4627907,12.0577097 36.0971946,6.28400334 C44.2330106,-0.796219734 52.2886231,-3.75793064 57.2143975,-0.917375307 C62.3513593,2.04493648 63.8556273,11.0424516 61.5548198,22.210811 C59.8781706,30.3493104 55.9086876,40.0353419 50.3726523,49.6350994 C44.5637584,59.7079403 38.1337418,68.1096399 31.9063289,73.5530701 C23.6218488,80.7948706 15.1138746,83.7996484 10.0445303,80.8763301 C5.13651088,78.0458029 3.59432909,69.7869335 5.56918155,59.386139 C7.21392157,50.723783 11.3077641,40.334037 17.0320545,30.4079241 Z" id="Shape-Copy-2" fill="#FFFF00"></path> 11 | <path d="M17.1649165,32.4230068 C11.6547002,41.977908 7.72543696,51.9499688 6.17064928,60.1385726 C4.48173889,69.0334194 5.71996118,75.6644898 8.69826286,77.3821204 C10.0978746,78.1892289 12.4134291,78.1597615 15.3206448,77.1330144 C18.5559488,75.9903958 22.2270273,73.7183975 25.890338,70.5161489 C31.7420268,65.4011422 37.9125816,57.338465 43.5170927,47.6200316 C48.8519895,38.3690579 52.6612288,29.0740413 54.242826,21.3969263 C56.2293964,11.7539069 54.999959,4.40024296 51.838032,2.57686679 C48.8696642,0.865092734 42.3545854,3.26041404 35.3838259,9.32674245 C29.107313,14.7889879 22.6070428,22.9862573 17.1649165,32.4230068 Z M13.67071,30.4079241 C19.3250497,20.6031925 26.1014461,12.0577097 32.73585,6.28400334 C40.8716661,-0.796219734 48.9272785,-3.75793064 53.853053,-0.917375307 C58.9900147,2.04493648 60.4942828,11.0424516 58.1934752,22.210811 C56.5168261,30.3493104 52.547343,40.0353419 47.0113078,49.6350994 C41.2024139,59.7079403 34.7723973,68.1096399 28.5449843,73.5530701 C20.2605043,80.7948706 11.75253,83.7996484 6.68318577,80.8763301 C1.77516634,78.0458029 0.232984553,69.7869335 2.20783701,59.386139 C3.85257704,50.723783 7.9464196,40.334037 13.67071,30.4079241 Z" id="Shape-Copy-3" fill="#FF6600"></path> 12 | <path d="M13.803572,32.4230068 C8.29335569,41.977908 4.36409242,51.9499688 2.80930475,60.1385726 C1.12039435,69.0334194 2.35861664,75.6644898 5.33691832,77.3821204 C6.73653009,78.1892289 9.05208453,78.1597615 11.9593003,77.1330144 C15.1946042,75.9903958 18.8656828,73.7183975 22.5289935,70.5161489 C28.3806822,65.4011422 34.5512371,57.338465 40.1557481,47.6200316 C45.490645,38.3690579 49.2998842,29.0740413 50.8814815,21.3969263 C52.8680519,11.7539069 51.6386145,4.40024296 48.4766874,2.57686679 C45.5083197,0.865092734 38.9932408,3.26041404 32.0224814,9.32674245 C25.7459684,14.7889879 19.2456982,22.9862573 13.803572,32.4230068 Z M10.3093655,30.4079241 C15.9637052,20.6031925 22.7401016,12.0577097 29.3745055,6.28400334 C37.5103216,-0.796219734 45.565934,-3.75793064 50.4917084,-0.917375307 C55.6286702,2.04493648 57.1329383,11.0424516 54.8321307,22.210811 C53.1554815,30.3493104 49.1859985,40.0353419 43.6499632,49.6350994 C37.8410693,59.7079403 31.4110528,68.1096399 25.1836398,73.5530701 C16.8991597,80.7948706 8.39118549,83.7996484 3.32184123,80.8763301 C-1.5861782,78.0458029 -3.12835998,69.7869335 -1.15350752,59.386139 C0.491232498,50.723783 4.58507506,40.334037 10.3093655,30.4079241 Z" id="Shape-Copy-4" fill="#FF0000"></path> 13 | </g> 14 | <g id="logo-copy" transform="translate(35.378151, 40.000000) scale(-1, 1) translate(-35.378151, -40.000000) "> 15 | <path d="M30.6102946,32.4230068 C25.1000784,41.977908 21.1708151,51.9499688 19.6160274,60.1385726 C17.927117,69.0334194 19.1653393,75.6644898 22.143641,77.3821204 C23.5432528,78.1892289 25.8588072,78.1597615 28.766023,77.1330144 C32.0013269,75.9903958 35.6724055,73.7183975 39.3357162,70.5161489 C45.1874049,65.4011422 51.3579598,57.338465 56.9624708,47.6200316 C62.2973677,38.3690579 66.1066069,29.0740413 67.6882042,21.3969263 C69.6747746,11.7539069 68.4453371,4.40024296 65.2834101,2.57686679 C62.3150424,0.865092734 55.7999635,3.26041404 48.8292041,9.32674245 C42.5526911,14.7889879 36.0524209,22.9862573 30.6102946,32.4230068 Z M27.1160882,30.4079241 C32.7704279,20.6031925 39.5468243,12.0577097 46.1812282,6.28400334 C54.3170443,-0.796219734 62.3726567,-3.75793064 67.2984311,-0.917375307 C72.4353929,2.04493648 73.939661,11.0424516 71.6388534,22.210811 C69.9622042,30.3493104 65.9927212,40.0353419 60.4566859,49.6350994 C54.647792,59.7079403 48.2177754,68.1096399 41.9903625,73.5530701 C33.7058824,80.7948706 25.1979082,83.7996484 20.1285639,80.8763301 C15.2205445,78.0458029 13.6783627,69.7869335 15.6532152,59.386139 C17.2979552,50.723783 21.3917977,40.334037 27.1160882,30.4079241 Z" id="Shape-Copy-5" fill="#000080"></path> 16 | <path d="M27.2489501,32.4230068 C21.7387338,41.977908 17.8094706,51.9499688 16.2546829,60.1385726 C14.5657725,69.0334194 15.8039948,75.6644898 18.7822965,77.3821204 C20.1819082,78.1892289 22.4974627,78.1597615 25.4046784,77.1330144 C28.6399824,75.9903958 32.311061,73.7183975 35.9743716,70.5161489 C41.8260604,65.4011422 47.9966152,57.338465 53.6011263,47.6200316 C58.9360232,38.3690579 62.7452624,29.0740413 64.3268596,21.3969263 C66.31343,11.7539069 65.0839926,4.40024296 61.9220656,2.57686679 C58.9536978,0.865092734 52.438619,3.26041404 45.4678595,9.32674245 C39.1913466,14.7889879 32.6910764,22.9862573 27.2489501,32.4230068 Z M23.7547436,30.4079241 C29.4090833,20.6031925 36.1854798,12.0577097 42.8198837,6.28400334 C50.9556997,-0.796219734 59.0113121,-3.75793064 63.9370866,-0.917375307 C69.0740483,2.04493648 70.5783164,11.0424516 68.2775088,22.210811 C66.6008597,30.3493104 62.6313766,40.0353419 57.0953414,49.6350994 C51.2864475,59.7079403 44.8564309,68.1096399 38.629018,73.5530701 C30.3445379,80.7948706 21.8365636,83.7996484 16.7672194,80.8763301 C11.8592,78.0458029 10.3170182,69.7869335 12.2918706,59.386139 C13.9366106,50.723783 18.0304532,40.334037 23.7547436,30.4079241 Z" id="Shape" fill="#00D8FF"></path> 17 | <path d="M23.8876056,32.4230068 C18.3773893,41.977908 14.448126,51.9499688 12.8933384,60.1385726 C11.204428,69.0334194 12.4426503,75.6644898 15.4209519,77.3821204 C16.8205637,78.1892289 19.1361181,78.1597615 22.0433339,77.1330144 C25.2786379,75.9903958 28.9497164,73.7183975 32.6130271,70.5161489 C38.4647159,65.4011422 44.6352707,57.338465 50.2397818,47.6200316 C55.5746786,38.3690579 59.3839178,29.0740413 60.9655151,21.3969263 C62.9520855,11.7539069 61.7226481,4.40024296 58.5607211,2.57686679 C55.5923533,0.865092734 49.0772744,3.26041404 42.106515,9.32674245 C35.8300021,14.7889879 29.3297318,22.9862573 23.8876056,32.4230068 Z M20.3933991,30.4079241 C26.0477388,20.6031925 32.8241352,12.0577097 39.4585391,6.28400334 C47.5943552,-0.796219734 55.6499676,-3.75793064 60.575742,-0.917375307 C65.7127038,2.04493648 67.2169719,11.0424516 64.9161643,22.210811 C63.2395151,30.3493104 59.2700321,40.0353419 53.7339969,49.6350994 C47.925103,59.7079403 41.4950864,68.1096399 35.2676734,73.5530701 C26.9831933,80.7948706 18.4752191,83.7996484 13.4058748,80.8763301 C8.49785541,78.0458029 6.95567363,69.7869335 8.93052609,59.386139 C10.5752661,50.723783 14.6691087,40.334037 20.3933991,30.4079241 Z" id="Shape-Copy" fill="#00FF00"></path> 18 | <path d="M20.526261,32.4230068 C15.0160448,41.977908 11.0867815,51.9499688 9.53199382,60.1385726 C7.84308343,69.0334194 9.08130572,75.6644898 12.0596074,77.3821204 C13.4592192,78.1892289 15.7747736,78.1597615 18.6819894,77.1330144 C21.9172933,75.9903958 25.5883719,73.7183975 29.2516826,70.5161489 C35.1033713,65.4011422 41.2739262,57.338465 46.8784372,47.6200316 C52.2133341,38.3690579 56.0225733,29.0740413 57.6041705,21.3969263 C59.590741,11.7539069 58.3613035,4.40024296 55.1993765,2.57686679 C52.2310087,0.865092734 45.7159299,3.26041404 38.7451704,9.32674245 C32.4686575,14.7889879 25.9683873,22.9862573 20.526261,32.4230068 Z M17.0320545,30.4079241 C22.6863943,20.6031925 29.4627907,12.0577097 36.0971946,6.28400334 C44.2330106,-0.796219734 52.2886231,-3.75793064 57.2143975,-0.917375307 C62.3513593,2.04493648 63.8556273,11.0424516 61.5548198,22.210811 C59.8781706,30.3493104 55.9086876,40.0353419 50.3726523,49.6350994 C44.5637584,59.7079403 38.1337418,68.1096399 31.9063289,73.5530701 C23.6218488,80.7948706 15.1138746,83.7996484 10.0445303,80.8763301 C5.13651088,78.0458029 3.59432909,69.7869335 5.56918155,59.386139 C7.21392157,50.723783 11.3077641,40.334037 17.0320545,30.4079241 Z" id="Shape-Copy-2" fill="#FFFF00"></path> 19 | <path d="M17.1649165,32.4230068 C11.6547002,41.977908 7.72543696,51.9499688 6.17064928,60.1385726 C4.48173889,69.0334194 5.71996118,75.6644898 8.69826286,77.3821204 C10.0978746,78.1892289 12.4134291,78.1597615 15.3206448,77.1330144 C18.5559488,75.9903958 22.2270273,73.7183975 25.890338,70.5161489 C31.7420268,65.4011422 37.9125816,57.338465 43.5170927,47.6200316 C48.8519895,38.3690579 52.6612288,29.0740413 54.242826,21.3969263 C56.2293964,11.7539069 54.999959,4.40024296 51.838032,2.57686679 C48.8696642,0.865092734 42.3545854,3.26041404 35.3838259,9.32674245 C29.107313,14.7889879 22.6070428,22.9862573 17.1649165,32.4230068 Z M13.67071,30.4079241 C19.3250497,20.6031925 26.1014461,12.0577097 32.73585,6.28400334 C40.8716661,-0.796219734 48.9272785,-3.75793064 53.853053,-0.917375307 C58.9900147,2.04493648 60.4942828,11.0424516 58.1934752,22.210811 C56.5168261,30.3493104 52.547343,40.0353419 47.0113078,49.6350994 C41.2024139,59.7079403 34.7723973,68.1096399 28.5449843,73.5530701 C20.2605043,80.7948706 11.75253,83.7996484 6.68318577,80.8763301 C1.77516634,78.0458029 0.232984553,69.7869335 2.20783701,59.386139 C3.85257704,50.723783 7.9464196,40.334037 13.67071,30.4079241 Z" id="Shape-Copy-3" fill="#FF6600"></path> 20 | <path d="M13.803572,32.4230068 C8.29335569,41.977908 4.36409242,51.9499688 2.80930475,60.1385726 C1.12039435,69.0334194 2.35861664,75.6644898 5.33691832,77.3821204 C6.73653009,78.1892289 9.05208453,78.1597615 11.9593003,77.1330144 C15.1946042,75.9903958 18.8656828,73.7183975 22.5289935,70.5161489 C28.3806822,65.4011422 34.5512371,57.338465 40.1557481,47.6200316 C45.490645,38.3690579 49.2998842,29.0740413 50.8814815,21.3969263 C52.8680519,11.7539069 51.6386145,4.40024296 48.4766874,2.57686679 C45.5083197,0.865092734 38.9932408,3.26041404 32.0224814,9.32674245 C25.7459684,14.7889879 19.2456982,22.9862573 13.803572,32.4230068 Z M10.3093655,30.4079241 C15.9637052,20.6031925 22.7401016,12.0577097 29.3745055,6.28400334 C37.5103216,-0.796219734 45.565934,-3.75793064 50.4917084,-0.917375307 C55.6286702,2.04493648 57.1329383,11.0424516 54.8321307,22.210811 C53.1554815,30.3493104 49.1859985,40.0353419 43.6499632,49.6350994 C37.8410693,59.7079403 31.4110528,68.1096399 25.1836398,73.5530701 C16.8991597,80.7948706 8.39118549,83.7996484 3.32184123,80.8763301 C-1.5861782,78.0458029 -3.12835998,69.7869335 -1.15350752,59.386139 C0.491232498,50.723783 4.58507506,40.334037 10.3093655,30.4079241 Z" id="Shape-Copy-4" fill="#FF0000"></path> 21 | </g> 22 | </g> 23 | </g> 24 | </g> 25 | </svg> 26 | -------------------------------------------------------------------------------- /src/ReactDream.js: -------------------------------------------------------------------------------- 1 | import compose from 'recompose/compose' 2 | import setDisplayName from 'recompose/setDisplayName' 3 | import recomposeDefaultProps from 'recompose/defaultProps' 4 | import setPropTypes from 'recompose/setPropTypes' 5 | import withDebugger from '@hocs/with-debugger' 6 | import withLog from '@hocs/with-log' 7 | import doAp from './internals/doAp' 8 | import doConcat from './internals/doConcat' 9 | import doContramap from './internals/doContramap' 10 | import doMap from './internals/doMap' 11 | import doPromap from './internals/doPromap' 12 | import doRotate from './internals/doRotate' 13 | import doTranslate from './internals/doTranslate' 14 | import doScale from './internals/doScale' 15 | import styleFromProps from './styleFromProps' 16 | 17 | // ALGEBRAS 18 | // ////////////////////////////////////////////////////////////////////////// // 19 | 20 | // ap : higherOrderComponent -> ReactDream -> ReactDream 21 | const ap = higherOrderComponent => ReactDreamComponent => 22 | ReactDream(doAp(higherOrderComponent)(ReactDreamComponent)) 23 | 24 | // chain : Component -> (Component -> ReactDream) -> ReactDream 25 | const chain = Component => kleisliReactDreamComponent => kleisliReactDreamComponent(Component) 26 | 27 | // map : Component -> (Component -> Component) -> ReactDream 28 | const map = Component => higherOrderComponent => ReactDream(doMap(higherOrderComponent)(Component)) 29 | 30 | // concat : Component -> Component -> ReactDream 31 | const concat = Component => OtherComponent => 32 | ReactDream(doConcat(OtherComponent.Component)(Component)) 33 | 34 | // contramap : Component -> (a -> Props) -> ReactDream 35 | const contramap = Component => propsPreprocessor => 36 | ReactDream(doContramap(propsPreprocessor)(Component)) 37 | 38 | // promap : Component -> (a -> Props) -> (Component -> Component) -> ReactDream 39 | const promap = Component => (propsPreprocessor, higherOrderComponent) => 40 | ReactDream(doPromap(propsPreprocessor, higherOrderComponent)(Component)) 41 | 42 | // CUSTOM HELPERS 43 | // ////////////////////////////////////////////////////////////////////////// // 44 | 45 | // addProps : Component -> (Props -> Props) -> ReactDream 46 | const addProps = Component => getPropsToAdd => 47 | contramap(Component)(props => ({ 48 | ...getPropsToAdd(props), 49 | ...props, 50 | })) 51 | 52 | // fork : Component -> (Component -> a) -> a 53 | const fork = Component => extractComponent => extractComponent(Component) 54 | 55 | // debug : Component -> () -> IO ReactDream 56 | const debug = Component => () => ReactDream(withDebugger(Component)) 57 | 58 | // defaultProps : Component -> (Props) -> ReactDream 59 | const defaultProps = Component => props => ReactDream(recomposeDefaultProps(props)(Component)) 60 | 61 | // log : Component -> (Props -> String) -> IO ReactDream 62 | const log = Component => messageFromProps => ReactDream(withLog(messageFromProps)(Component)) 63 | 64 | // name : Component -> String -> ReactDream 65 | const name = Component => compose(map(Component), setDisplayName) 66 | 67 | // removeProps : Component -> (...Array) -> ReactDream 68 | const removeProps = Component => (...propsToRemove) => 69 | contramap(Component)(props => { 70 | // Nasty but efficient 71 | const propsCopy = { ...props } 72 | propsToRemove.forEach(propName => { 73 | delete propsCopy[propName] 74 | }) 75 | return propsCopy 76 | }) 77 | 78 | // propTypes : Component -> (PropTypes) -> ReactDream 79 | const propTypes = Component => propTypesToSet => ReactDream(setPropTypes(propTypesToSet)(Component)) 80 | 81 | // translate : Component -> (Props -> [Number]) -> ReactDream 82 | const translate = Component => getTranslateFromProps => 83 | ReactDream(doTranslate(getTranslateFromProps)(Component)) 84 | 85 | // rotate : Component -> (Props -> Number) -> ReactDream 86 | const rotate = Component => getRotateFromProps => 87 | ReactDream(doRotate(getRotateFromProps)(Component)) 88 | 89 | // scale : Component -> (Props -> Number) -> ReactDream 90 | const scale = Component => getScaleFromProps => ReactDream(doScale(getScaleFromProps)(Component)) 91 | 92 | // style : Component -> (Props -> Style) -> ReactDream 93 | const style = Component => getStyleFromProps => 94 | contramap(Component)(styleFromProps(getStyleFromProps)) 95 | 96 | // TYPE 97 | // ////////////////////////////////////////////////////////////////////////// // 98 | 99 | // ReactDream : Component -> ReactDream 100 | const ReactDream = Component => ({ 101 | Component, 102 | 103 | // Algebras 104 | ap: ap(Component), 105 | chain: chain(Component), 106 | concat: concat(Component), 107 | contramap: contramap(Component), 108 | map: map(Component), 109 | promap: promap(Component), 110 | 111 | // Custom helpers 112 | addProps: addProps(Component), 113 | debug: debug(Component), 114 | defaultProps: defaultProps(Component), 115 | fork: fork(Component), 116 | name: name(Component), 117 | log: log(Component), 118 | propTypes: propTypes(Component), 119 | removeProps: removeProps(Component), 120 | rotate: rotate(Component), 121 | scale: scale(Component), 122 | style: style(Component), 123 | translate: translate(Component), 124 | }) 125 | 126 | ReactDream.of = ReactDream 127 | 128 | export const of = ReactDream.of 129 | 130 | export default ReactDream 131 | -------------------------------------------------------------------------------- /src/createElementWithProps.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default props => Component => <Component {...props} /> 4 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import ReactDream from './ReactDream' 2 | 3 | export { default as createElementWithProps } from './createElementWithProps' 4 | 5 | export { default as styleFromProps } from './styleFromProps' 6 | 7 | export { default as withStyleFromProps } from './withStyleFromProps' 8 | 9 | export { default as addProps } from './partialApplication/addProps' 10 | export { default as ap } from './partialApplication/ap' 11 | export { default as chain } from './partialApplication/chain' 12 | export { default as concat } from './partialApplication/concat' 13 | export { default as contramap } from './partialApplication/contramap' 14 | export { default as debug } from './partialApplication/debug' 15 | export { default as defaultProps } from './partialApplication/defaultProps' 16 | export { default as fork } from './partialApplication/fork' 17 | export { default as log } from './partialApplication/log' 18 | export { default as map } from './partialApplication/map' 19 | export { default as name } from './partialApplication/name' 20 | export { default as promap } from './partialApplication/promap' 21 | export { default as propTypes } from './partialApplication/propTypes' 22 | export { default as removeProps } from './partialApplication/removeProps' 23 | export { default as rotate } from './partialApplication/rotate' 24 | export { default as scale } from './partialApplication/scale' 25 | export { default as style } from './partialApplication/style' 26 | export { default as translate } from './partialApplication/translate' 27 | 28 | export const of = ReactDream 29 | 30 | export default ReactDream 31 | -------------------------------------------------------------------------------- /src/internals/doAp.js: -------------------------------------------------------------------------------- 1 | // doAp : (Component -> Component) -> ReactDream -> Component 2 | export default higherOrderComponent => DreamComponent => DreamComponent.fork(higherOrderComponent) 3 | -------------------------------------------------------------------------------- /src/internals/doConcat.js: -------------------------------------------------------------------------------- 1 | import React, { Fragment } from 'react' 2 | import getDisplayName from 'recompose/getDisplayName' 3 | import setDisplayName from 'recompose/setDisplayName' 4 | 5 | // doConcat : Component -> Component -> Component 6 | export default ComponentA => ComponentB => 7 | setDisplayName( 8 | getDisplayName(ComponentB).concat(getDisplayName(ComponentA)) 9 | )(props => <Fragment> 10 | <ComponentB {...props} /> 11 | <ComponentA {...props} /> 12 | </Fragment>) 13 | -------------------------------------------------------------------------------- /src/internals/doContramap.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import compose from 'recompose/compose' 3 | import getDisplayName from 'recompose/getDisplayName' 4 | import isReferentiallyTransparentFunctionComponent from '../isReferentiallyTransparentFunctionComponent' 5 | 6 | // doContramap : (a -> Props) -> Component -> Component 7 | export default propsPreprocessor => Component => { 8 | const Enhanced = isReferentiallyTransparentFunctionComponent(Component) 9 | ? compose(Component, propsPreprocessor) 10 | : props => <Component {...propsPreprocessor(props)} /> 11 | 12 | Enhanced.displayName = getDisplayName(Component) 13 | 14 | return Enhanced 15 | } 16 | -------------------------------------------------------------------------------- /src/internals/doMap.js: -------------------------------------------------------------------------------- 1 | // (Component -> Component) -> Component -> Component 2 | export default higherOrderComponent => Component => higherOrderComponent(Component) 3 | -------------------------------------------------------------------------------- /src/internals/doPromap.js: -------------------------------------------------------------------------------- 1 | import compose from 'recompose/compose' 2 | import doContramap from './doContramap' 3 | import doMap from './doMap' 4 | 5 | // doPromap : ((a -> Props), (Component -> Component)) -> Component -> Component 6 | export default (propsPreprocessor, higherOrderComponent) => 7 | compose(doMap(higherOrderComponent), doContramap(propsPreprocessor)) 8 | -------------------------------------------------------------------------------- /src/internals/doRotate.js: -------------------------------------------------------------------------------- 1 | import { compose } from 'recompose' 2 | import doContramap from './doContramap' 3 | 4 | const calculateTransform = oldTransform => rotation => 5 | oldTransform ? `${oldTransform} rotate(${rotation}deg)` : `rotate(${rotation}deg)` 6 | 7 | // doRotate : (Props -> Number) -> Component -> Component 8 | export default getRotateFromProps => Component => 9 | doContramap(props => ({ 10 | ...props, 11 | style: { 12 | ...props.style, 13 | transform: compose( 14 | calculateTransform(props && props.style && props.style.transform), 15 | getRotateFromProps 16 | )(props), 17 | }, 18 | }))(Component) 19 | -------------------------------------------------------------------------------- /src/internals/doScale.js: -------------------------------------------------------------------------------- 1 | import { compose } from 'recompose' 2 | import doContramap from './doContramap' 3 | 4 | const calculateTransform = oldTransform => scaling => 5 | oldTransform ? `${oldTransform} scale(${scaling})` : `scale(${scaling})` 6 | 7 | // doScale : (Props -> Number) -> Component -> Component 8 | export default getScaleFromProps => Component => 9 | doContramap(props => ({ 10 | ...props, 11 | style: { 12 | ...props.style, 13 | transform: compose( 14 | calculateTransform(props && props.style && props.style.transform), 15 | getScaleFromProps 16 | )(props), 17 | }, 18 | }))(Component) 19 | -------------------------------------------------------------------------------- /src/internals/doTranslate.js: -------------------------------------------------------------------------------- 1 | import { compose } from 'recompose' 2 | import doContramap from './doContramap' 3 | 4 | const calculateTransform = oldTransform => ([x, y, z]) => { 5 | switch (true) { 6 | case x != null && y != null && z != null: 7 | return oldTransform 8 | ? `${oldTransform} translate3D(${x}px, ${y}px, ${z}px)` 9 | : `translate3D(${x}px, ${y}px, ${z}px)` 10 | 11 | case x != null && y != null: 12 | return oldTransform 13 | ? `${oldTransform} translate(${x}px, ${y}px)` 14 | : `translate(${x}px, ${y}px)` 15 | 16 | case z != null: 17 | return oldTransform ? `${oldTransform} translateZ(${z}px)` : `translateZ(${z}px)` 18 | 19 | case y != null: 20 | return oldTransform ? `${oldTransform} translateY(${y}px)` : `translateY(${y}px)` 21 | 22 | case x != null: 23 | return oldTransform ? `${oldTransform} translateX(${x}px)` : `translateX(${x}px)` 24 | } 25 | } 26 | 27 | // doTranslate : (Props -> [Number]) -> Component -> Component 28 | export default getTranslateFromProps => Component => 29 | doContramap(props => ({ 30 | ...props, 31 | style: { 32 | ...props.style, 33 | transform: compose( 34 | calculateTransform(props && props.style && props.style.transform), 35 | getTranslateFromProps 36 | )(props), 37 | }, 38 | }))(Component) 39 | -------------------------------------------------------------------------------- /src/isReferentiallyTransparentFunctionComponent.js: -------------------------------------------------------------------------------- 1 | // This is now pointless and should be removed 2 | const isClassComponent = Component => 3 | Boolean( 4 | Component && 5 | Component.prototype && 6 | typeof Component.prototype.render === "function" 7 | ); 8 | 9 | const isReferentiallyTransparentFunctionComponent = Component => 10 | Boolean( 11 | typeof Component === "function" && 12 | !isClassComponent(Component) && 13 | !Component.defaultProps && 14 | !Component.contextTypes 15 | ); 16 | 17 | export default isReferentiallyTransparentFunctionComponent; 18 | -------------------------------------------------------------------------------- /src/partialApplication/addProps.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.addProps(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/ap.js: -------------------------------------------------------------------------------- 1 | export default f => apply => apply.ap(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/chain.js: -------------------------------------------------------------------------------- 1 | export default f => chainable => chainable.chain(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/concat.js: -------------------------------------------------------------------------------- 1 | export default f => x => x.concat(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/contramap.js: -------------------------------------------------------------------------------- 1 | export default f => contravariant => contravariant.contramap(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/debug.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.debug(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/defaultProps.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.defaultProps(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/fork.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.fork(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/log.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.log(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/map.js: -------------------------------------------------------------------------------- 1 | export default f => functor => functor.map(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/name.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.name(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/promap.js: -------------------------------------------------------------------------------- 1 | export default f => profunctor => profunctor.promap(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/propTypes.js: -------------------------------------------------------------------------------- 1 | export default f => x => x.propTypes(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/removeProps.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.removeProps(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/rotate.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.rotate(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/scale.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.scale(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/style.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.style(f) 2 | -------------------------------------------------------------------------------- /src/partialApplication/translate.js: -------------------------------------------------------------------------------- 1 | export default f => reactDream => reactDream.translate(f) 2 | -------------------------------------------------------------------------------- /src/styleFromProps.js: -------------------------------------------------------------------------------- 1 | // styleFromProps : (Props -> Style) -> (Props -> Props) 2 | export default getStyleFromProps => props => ({ 3 | ...props, 4 | style: { 5 | ...getStyleFromProps(props), 6 | ...(props.style || {}), 7 | }, 8 | }) 9 | -------------------------------------------------------------------------------- /src/withStyleFromProps.js: -------------------------------------------------------------------------------- 1 | import doContramap from './internals/doContramap' 2 | import styleFromProps from './styleFromProps' 3 | 4 | export default getStyleFromProps => doContramap(styleFromProps(getStyleFromProps)) 5 | -------------------------------------------------------------------------------- /test/ReactDream.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { create } from 'react-test-renderer' 3 | import ReactDream, { of } from '../src/ReactDream' 4 | import { example, suite } from './dsl' 5 | 6 | const Target = x => x 7 | 8 | export default suite( 9 | 'ReactDream', 10 | 11 | example( 12 | 'wraps the Component', 13 | 14 | () => ReactDream(Target).Component, 15 | 16 | Target 17 | ), 18 | 19 | ...suite( 20 | 'Functor', 21 | 22 | ...suite( 23 | 'map', 24 | 25 | example( 26 | 'runs the Component through the HoC and puts it back in a ReactDream', 27 | 28 | () => { 29 | const Component = 1 30 | const higherOrderComponent = x => x + 1 31 | const EnhancedReactDreamComponent = ReactDream(Component).map(higherOrderComponent) 32 | 33 | return EnhancedReactDreamComponent.Component 34 | }, 35 | 36 | 2 37 | ) 38 | ) 39 | ), 40 | 41 | ...suite( 42 | 'Apply', 43 | ...suite( 44 | 'ap', 45 | example( 46 | 'passes the argument to the component', 47 | () => { 48 | const ReactDreamComponent = ReactDream(x => !x) 49 | 50 | return ReactDreamComponent.ap(ReactDream(false)).Component 51 | }, 52 | true 53 | ) 54 | ) 55 | ), 56 | 57 | ...suite( 58 | 'Applicative', 59 | ...suite( 60 | 'ReactDream.of', 61 | example( 62 | 'wraps the Component', 63 | () => ReactDream.of(Target).Component, 64 | Target 65 | ) 66 | ), 67 | 68 | ...suite( 69 | 'of - named export', 70 | example( 71 | 'wraps the Component', 72 | () => of(Target).Component, 73 | Target 74 | ) 75 | ) 76 | ), 77 | 78 | ...suite( 79 | 'Contravariant', 80 | 81 | ...suite( 82 | 'contramap', 83 | 84 | ...suite( 85 | 'is a referentially transparent function component', 86 | example( 87 | 'pre composes the propsPreprocesssor', 88 | () => { 89 | const ReferentiallyTransparentComponent = x => !x 90 | const propsPreprocessor = () => true 91 | const ReactDreamComponent = ReactDream(ReferentiallyTransparentComponent) 92 | 93 | return ReactDreamComponent.contramap(propsPreprocessor).Component() 94 | }, 95 | false 96 | ), 97 | 98 | ...suite( 99 | 'it has name', 100 | example( 101 | 'preserves the name as displayName', 102 | () => { 103 | function ReferentiallyTransparentComponent(x) { 104 | return x 105 | } 106 | 107 | const ReactDreamComponent = ReactDream(ReferentiallyTransparentComponent) 108 | 109 | return ReactDreamComponent.contramap(x => x).Component.displayName 110 | }, 111 | 'ReferentiallyTransparentComponent' 112 | ) 113 | ), 114 | 115 | ...suite( 116 | 'it has displayName', 117 | example( 118 | 'preserves it', 119 | () => { 120 | const ReferentiallyTransparentComponent = x => x 121 | ReferentiallyTransparentComponent.displayName = 'Casablanca' 122 | 123 | const ReactDreamComponent = ReactDream(ReferentiallyTransparentComponent) 124 | 125 | return ReactDreamComponent.contramap(x => x).Component.displayName 126 | }, 127 | 'Casablanca' 128 | ) 129 | ) 130 | ), 131 | 132 | ...suite( 133 | 'is not referentially transparent', 134 | example( 135 | 'returns a new component that wraps building the inner component with the propsPreprocesssor filtering the props', 136 | 137 | () => { 138 | class NotReferentiallyTransparent extends Component { 139 | constructor() { 140 | super() 141 | 142 | this.state = {} 143 | } 144 | 145 | render() { 146 | return ( 147 | <div> 148 | {this.props.name} 149 | </div> 150 | ) 151 | } 152 | } 153 | 154 | const propsPreprocesssor = () => ({ name: 'Regina Spektor' }) 155 | 156 | const ReactDreamComponent = ReactDream(NotReferentiallyTransparent) 157 | 158 | const Enhanced = ReactDreamComponent.contramap(propsPreprocesssor) 159 | 160 | const renderer = create(<Enhanced.Component />) 161 | 162 | return renderer.toJSON().children 163 | }, 164 | 165 | [ 'Regina Spektor' ] 166 | ), 167 | 168 | ...suite( 169 | 'it has name', 170 | example( 171 | 'preserves the name as displayName', 172 | 173 | () => { 174 | class NotReferentiallyTransparent extends Component { 175 | constructor() { 176 | super() 177 | 178 | this.state = {} 179 | } 180 | 181 | render() { 182 | return ( 183 | <div> 184 | {this.props.name} 185 | </div> 186 | ) 187 | } 188 | } 189 | 190 | const propsPreprocesssor = () => ({ name: 'Regina Spektor' }) 191 | 192 | const ReactDreamComponent = ReactDream(NotReferentiallyTransparent) 193 | 194 | const Enhanced = ReactDreamComponent.contramap(propsPreprocesssor) 195 | 196 | return Enhanced.Component.displayName 197 | }, 198 | 'NotReferentiallyTransparent' 199 | ) 200 | ), 201 | 202 | ...suite( 203 | 'it has displayName', 204 | example( 205 | 'preserves it', 206 | () => { 207 | class NotReferentiallyTransparent extends Component { 208 | constructor() { 209 | super() 210 | 211 | this.state = {} 212 | } 213 | 214 | render() { 215 | return ( 216 | <div> 217 | {this.props.name} 218 | </div> 219 | ) 220 | } 221 | } 222 | 223 | NotReferentiallyTransparent.displayName = 'BeginToHope' 224 | 225 | const propsPreprocesssor = () => ({ name: 'Regina Spektor' }) 226 | 227 | const ReactDreamComponent = ReactDream(NotReferentiallyTransparent) 228 | 229 | const Enhanced = ReactDreamComponent.contramap(propsPreprocesssor) 230 | 231 | return Enhanced.Component.displayName 232 | }, 233 | 'BeginToHope' 234 | ) 235 | ) 236 | ) 237 | ) 238 | ), 239 | 240 | ...suite( 241 | 'Monad', 242 | ...suite( 243 | 'chain', 244 | example( 245 | 'calls the argument function with the Component', 246 | () => { 247 | const ReactDreamComponent = ReactDream(x => x + 1) 248 | 249 | return ReactDreamComponent.chain(Component => ReactDream(x => Component(x) + 1)).Component(0) 250 | }, 251 | 2 252 | ) 253 | ) 254 | ), 255 | 256 | ...suite( 257 | 'Profunctor', 258 | ...suite( 259 | 'promap', 260 | example( 261 | 'passes the Component through the higher-order Component and the props preprocessor', 262 | 263 | () => { 264 | const propsPreprocessor = () => ({ name: 'Radiohead' }) 265 | const higherOrderComponent = Target => ({ name }) => 266 | <div> 267 | <Target> 268 | {name} 269 | </Target> 270 | </div> 271 | 272 | const Enhanced = ReactDream(props => <h1 {...props} />).promap( 273 | propsPreprocessor, 274 | higherOrderComponent 275 | ) 276 | 277 | const renderer = create(<Enhanced.Component />) 278 | 279 | return renderer.toJSON() 280 | }, 281 | 282 | { 283 | type: 'div', 284 | props: {}, 285 | children: [ 286 | { 287 | type: 'h1', 288 | props: { 289 | name: 'Radiohead' 290 | }, 291 | children: null 292 | } 293 | ] 294 | } 295 | ) 296 | ) 297 | ), 298 | 299 | ...suite( 300 | 'Semigroup', 301 | ...suite( 302 | 'concat', 303 | example( 304 | 'combines two Components so that they return an array of elements', 305 | () => { 306 | const Concatenation = ReactDream(({ x }) => x).concat(ReactDream(({ y }) => y)) 307 | 308 | const renderer = create(<Concatenation.Component x={1} y={2} />) 309 | 310 | return renderer.toJSON() 311 | }, 312 | [1, 2] 313 | ) 314 | ) 315 | ), 316 | 317 | ...suite( 318 | 'fork', 319 | example( 320 | 'exposes the inner Component to the passed in function', 321 | () => ReactDream(Target).fork(x => x), 322 | Target 323 | ) 324 | ), 325 | 326 | ...suite( 327 | 'name', 328 | example( 329 | 'sets displayName', 330 | () => { 331 | const Component = props => <hr /> 332 | const EnhancedReactDreamComponent = ReactDream(Component).name('Hr') 333 | 334 | return EnhancedReactDreamComponent.Component.displayName 335 | }, 336 | 'Hr' 337 | ) 338 | ), 339 | 340 | ...suite( 341 | 'style', 342 | example( 343 | 'sets the `style` prop with the return value', 344 | () => { 345 | const getStyleFromProps = ({ hovered }) => ({ 346 | backgroundColor: hovered ? 'blue' : 'black', 347 | }) 348 | 349 | const props = { hovered: true } 350 | 351 | const result = ReactDream(x => x).style(getStyleFromProps).Component(props) 352 | 353 | return result.style 354 | }, 355 | 356 | { 357 | backgroundColor: 'blue' 358 | } 359 | ), 360 | 361 | example( 362 | 'merges the `style` prop with existing value', 363 | () => { 364 | const getStyleFromProps = ({ hovered }) => ({ 365 | backgroundColor: hovered ? 'blue' : 'black', 366 | color: 'green', 367 | }) 368 | 369 | const props = { hovered: true, style: { backgroundColor: 'lightblue' } } 370 | 371 | const result = ReactDream(x => x).style(getStyleFromProps).Component(props) 372 | 373 | return result.style 374 | }, 375 | { 376 | backgroundColor: 'lightblue', 377 | color: 'green' 378 | } 379 | ) 380 | ), 381 | 382 | ...suite( 383 | 'addProps', 384 | example( 385 | 'merges with the props from the returned object, letting outside props override', 386 | 387 | () => { 388 | const ReactDreamComponent = ReactDream(x => x) 389 | const Enhanced = ReactDreamComponent.addProps(props => ({ 390 | a: 1, 391 | b: 2, 392 | })) 393 | 394 | const result = Enhanced.Component({ b: 3, c: 4 }) 395 | 396 | return result 397 | }, 398 | 399 | { 400 | a: 1, 401 | b: 3, 402 | c: 4 403 | } 404 | ) 405 | ), 406 | 407 | ...suite( 408 | 'removeProps', 409 | example( 410 | 'removes the specified props', 411 | 412 | () => { 413 | const ReactDreamComponent = ReactDream(x => x) 414 | const Enhanced = ReactDreamComponent.removeProps('hovered', 'focused') 415 | const result = Enhanced.Component({ hovered: true, focused: true, pressed: true }) 416 | 417 | return result 418 | }, 419 | 420 | { 421 | pressed: true, 422 | } 423 | ) 424 | ), 425 | 426 | ...suite( 427 | 'rotate', 428 | example( 429 | 'adds a rotation set in degrees', 430 | () => { 431 | const Enhanced = ReactDream(x => x).rotate(({ rotation }) => rotation * 360) 432 | 433 | const result = Enhanced.Component({ 434 | rotation: 0.5, 435 | }) 436 | 437 | return result.style.transform 438 | }, 439 | 440 | 'rotate(180deg)' 441 | ), 442 | 443 | ...suite( 444 | 'is there is a transform already', 445 | 446 | example( 447 | 'concatenates this other transform', 448 | () => { 449 | const Enhanced = ReactDream(x => x).rotate(({ rotation }) => rotation * 360) 450 | 451 | const result = Enhanced.Component({ 452 | rotation: 0.5, 453 | style: { 454 | transform: 'translate(20px, 20px)', 455 | }, 456 | }) 457 | 458 | return result.style.transform 459 | }, 460 | 'translate(20px, 20px) rotate(180deg)' 461 | ) 462 | ) 463 | ), 464 | 465 | ...suite( 466 | 'scale', 467 | example( 468 | 'adds a scaling factor', 469 | () => { 470 | const Enhanced = ReactDream(x => x).scale(({ big }) => (big ? 2 : 1)) 471 | 472 | const result = Enhanced.Component({ 473 | big: true, 474 | }) 475 | 476 | return result.style.transform 477 | }, 478 | 'scale(2)' 479 | ), 480 | 481 | ...suite( 482 | 'is there is a transform already', 483 | example( 484 | 'concatenates this other transform', 485 | () => { 486 | const Enhanced = ReactDream(x => x).scale(({ big }) => (big ? 2 : 1)) 487 | 488 | const result = Enhanced.Component({ 489 | big: true, 490 | style: { 491 | transform: 'translate(20px, 20px)', 492 | }, 493 | }) 494 | 495 | return result.style.transform 496 | }, 497 | 'translate(20px, 20px) scale(2)' 498 | ) 499 | ) 500 | ), 501 | 502 | 503 | ...suite( 504 | 'translate', 505 | ...suite( 506 | 'is there is a transform already', 507 | example( 508 | 'concatenates this other transform', 509 | () => { 510 | const Enhanced = ReactDream(x => x).translate(({ parentWidth, width }) => [ 511 | (parentWidth - width) / 2, 512 | ]) 513 | 514 | const result = Enhanced.Component({ 515 | parentWidth: 100, 516 | width: 20, 517 | style: { 518 | transform: 'rotate(60deg)', 519 | }, 520 | }) 521 | 522 | return result.style.transform 523 | }, 524 | 'rotate(60deg) translateX(40px)' 525 | ) 526 | ), 527 | 528 | ...suite( 529 | 'one argument is passed', 530 | example( 531 | 'sets the transform to a translate in X', 532 | () => { 533 | const Enhanced = ReactDream(x => x).translate(({ parentWidth, width }) => [ 534 | (parentWidth - width) / 2, 535 | ]) 536 | 537 | const result = Enhanced.Component({ parentWidth: 100, width: 20 }) 538 | 539 | return result.style.transform 540 | }, 541 | 'translateX(40px)' 542 | ) 543 | ), 544 | 545 | ...suite( 546 | 'two arguments are passed', 547 | example( 548 | 'sets the transform to a translate in X and Y', 549 | () => { 550 | const Enhanced = ReactDream(x => x).translate(({ parentSize, size }) => [ 551 | (parentSize - size) / 2, 552 | (parentSize - size) / 2, 553 | ]) 554 | 555 | const result = Enhanced.Component({ parentSize: 100, size: 20 }) 556 | 557 | return result.style.transform 558 | }, 559 | 'translate(40px, 40px)' 560 | ), 561 | 562 | ...suite( 563 | 'the first argument is empty', 564 | example( 565 | 'sets the transform to translate only Y', 566 | () => { 567 | const Enhanced = ReactDream(x => x).translate(({ parentHeight, height }) => [ 568 | null, 569 | (parentHeight - height) / 2, 570 | ]) 571 | 572 | const result = Enhanced.Component({ parentHeight: 100, height: 20 }) 573 | 574 | return result.style.transform 575 | }, 576 | 'translateY(40px)' 577 | ) 578 | ) 579 | ), 580 | 581 | ...suite( 582 | 'three arguments are passed', 583 | example( 584 | 'sets the transform to a translate in X, Y and Z', 585 | () => { 586 | const Enhanced = ReactDream(x => x).translate(({ parentSize, size }) => [ 587 | (parentSize - size) / 2, 588 | (parentSize - size) / 2, 589 | (parentSize - size) / 2, 590 | ]) 591 | 592 | const result = Enhanced.Component({ parentSize: 100, size: 20 }) 593 | 594 | return result.style.transform 595 | }, 596 | 'translate3D(40px, 40px, 40px)' 597 | ), 598 | 599 | ...suite( 600 | 'the first and second arguments are empty', 601 | example( 602 | 'sets the transform to translate only Z', 603 | () => { 604 | const Enhanced = ReactDream(x => x).translate(({ parentHeight, height }) => [ 605 | null, 606 | null, 607 | (parentHeight - height) / 2, 608 | ]) 609 | 610 | const result = Enhanced.Component({ parentHeight: 100, height: 20 }) 611 | 612 | return result.style.transform 613 | }, 614 | 'translateZ(40px)' 615 | ) 616 | ) 617 | ) 618 | ), 619 | 620 | ...suite( 621 | 'defaultProps', 622 | example( 623 | 'sets the defaultProps', 624 | () => { 625 | const Enhanced = ReactDream(x => x) 626 | .defaultProps({ 627 | title: 'Hello', 628 | description: 'Default Props', 629 | }) 630 | 631 | return Enhanced.Component.defaultProps 632 | }, 633 | { 634 | title: 'Hello', 635 | description: 'Default Props', 636 | } 637 | ) 638 | ), 639 | ...suite( 640 | 'propTypes', 641 | example( 642 | 'sets the propTypes', 643 | () => { 644 | const Enhanced = ReactDream(x => x).propTypes({ 645 | title: 'dummy propType', 646 | description: 'dummy propType', 647 | }) 648 | 649 | return Enhanced.Component.propTypes 650 | }, 651 | { 652 | title: 'dummy propType', 653 | description: 'dummy propType', 654 | } 655 | ) 656 | ) 657 | ) 658 | -------------------------------------------------------------------------------- /test/createElementWithProps.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { create } from 'react-test-renderer' 3 | import { pick } from 'ramda' 4 | import createElementWithProps from '../src/createElementWithProps' 5 | import { suite, example } from './dsl' 6 | 7 | 8 | export default suite( 9 | 'createElementWithProps', 10 | 11 | example( 12 | 'creates the React element with the given props', 13 | 14 | () => { 15 | const Component = props => <div {...props} /> 16 | 17 | const renderer = create(createElementWithProps({ background: 'red' })(Component)) 18 | 19 | return renderer.toJSON() 20 | }, 21 | 22 | { 23 | type: 'div', 24 | props: { 25 | background: 'red' 26 | }, 27 | children: null 28 | } 29 | ) 30 | ) 31 | -------------------------------------------------------------------------------- /test/dsl.js: -------------------------------------------------------------------------------- 1 | export const suite = (name, ...suite) => 2 | suite.map(x => ({...x, description: `${name}: ${x.description}`})) 3 | 4 | export const example = (description, test, shouldEqual) => 5 | ({ description, test, shouldEqual }) 6 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | import washington from 'washington' 2 | 3 | import EntrypointReactDream, * as entrypoint from '../src' 4 | 5 | import DirectReactDream from '../src/ReactDream' 6 | import addProps from '../src/partialApplication/addProps' 7 | import ap from '../src/partialApplication/ap' 8 | import chain from '../src/partialApplication/chain' 9 | import concat from '../src/partialApplication/concat' 10 | import contramap from '../src/partialApplication/contramap' 11 | import debug from '../src/partialApplication/debug' 12 | import defaultProps from '../src/partialApplication/defaultProps' 13 | import fork from '../src/partialApplication/fork' 14 | import log from '../src/partialApplication/log' 15 | import map from '../src/partialApplication/map' 16 | import name from '../src/partialApplication/name' 17 | import promap from '../src/partialApplication/promap' 18 | import propTypes from '../src/partialApplication/propTypes' 19 | import removeProps from '../src/partialApplication/removeProps' 20 | import rotate from '../src/partialApplication/rotate' 21 | import scale from '../src/partialApplication/scale' 22 | import style from '../src/partialApplication/style' 23 | import translate from '../src/partialApplication/translate' 24 | 25 | import { example, suite } from './dsl' 26 | 27 | const entrypointSuite = suite( 28 | 'entrypoint', 29 | 30 | example( 31 | 'exposes ReactDream', 32 | () => DirectReactDream, 33 | EntrypointReactDream 34 | ), 35 | 36 | example( 37 | 'exposes addProps', 38 | () => addProps, 39 | entrypoint.addProps 40 | ), 41 | 42 | example( 43 | 'exposes ap', 44 | () => ap, 45 | entrypoint.ap 46 | ), 47 | 48 | example( 49 | 'exposes chain', 50 | () => chain, 51 | entrypoint.chain 52 | ), 53 | 54 | example( 55 | 'exposes concat', 56 | () => concat, 57 | entrypoint.concat 58 | ), 59 | 60 | example( 61 | 'exposes contramap', 62 | () => contramap, 63 | entrypoint.contramap 64 | ), 65 | 66 | example( 67 | 'exposes debug', 68 | () => debug, 69 | entrypoint.debug 70 | ), 71 | 72 | example( 73 | 'exposes defaultProps', 74 | () => defaultProps, 75 | entrypoint.defaultProps 76 | ), 77 | 78 | example( 79 | 'exposes fork', 80 | () => fork, 81 | entrypoint.fork 82 | ), 83 | 84 | example( 85 | 'exposes log', 86 | () => log, 87 | entrypoint.log 88 | ), 89 | 90 | example( 91 | 'exposes map', 92 | () => map, 93 | entrypoint.map 94 | ), 95 | 96 | example( 97 | 'exposes name', 98 | () => name, 99 | entrypoint.name 100 | ), 101 | 102 | example( 103 | 'exposes promap', 104 | () => promap, 105 | entrypoint.promap 106 | ), 107 | 108 | example( 109 | 'exposes propTypes', 110 | () => propTypes, 111 | entrypoint.propTypes 112 | ), 113 | 114 | example( 115 | 'exposes removeProps', 116 | () => removeProps, 117 | entrypoint.removeProps 118 | ), 119 | 120 | example( 121 | 'exposes rotate', 122 | () => rotate, 123 | entrypoint.rotate 124 | ), 125 | 126 | example( 127 | 'exposes scale', 128 | () => scale, 129 | entrypoint.scale 130 | ), 131 | 132 | example( 133 | 'exposes style', 134 | () => style, 135 | entrypoint.style 136 | ), 137 | 138 | example( 139 | 'exposes translate', 140 | () => translate, 141 | entrypoint.translate 142 | ), 143 | 144 | example( 145 | 'exposes of', 146 | () => DirectReactDream, 147 | entrypoint.of 148 | ) 149 | ) 150 | 151 | import createElementWithPropsSuite from './createElementWithProps' 152 | import internalsSuite from './internals' 153 | import partialApplicationSuite from './partialApplication' 154 | import ReactDreamSuite from './ReactDream' 155 | import styleFromPropsSuite from './styleFromProps' 156 | 157 | import jsDomGlobal from 'jsdom-global' 158 | 159 | jsDomGlobal() 160 | 161 | washington([ 162 | ...entrypointSuite, 163 | ...createElementWithPropsSuite, 164 | ...internalsSuite, 165 | ...partialApplicationSuite, 166 | ...ReactDreamSuite, 167 | ...styleFromPropsSuite, 168 | ]) 169 | -------------------------------------------------------------------------------- /test/internals/doAp.js: -------------------------------------------------------------------------------- 1 | import doAp from '../../src/internals/doAp' 2 | import { example, suite } from '../dsl' 3 | 4 | export default suite( 5 | 'doAp', 6 | example( 7 | 'passes the component to fork of the argument', 8 | 9 | () => doAp(false)({ 10 | fork: x => !x, 11 | }), 12 | 13 | true 14 | ) 15 | ) 16 | -------------------------------------------------------------------------------- /test/internals/doConcat.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { create } from 'react-test-renderer' 3 | import doConcat from '../../src/internals/doConcat' 4 | import { example, suite } from '../dsl' 5 | 6 | export default suite( 7 | 'doConcat', 8 | example( 9 | 'forwards all props to both and renders them in a Fragment', 10 | 11 | () => { 12 | const Concatenation = doConcat(({ y }) => y)(({ x }) => x) 13 | 14 | return create(<Concatenation x={1} y={2} />).toJSON() 15 | }, 16 | 17 | [1, 2] 18 | ) 19 | ) 20 | -------------------------------------------------------------------------------- /test/internals/doContramap.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | import { create } from 'react-test-renderer' 3 | import doContramap from '../../src/internals/doContramap' 4 | import { example, suite } from '../dsl' 5 | 6 | export default suite( 7 | 'doContramap', 8 | 9 | ...suite( 10 | 'is a referentially transparent function component', 11 | 12 | example( 13 | 'pre composes the propsPreprocesssor', 14 | 15 | () => { 16 | const ReferentiallyTransparentComponent = x => !x 17 | const propsPreprocessor = () => true 18 | 19 | return doContramap(propsPreprocessor)(ReferentiallyTransparentComponent)() 20 | }, 21 | 22 | false 23 | ), 24 | 25 | example( 26 | 'it has name', 27 | 28 | () => { 29 | function ReferentiallyTransparentComponent(x) { 30 | return x 31 | } 32 | 33 | return doContramap(x => x)(ReferentiallyTransparentComponent).displayName 34 | }, 35 | 36 | 'ReferentiallyTransparentComponent' 37 | ), 38 | 39 | example( 40 | 'it has displayName', 41 | 42 | () => { 43 | const ReferentiallyTransparentComponent = x => x 44 | ReferentiallyTransparentComponent.displayName = 'Casablanca' 45 | 46 | return doContramap(x => x)(ReferentiallyTransparentComponent).displayName 47 | }, 48 | 49 | 'Casablanca' 50 | ), 51 | ), 52 | 53 | ...suite( 54 | 'is not referentially transparent', 55 | 56 | example( 57 | 'returns a new component that wraps building the inner component with the propsPreprocesssor filtering the props', 58 | 59 | () => { 60 | class NotReferentiallyTransparent extends Component { 61 | constructor() { 62 | super() 63 | 64 | this.state = {} 65 | } 66 | 67 | render() { 68 | return ( 69 | <div> 70 | {this.props.name} 71 | </div> 72 | ) 73 | } 74 | } 75 | 76 | const propsPreprocesssor = () => ({ name: 'Regina Spektor' }) 77 | 78 | const Enhanced = doContramap(propsPreprocesssor)(NotReferentiallyTransparent) 79 | 80 | const renderer = create(<Enhanced />) 81 | 82 | return renderer.toJSON().children 83 | }, 84 | 85 | [ 'Regina Spektor' ] 86 | ), 87 | 88 | example( 89 | 'it has name', 90 | 91 | () => { 92 | class NotReferentiallyTransparent extends Component { 93 | constructor() { 94 | super() 95 | 96 | this.state = {} 97 | } 98 | 99 | render() { 100 | return ( 101 | <div> 102 | {this.props.name} 103 | </div> 104 | ) 105 | } 106 | } 107 | 108 | const propsPreprocesssor = () => ({ name: 'Regina Spektor' }) 109 | 110 | const Enhanced = doContramap(propsPreprocesssor)(NotReferentiallyTransparent) 111 | 112 | return Enhanced.displayName 113 | }, 114 | 115 | 'NotReferentiallyTransparent' 116 | ), 117 | 118 | ...suite( 119 | 'it has displayName', 120 | 121 | example( 122 | 'preserves it', 123 | () => { 124 | class NotReferentiallyTransparent extends Component { 125 | constructor() { 126 | super() 127 | 128 | this.state = {} 129 | } 130 | 131 | render() { 132 | return ( 133 | <div> 134 | {this.props.name} 135 | </div> 136 | ) 137 | } 138 | } 139 | 140 | NotReferentiallyTransparent.displayName = 'BeginToHope' 141 | 142 | const propsPreprocesssor = () => ({ name: 'Regina Spektor' }) 143 | 144 | const Enhanced = doContramap(propsPreprocesssor)(NotReferentiallyTransparent) 145 | 146 | return Enhanced.displayName 147 | }, 148 | 149 | 'BeginToHope' 150 | ) 151 | ) 152 | ) 153 | ) 154 | -------------------------------------------------------------------------------- /test/internals/doMap.js: -------------------------------------------------------------------------------- 1 | import doMap from '../../src/internals/doMap' 2 | import { example, suite } from '../dsl' 3 | 4 | export default suite( 5 | 'doMap', 6 | example( 7 | 'run the component through the higher-order component', 8 | 9 | () => { 10 | const Component = 1 11 | const higherOrderComponent = x => x + 1 12 | 13 | return doMap(higherOrderComponent)(Component) 14 | }, 15 | 16 | 2 17 | ) 18 | ) 19 | -------------------------------------------------------------------------------- /test/internals/doPromap.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { create } from 'react-test-renderer' 3 | import doPromap from '../../src/internals/doPromap' 4 | import { example, suite } from '../dsl' 5 | 6 | export default suite( 7 | 'doPromap', 8 | example( 9 | 'run the component through the higher-order component and the pre processor', 10 | 11 | () => { 12 | const propsPreprocessor = () => ({ name: 'Radiohead' }) 13 | const higherOrderComponent = Target => ({ name }) => 14 | <div> 15 | <Target> 16 | {name} 17 | </Target> 18 | </div> 19 | 20 | const Div = props => <h1 {...props} /> 21 | 22 | const Enhanced = doPromap(propsPreprocessor, higherOrderComponent)(Div) 23 | 24 | const renderer = create(<Enhanced />) 25 | 26 | return renderer.toJSON() 27 | }, 28 | 29 | { 30 | type: 'div', 31 | props: {}, 32 | children: [ 33 | { 34 | type: 'h1', 35 | props: { 36 | name: 'Radiohead' 37 | }, 38 | children: null 39 | } 40 | ] 41 | } 42 | ) 43 | ) 44 | -------------------------------------------------------------------------------- /test/internals/index.js: -------------------------------------------------------------------------------- 1 | import { example, suite } from '../dsl' 2 | import doApSuite from './doAp' 3 | import doConcatSuite from './doConcat' 4 | import doContramapSuite from './doContramap' 5 | import doMapSuite from './doMap' 6 | import doPromapSuite from './doPromap' 7 | 8 | export default suite( 9 | 'internals', 10 | ...doApSuite, 11 | ...doConcatSuite, 12 | ...doContramapSuite, 13 | ...doMapSuite, 14 | ...doPromapSuite 15 | ) 16 | -------------------------------------------------------------------------------- /test/partialApplication.js: -------------------------------------------------------------------------------- 1 | import { example, suite } from './dsl' 2 | import addProps from '../src/partialApplication/addProps' 3 | import ap from '../src/partialApplication/ap' 4 | import chain from '../src/partialApplication/chain' 5 | import concat from '../src/partialApplication/concat' 6 | import contramap from '../src/partialApplication/contramap' 7 | import debug from '../src/partialApplication/debug' 8 | import defaultProps from '../src/partialApplication/defaultProps' 9 | import fork from '../src/partialApplication/fork' 10 | import log from '../src/partialApplication/log' 11 | import map from '../src/partialApplication/map' 12 | import name from '../src/partialApplication/name' 13 | import promap from '../src/partialApplication/promap' 14 | import propTypes from '../src/partialApplication/propTypes' 15 | import removeProps from '../src/partialApplication/removeProps' 16 | import rotate from '../src/partialApplication/rotate' 17 | import scale from '../src/partialApplication/scale' 18 | import style from '../src/partialApplication/style' 19 | import translate from '../src/partialApplication/translate' 20 | 21 | export default suite( 22 | 'partialApplication', 23 | 24 | ...[ 25 | ['addProps', addProps], 26 | ['ap', ap], 27 | ['chain', chain], 28 | ['concat', concat], 29 | ['contramap', contramap], 30 | ['debug', debug], 31 | ['defaultProps', defaultProps], 32 | ['fork', fork], 33 | ['log', log], 34 | ['map', map], 35 | ['name', name], 36 | ['promap', promap], 37 | ['propTypes', propTypes], 38 | ['removeProps', removeProps], 39 | ['rotate', rotate], 40 | ['scale', scale], 41 | ['style', style], 42 | ['translate', translate], 43 | ].map(([name, f]) => 44 | suite( 45 | name, 46 | example( 47 | `calls .${name} of the second arg`, 48 | 49 | () => f(arg => arg + ' allright')({ 50 | [name]: g => g('hello,'), 51 | }), 52 | 53 | 'hello, allright' 54 | ) 55 | ) 56 | ) 57 | .reduce((a, b) => a.concat(b), []) 58 | ) 59 | -------------------------------------------------------------------------------- /test/styleFromProps.js: -------------------------------------------------------------------------------- 1 | import { example, suite } from './dsl' 2 | import styleFromProps from '../src/styleFromProps' 3 | 4 | export default suite( 5 | 'styleFromProps', 6 | 7 | example( 8 | 'sets the `style` prop with the return value', 9 | 10 | () => styleFromProps( 11 | ({ hovered }) => ({ 12 | backgroundColor: hovered ? 'blue' : 'black', 13 | }) 14 | )({ hovered: true }), 15 | 16 | { 17 | hovered: true, 18 | style: { 19 | backgroundColor: 'blue' 20 | } 21 | } 22 | ), 23 | 24 | example( 25 | 'merges the `style` prop with existing value', 26 | 27 | () => styleFromProps( 28 | ({ hovered }) => ({ 29 | backgroundColor: hovered ? 'blue' : 'black', 30 | color: 'green', 31 | }) 32 | )({ 33 | hovered: true, 34 | style: { backgroundColor: 'lightblue' } 35 | }), 36 | 37 | { 38 | hovered: true, 39 | style: { 40 | backgroundColor: 'lightblue', 41 | color: 'green', 42 | } 43 | } 44 | ) 45 | ) 46 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@hocs/with-debugger@^0.1.0": 6 | version "0.1.0" 7 | resolved "https://registry.yarnpkg.com/@hocs/with-debugger/-/with-debugger-0.1.0.tgz#2a8c7f3dd9ae953fb3b0a736289a148b72b0b85c" 8 | 9 | "@hocs/with-log@^0.1.0": 10 | version "0.1.0" 11 | resolved "https://registry.yarnpkg.com/@hocs/with-log/-/with-log-0.1.0.tgz#52d171cdcad863462ee6545c84f4fd97741abc50" 12 | 13 | "@klarna/higher-order-components@^3.0.1": 14 | version "3.0.1" 15 | resolved "https://registry.yarnpkg.com/@klarna/higher-order-components/-/higher-order-components-3.0.1.tgz#d1f71733af58587fadbf065ba233237b720baf83" 16 | dependencies: 17 | collect-fps "2.0.0" 18 | deepmerge "^1.4.4" 19 | jwt-decode "^2.2.0" 20 | recompose "^0.23.4" 21 | seed-random "^2.2.0" 22 | 23 | abab@^1.0.4: 24 | version "1.0.4" 25 | resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" 26 | 27 | abab@^2.0.0: 28 | version "2.0.0" 29 | resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" 30 | 31 | abbrev@1: 32 | version "1.1.0" 33 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 34 | 35 | acorn-globals@^4.1.0: 36 | version "4.1.0" 37 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" 38 | dependencies: 39 | acorn "^5.0.0" 40 | 41 | acorn@^5.0.0, acorn@^5.5.3: 42 | version "5.7.1" 43 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" 44 | 45 | ajv@^5.1.0: 46 | version "5.5.2" 47 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 48 | dependencies: 49 | co "^4.6.0" 50 | fast-deep-equal "^1.0.0" 51 | fast-json-stable-stringify "^2.0.0" 52 | json-schema-traverse "^0.3.0" 53 | 54 | ansi-regex@^2.0.0: 55 | version "2.1.1" 56 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 57 | 58 | ansi-styles@^2.2.1: 59 | version "2.2.1" 60 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 61 | 62 | anymatch@^1.3.0: 63 | version "1.3.2" 64 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 65 | dependencies: 66 | micromatch "^2.1.5" 67 | normalize-path "^2.0.0" 68 | 69 | aproba@^1.0.3: 70 | version "1.1.2" 71 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" 72 | 73 | are-we-there-yet@~1.1.2: 74 | version "1.1.4" 75 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 76 | dependencies: 77 | delegates "^1.0.0" 78 | readable-stream "^2.0.6" 79 | 80 | arr-diff@^2.0.0: 81 | version "2.0.0" 82 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 83 | dependencies: 84 | arr-flatten "^1.0.1" 85 | 86 | arr-flatten@^1.0.1: 87 | version "1.1.0" 88 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 89 | 90 | array-equal@^1.0.0: 91 | version "1.0.0" 92 | resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 93 | 94 | array-unique@^0.2.1: 95 | version "0.2.1" 96 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 97 | 98 | asap@~2.0.3: 99 | version "2.0.6" 100 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 101 | 102 | asn1@~0.2.3: 103 | version "0.2.4" 104 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 105 | dependencies: 106 | safer-buffer "~2.1.0" 107 | 108 | assert-plus@1.0.0, assert-plus@^1.0.0: 109 | version "1.0.0" 110 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 111 | 112 | async-each@^1.0.0: 113 | version "1.0.1" 114 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 115 | 116 | async-limiter@~1.0.0: 117 | version "1.0.0" 118 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 119 | 120 | asynckit@^0.4.0: 121 | version "0.4.0" 122 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 123 | 124 | aws-sign2@~0.7.0: 125 | version "0.7.0" 126 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 127 | 128 | aws4@^1.6.0: 129 | version "1.7.0" 130 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" 131 | 132 | babel-cli@^6.24.1: 133 | version "6.26.0" 134 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" 135 | dependencies: 136 | babel-core "^6.26.0" 137 | babel-polyfill "^6.26.0" 138 | babel-register "^6.26.0" 139 | babel-runtime "^6.26.0" 140 | commander "^2.11.0" 141 | convert-source-map "^1.5.0" 142 | fs-readdir-recursive "^1.0.0" 143 | glob "^7.1.2" 144 | lodash "^4.17.4" 145 | output-file-sync "^1.1.2" 146 | path-is-absolute "^1.0.1" 147 | slash "^1.0.0" 148 | source-map "^0.5.6" 149 | v8flags "^2.1.1" 150 | optionalDependencies: 151 | chokidar "^1.6.1" 152 | 153 | babel-code-frame@^6.22.0: 154 | version "6.22.0" 155 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 156 | dependencies: 157 | chalk "^1.1.0" 158 | esutils "^2.0.2" 159 | js-tokens "^3.0.0" 160 | 161 | babel-code-frame@^6.26.0: 162 | version "6.26.0" 163 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 164 | dependencies: 165 | chalk "^1.1.3" 166 | esutils "^2.0.2" 167 | js-tokens "^3.0.2" 168 | 169 | babel-core@^6.26.0: 170 | version "6.26.3" 171 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" 172 | dependencies: 173 | babel-code-frame "^6.26.0" 174 | babel-generator "^6.26.0" 175 | babel-helpers "^6.24.1" 176 | babel-messages "^6.23.0" 177 | babel-register "^6.26.0" 178 | babel-runtime "^6.26.0" 179 | babel-template "^6.26.0" 180 | babel-traverse "^6.26.0" 181 | babel-types "^6.26.0" 182 | babylon "^6.18.0" 183 | convert-source-map "^1.5.1" 184 | debug "^2.6.9" 185 | json5 "^0.5.1" 186 | lodash "^4.17.4" 187 | minimatch "^3.0.4" 188 | path-is-absolute "^1.0.1" 189 | private "^0.1.8" 190 | slash "^1.0.0" 191 | source-map "^0.5.7" 192 | 193 | babel-generator@^6.26.0: 194 | version "6.26.1" 195 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" 196 | dependencies: 197 | babel-messages "^6.23.0" 198 | babel-runtime "^6.26.0" 199 | babel-types "^6.26.0" 200 | detect-indent "^4.0.0" 201 | jsesc "^1.3.0" 202 | lodash "^4.17.4" 203 | source-map "^0.5.7" 204 | trim-right "^1.0.1" 205 | 206 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 207 | version "6.24.1" 208 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 209 | dependencies: 210 | babel-helper-explode-assignable-expression "^6.24.1" 211 | babel-runtime "^6.22.0" 212 | babel-types "^6.24.1" 213 | 214 | babel-helper-builder-react-jsx@^6.24.1: 215 | version "6.26.0" 216 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" 217 | dependencies: 218 | babel-runtime "^6.26.0" 219 | babel-types "^6.26.0" 220 | esutils "^2.0.2" 221 | 222 | babel-helper-call-delegate@^6.24.1: 223 | version "6.24.1" 224 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 225 | dependencies: 226 | babel-helper-hoist-variables "^6.24.1" 227 | babel-runtime "^6.22.0" 228 | babel-traverse "^6.24.1" 229 | babel-types "^6.24.1" 230 | 231 | babel-helper-define-map@^6.24.1: 232 | version "6.26.0" 233 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" 234 | dependencies: 235 | babel-helper-function-name "^6.24.1" 236 | babel-runtime "^6.26.0" 237 | babel-types "^6.26.0" 238 | lodash "^4.17.4" 239 | 240 | babel-helper-explode-assignable-expression@^6.24.1: 241 | version "6.24.1" 242 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 243 | dependencies: 244 | babel-runtime "^6.22.0" 245 | babel-traverse "^6.24.1" 246 | babel-types "^6.24.1" 247 | 248 | babel-helper-function-name@^6.24.1: 249 | version "6.24.1" 250 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 251 | dependencies: 252 | babel-helper-get-function-arity "^6.24.1" 253 | babel-runtime "^6.22.0" 254 | babel-template "^6.24.1" 255 | babel-traverse "^6.24.1" 256 | babel-types "^6.24.1" 257 | 258 | babel-helper-get-function-arity@^6.24.1: 259 | version "6.24.1" 260 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 261 | dependencies: 262 | babel-runtime "^6.22.0" 263 | babel-types "^6.24.1" 264 | 265 | babel-helper-hoist-variables@^6.24.1: 266 | version "6.24.1" 267 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 268 | dependencies: 269 | babel-runtime "^6.22.0" 270 | babel-types "^6.24.1" 271 | 272 | babel-helper-optimise-call-expression@^6.24.1: 273 | version "6.24.1" 274 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 275 | dependencies: 276 | babel-runtime "^6.22.0" 277 | babel-types "^6.24.1" 278 | 279 | babel-helper-regex@^6.24.1: 280 | version "6.26.0" 281 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" 282 | dependencies: 283 | babel-runtime "^6.26.0" 284 | babel-types "^6.26.0" 285 | lodash "^4.17.4" 286 | 287 | babel-helper-remap-async-to-generator@^6.24.1: 288 | version "6.24.1" 289 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 290 | dependencies: 291 | babel-helper-function-name "^6.24.1" 292 | babel-runtime "^6.22.0" 293 | babel-template "^6.24.1" 294 | babel-traverse "^6.24.1" 295 | babel-types "^6.24.1" 296 | 297 | babel-helper-replace-supers@^6.24.1: 298 | version "6.24.1" 299 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 300 | dependencies: 301 | babel-helper-optimise-call-expression "^6.24.1" 302 | babel-messages "^6.23.0" 303 | babel-runtime "^6.22.0" 304 | babel-template "^6.24.1" 305 | babel-traverse "^6.24.1" 306 | babel-types "^6.24.1" 307 | 308 | babel-helpers@^6.24.1: 309 | version "6.24.1" 310 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 311 | dependencies: 312 | babel-runtime "^6.22.0" 313 | babel-template "^6.24.1" 314 | 315 | babel-messages@^6.23.0: 316 | version "6.23.0" 317 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 318 | dependencies: 319 | babel-runtime "^6.22.0" 320 | 321 | babel-plugin-check-es2015-constants@^6.22.0: 322 | version "6.22.0" 323 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 324 | dependencies: 325 | babel-runtime "^6.22.0" 326 | 327 | babel-plugin-syntax-async-functions@^6.8.0: 328 | version "6.13.0" 329 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 330 | 331 | babel-plugin-syntax-async-generators@^6.5.0: 332 | version "6.13.0" 333 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 334 | 335 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 336 | version "6.13.0" 337 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 338 | 339 | babel-plugin-syntax-flow@^6.18.0: 340 | version "6.18.0" 341 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" 342 | 343 | babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: 344 | version "6.18.0" 345 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 346 | 347 | babel-plugin-syntax-object-rest-spread@^6.8.0: 348 | version "6.13.0" 349 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 350 | 351 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 352 | version "6.22.0" 353 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 354 | 355 | babel-plugin-transform-async-generator-functions@^6.24.1: 356 | version "6.24.1" 357 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" 358 | dependencies: 359 | babel-helper-remap-async-to-generator "^6.24.1" 360 | babel-plugin-syntax-async-generators "^6.5.0" 361 | babel-runtime "^6.22.0" 362 | 363 | babel-plugin-transform-async-to-generator@^6.24.1: 364 | version "6.24.1" 365 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 366 | dependencies: 367 | babel-helper-remap-async-to-generator "^6.24.1" 368 | babel-plugin-syntax-async-functions "^6.8.0" 369 | babel-runtime "^6.22.0" 370 | 371 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 372 | version "6.22.0" 373 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 374 | dependencies: 375 | babel-runtime "^6.22.0" 376 | 377 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 378 | version "6.22.0" 379 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 380 | dependencies: 381 | babel-runtime "^6.22.0" 382 | 383 | babel-plugin-transform-es2015-block-scoping@^6.24.1: 384 | version "6.26.0" 385 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" 386 | dependencies: 387 | babel-runtime "^6.26.0" 388 | babel-template "^6.26.0" 389 | babel-traverse "^6.26.0" 390 | babel-types "^6.26.0" 391 | lodash "^4.17.4" 392 | 393 | babel-plugin-transform-es2015-classes@^6.24.1: 394 | version "6.24.1" 395 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 396 | dependencies: 397 | babel-helper-define-map "^6.24.1" 398 | babel-helper-function-name "^6.24.1" 399 | babel-helper-optimise-call-expression "^6.24.1" 400 | babel-helper-replace-supers "^6.24.1" 401 | babel-messages "^6.23.0" 402 | babel-runtime "^6.22.0" 403 | babel-template "^6.24.1" 404 | babel-traverse "^6.24.1" 405 | babel-types "^6.24.1" 406 | 407 | babel-plugin-transform-es2015-computed-properties@^6.24.1: 408 | version "6.24.1" 409 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 410 | dependencies: 411 | babel-runtime "^6.22.0" 412 | babel-template "^6.24.1" 413 | 414 | babel-plugin-transform-es2015-destructuring@^6.22.0: 415 | version "6.23.0" 416 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 417 | dependencies: 418 | babel-runtime "^6.22.0" 419 | 420 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1: 421 | version "6.24.1" 422 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 423 | dependencies: 424 | babel-runtime "^6.22.0" 425 | babel-types "^6.24.1" 426 | 427 | babel-plugin-transform-es2015-for-of@^6.22.0: 428 | version "6.23.0" 429 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 430 | dependencies: 431 | babel-runtime "^6.22.0" 432 | 433 | babel-plugin-transform-es2015-function-name@^6.24.1: 434 | version "6.24.1" 435 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 436 | dependencies: 437 | babel-helper-function-name "^6.24.1" 438 | babel-runtime "^6.22.0" 439 | babel-types "^6.24.1" 440 | 441 | babel-plugin-transform-es2015-literals@^6.22.0: 442 | version "6.22.0" 443 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 444 | dependencies: 445 | babel-runtime "^6.22.0" 446 | 447 | babel-plugin-transform-es2015-modules-amd@^6.24.1: 448 | version "6.24.1" 449 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 450 | dependencies: 451 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 452 | babel-runtime "^6.22.0" 453 | babel-template "^6.24.1" 454 | 455 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 456 | version "6.26.2" 457 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" 458 | dependencies: 459 | babel-plugin-transform-strict-mode "^6.24.1" 460 | babel-runtime "^6.26.0" 461 | babel-template "^6.26.0" 462 | babel-types "^6.26.0" 463 | 464 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1: 465 | version "6.24.1" 466 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 467 | dependencies: 468 | babel-helper-hoist-variables "^6.24.1" 469 | babel-runtime "^6.22.0" 470 | babel-template "^6.24.1" 471 | 472 | babel-plugin-transform-es2015-modules-umd@^6.24.1: 473 | version "6.24.1" 474 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 475 | dependencies: 476 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 477 | babel-runtime "^6.22.0" 478 | babel-template "^6.24.1" 479 | 480 | babel-plugin-transform-es2015-object-super@^6.24.1: 481 | version "6.24.1" 482 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 483 | dependencies: 484 | babel-helper-replace-supers "^6.24.1" 485 | babel-runtime "^6.22.0" 486 | 487 | babel-plugin-transform-es2015-parameters@^6.24.1: 488 | version "6.24.1" 489 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 490 | dependencies: 491 | babel-helper-call-delegate "^6.24.1" 492 | babel-helper-get-function-arity "^6.24.1" 493 | babel-runtime "^6.22.0" 494 | babel-template "^6.24.1" 495 | babel-traverse "^6.24.1" 496 | babel-types "^6.24.1" 497 | 498 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1: 499 | version "6.24.1" 500 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 501 | dependencies: 502 | babel-runtime "^6.22.0" 503 | babel-types "^6.24.1" 504 | 505 | babel-plugin-transform-es2015-spread@^6.22.0: 506 | version "6.22.0" 507 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 508 | dependencies: 509 | babel-runtime "^6.22.0" 510 | 511 | babel-plugin-transform-es2015-sticky-regex@^6.24.1: 512 | version "6.24.1" 513 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 514 | dependencies: 515 | babel-helper-regex "^6.24.1" 516 | babel-runtime "^6.22.0" 517 | babel-types "^6.24.1" 518 | 519 | babel-plugin-transform-es2015-template-literals@^6.22.0: 520 | version "6.22.0" 521 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 522 | dependencies: 523 | babel-runtime "^6.22.0" 524 | 525 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0: 526 | version "6.23.0" 527 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 528 | dependencies: 529 | babel-runtime "^6.22.0" 530 | 531 | babel-plugin-transform-es2015-unicode-regex@^6.24.1: 532 | version "6.24.1" 533 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 534 | dependencies: 535 | babel-helper-regex "^6.24.1" 536 | babel-runtime "^6.22.0" 537 | regexpu-core "^2.0.0" 538 | 539 | babel-plugin-transform-exponentiation-operator@^6.24.1: 540 | version "6.24.1" 541 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 542 | dependencies: 543 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 544 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 545 | babel-runtime "^6.22.0" 546 | 547 | babel-plugin-transform-flow-strip-types@^6.22.0: 548 | version "6.22.0" 549 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" 550 | dependencies: 551 | babel-plugin-syntax-flow "^6.18.0" 552 | babel-runtime "^6.22.0" 553 | 554 | babel-plugin-transform-object-rest-spread@^6.22.0: 555 | version "6.26.0" 556 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" 557 | dependencies: 558 | babel-plugin-syntax-object-rest-spread "^6.8.0" 559 | babel-runtime "^6.26.0" 560 | 561 | babel-plugin-transform-react-display-name@^6.23.0: 562 | version "6.25.0" 563 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" 564 | dependencies: 565 | babel-runtime "^6.22.0" 566 | 567 | babel-plugin-transform-react-jsx-self@^6.22.0: 568 | version "6.22.0" 569 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" 570 | dependencies: 571 | babel-plugin-syntax-jsx "^6.8.0" 572 | babel-runtime "^6.22.0" 573 | 574 | babel-plugin-transform-react-jsx-source@^6.22.0: 575 | version "6.22.0" 576 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" 577 | dependencies: 578 | babel-plugin-syntax-jsx "^6.8.0" 579 | babel-runtime "^6.22.0" 580 | 581 | babel-plugin-transform-react-jsx@^6.24.1: 582 | version "6.24.1" 583 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" 584 | dependencies: 585 | babel-helper-builder-react-jsx "^6.24.1" 586 | babel-plugin-syntax-jsx "^6.8.0" 587 | babel-runtime "^6.22.0" 588 | 589 | babel-plugin-transform-regenerator@^6.24.1: 590 | version "6.26.0" 591 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" 592 | dependencies: 593 | regenerator-transform "^0.10.0" 594 | 595 | babel-plugin-transform-strict-mode@^6.24.1: 596 | version "6.24.1" 597 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 598 | dependencies: 599 | babel-runtime "^6.22.0" 600 | babel-types "^6.24.1" 601 | 602 | babel-polyfill@^6.26.0: 603 | version "6.26.0" 604 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" 605 | dependencies: 606 | babel-runtime "^6.26.0" 607 | core-js "^2.5.0" 608 | regenerator-runtime "^0.10.5" 609 | 610 | babel-preset-es2015@^6.24.1: 611 | version "6.24.1" 612 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" 613 | dependencies: 614 | babel-plugin-check-es2015-constants "^6.22.0" 615 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 616 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 617 | babel-plugin-transform-es2015-block-scoping "^6.24.1" 618 | babel-plugin-transform-es2015-classes "^6.24.1" 619 | babel-plugin-transform-es2015-computed-properties "^6.24.1" 620 | babel-plugin-transform-es2015-destructuring "^6.22.0" 621 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1" 622 | babel-plugin-transform-es2015-for-of "^6.22.0" 623 | babel-plugin-transform-es2015-function-name "^6.24.1" 624 | babel-plugin-transform-es2015-literals "^6.22.0" 625 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 626 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 627 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1" 628 | babel-plugin-transform-es2015-modules-umd "^6.24.1" 629 | babel-plugin-transform-es2015-object-super "^6.24.1" 630 | babel-plugin-transform-es2015-parameters "^6.24.1" 631 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1" 632 | babel-plugin-transform-es2015-spread "^6.22.0" 633 | babel-plugin-transform-es2015-sticky-regex "^6.24.1" 634 | babel-plugin-transform-es2015-template-literals "^6.22.0" 635 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0" 636 | babel-plugin-transform-es2015-unicode-regex "^6.24.1" 637 | babel-plugin-transform-regenerator "^6.24.1" 638 | 639 | babel-preset-flow@^6.23.0: 640 | version "6.23.0" 641 | resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" 642 | dependencies: 643 | babel-plugin-transform-flow-strip-types "^6.22.0" 644 | 645 | babel-preset-react@^6.24.1: 646 | version "6.24.1" 647 | resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" 648 | dependencies: 649 | babel-plugin-syntax-jsx "^6.3.13" 650 | babel-plugin-transform-react-display-name "^6.23.0" 651 | babel-plugin-transform-react-jsx "^6.24.1" 652 | babel-plugin-transform-react-jsx-self "^6.22.0" 653 | babel-plugin-transform-react-jsx-source "^6.22.0" 654 | babel-preset-flow "^6.23.0" 655 | 656 | babel-preset-stage-3@^6.24.1: 657 | version "6.24.1" 658 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" 659 | dependencies: 660 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 661 | babel-plugin-transform-async-generator-functions "^6.24.1" 662 | babel-plugin-transform-async-to-generator "^6.24.1" 663 | babel-plugin-transform-exponentiation-operator "^6.24.1" 664 | babel-plugin-transform-object-rest-spread "^6.22.0" 665 | 666 | babel-register@^6.26.0: 667 | version "6.26.0" 668 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 669 | dependencies: 670 | babel-core "^6.26.0" 671 | babel-runtime "^6.26.0" 672 | core-js "^2.5.0" 673 | home-or-tmp "^2.0.0" 674 | lodash "^4.17.4" 675 | mkdirp "^0.5.1" 676 | source-map-support "^0.4.15" 677 | 678 | babel-runtime@^6.18.0, babel-runtime@^6.26.0: 679 | version "6.26.0" 680 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 681 | dependencies: 682 | core-js "^2.4.0" 683 | regenerator-runtime "^0.11.0" 684 | 685 | babel-runtime@^6.22.0: 686 | version "6.25.0" 687 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.25.0.tgz#33b98eaa5d482bb01a8d1aa6b437ad2b01aec41c" 688 | dependencies: 689 | core-js "^2.4.0" 690 | regenerator-runtime "^0.10.0" 691 | 692 | babel-template@^6.24.1: 693 | version "6.25.0" 694 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" 695 | dependencies: 696 | babel-runtime "^6.22.0" 697 | babel-traverse "^6.25.0" 698 | babel-types "^6.25.0" 699 | babylon "^6.17.2" 700 | lodash "^4.2.0" 701 | 702 | babel-template@^6.26.0: 703 | version "6.26.0" 704 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 705 | dependencies: 706 | babel-runtime "^6.26.0" 707 | babel-traverse "^6.26.0" 708 | babel-types "^6.26.0" 709 | babylon "^6.18.0" 710 | lodash "^4.17.4" 711 | 712 | babel-traverse@^6.24.1, babel-traverse@^6.26.0: 713 | version "6.26.0" 714 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 715 | dependencies: 716 | babel-code-frame "^6.26.0" 717 | babel-messages "^6.23.0" 718 | babel-runtime "^6.26.0" 719 | babel-types "^6.26.0" 720 | babylon "^6.18.0" 721 | debug "^2.6.8" 722 | globals "^9.18.0" 723 | invariant "^2.2.2" 724 | lodash "^4.17.4" 725 | 726 | babel-traverse@^6.25.0: 727 | version "6.25.0" 728 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" 729 | dependencies: 730 | babel-code-frame "^6.22.0" 731 | babel-messages "^6.23.0" 732 | babel-runtime "^6.22.0" 733 | babel-types "^6.25.0" 734 | babylon "^6.17.2" 735 | debug "^2.2.0" 736 | globals "^9.0.0" 737 | invariant "^2.2.0" 738 | lodash "^4.2.0" 739 | 740 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: 741 | version "6.26.0" 742 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 743 | dependencies: 744 | babel-runtime "^6.26.0" 745 | esutils "^2.0.2" 746 | lodash "^4.17.4" 747 | to-fast-properties "^1.0.3" 748 | 749 | babel-types@^6.25.0: 750 | version "6.25.0" 751 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" 752 | dependencies: 753 | babel-runtime "^6.22.0" 754 | esutils "^2.0.2" 755 | lodash "^4.2.0" 756 | to-fast-properties "^1.0.1" 757 | 758 | babylon@^6.17.2: 759 | version "6.17.4" 760 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" 761 | 762 | babylon@^6.18.0: 763 | version "6.18.0" 764 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 765 | 766 | balanced-match@^1.0.0: 767 | version "1.0.0" 768 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 769 | 770 | bcrypt-pbkdf@^1.0.0: 771 | version "1.0.2" 772 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 773 | dependencies: 774 | tweetnacl "^0.14.3" 775 | 776 | binary-extensions@^1.0.0: 777 | version "1.9.0" 778 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.9.0.tgz#66506c16ce6f4d6928a5b3cd6a33ca41e941e37b" 779 | 780 | brace-expansion@^1.1.7: 781 | version "1.1.8" 782 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 783 | dependencies: 784 | balanced-match "^1.0.0" 785 | concat-map "0.0.1" 786 | 787 | braces@^1.8.2: 788 | version "1.8.5" 789 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 790 | dependencies: 791 | expand-range "^1.8.1" 792 | preserve "^0.2.0" 793 | repeat-element "^1.1.2" 794 | 795 | browser-process-hrtime@^0.1.2: 796 | version "0.1.2" 797 | resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" 798 | 799 | caseless@~0.12.0: 800 | version "0.12.0" 801 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 802 | 803 | chalk@^1.1.0, chalk@^1.1.3: 804 | version "1.1.3" 805 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 806 | dependencies: 807 | ansi-styles "^2.2.1" 808 | escape-string-regexp "^1.0.2" 809 | has-ansi "^2.0.0" 810 | strip-ansi "^3.0.0" 811 | supports-color "^2.0.0" 812 | 813 | change-emitter@^0.1.2: 814 | version "0.1.6" 815 | resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" 816 | 817 | chokidar@^1.6.1: 818 | version "1.7.0" 819 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 820 | dependencies: 821 | anymatch "^1.3.0" 822 | async-each "^1.0.0" 823 | glob-parent "^2.0.0" 824 | inherits "^2.0.1" 825 | is-binary-path "^1.0.0" 826 | is-glob "^2.0.0" 827 | path-is-absolute "^1.0.0" 828 | readdirp "^2.0.0" 829 | optionalDependencies: 830 | fsevents "^1.0.0" 831 | 832 | chownr@^1.0.1: 833 | version "1.0.1" 834 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 835 | 836 | co@^4.6.0: 837 | version "4.6.0" 838 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 839 | 840 | code-point-at@^1.0.0: 841 | version "1.1.0" 842 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 843 | 844 | collect-fps@2.0.0: 845 | version "2.0.0" 846 | resolved "https://registry.yarnpkg.com/collect-fps/-/collect-fps-2.0.0.tgz#62adee44763dbebe681c4cba8757265d6f26916e" 847 | 848 | combined-stream@1.0.6: 849 | version "1.0.6" 850 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" 851 | dependencies: 852 | delayed-stream "~1.0.0" 853 | 854 | combined-stream@~1.0.5: 855 | version "1.0.5" 856 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 857 | dependencies: 858 | delayed-stream "~1.0.0" 859 | 860 | commander@^2.11.0: 861 | version "2.15.1" 862 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 863 | 864 | concat-map@0.0.1: 865 | version "0.0.1" 866 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 867 | 868 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 869 | version "1.1.0" 870 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 871 | 872 | convert-source-map@^1.5.0, convert-source-map@^1.5.1: 873 | version "1.5.1" 874 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 875 | 876 | core-js@^1.0.0: 877 | version "1.2.7" 878 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 879 | 880 | core-js@^2.4.0: 881 | version "2.4.1" 882 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 883 | 884 | core-js@^2.5.0: 885 | version "2.5.7" 886 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" 887 | 888 | core-util-is@1.0.2, core-util-is@~1.0.0: 889 | version "1.0.2" 890 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 891 | 892 | cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": 893 | version "0.3.2" 894 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" 895 | 896 | cssstyle@^1.0.0: 897 | version "1.0.0" 898 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" 899 | dependencies: 900 | cssom "0.3.x" 901 | 902 | dashdash@^1.12.0: 903 | version "1.14.1" 904 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 905 | dependencies: 906 | assert-plus "^1.0.0" 907 | 908 | data-urls@^1.0.0: 909 | version "1.0.0" 910 | resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" 911 | dependencies: 912 | abab "^1.0.4" 913 | whatwg-mimetype "^2.0.0" 914 | whatwg-url "^6.4.0" 915 | 916 | debug@^2.1.2, debug@^2.6.8, debug@^2.6.9: 917 | version "2.6.9" 918 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 919 | dependencies: 920 | ms "2.0.0" 921 | 922 | debug@^2.2.0: 923 | version "2.6.8" 924 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 925 | dependencies: 926 | ms "2.0.0" 927 | 928 | deep-extend@~0.4.0: 929 | version "0.4.2" 930 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 931 | 932 | deep-is@~0.1.3: 933 | version "0.1.3" 934 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 935 | 936 | deepmerge@^1.4.4: 937 | version "1.5.0" 938 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.0.tgz#00bc5b88fd23b8130f9f5049071c3420e07a5465" 939 | 940 | delayed-stream@~1.0.0: 941 | version "1.0.0" 942 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 943 | 944 | delegates@^1.0.0: 945 | version "1.0.0" 946 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 947 | 948 | detect-indent@^4.0.0: 949 | version "4.0.0" 950 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 951 | dependencies: 952 | repeating "^2.0.0" 953 | 954 | detect-libc@^1.0.2: 955 | version "1.0.3" 956 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 957 | 958 | domexception@^1.0.1: 959 | version "1.0.1" 960 | resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" 961 | dependencies: 962 | webidl-conversions "^4.0.2" 963 | 964 | ecc-jsbn@~0.1.1: 965 | version "0.1.2" 966 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 967 | dependencies: 968 | jsbn "~0.1.0" 969 | safer-buffer "^2.1.0" 970 | 971 | encoding@^0.1.11: 972 | version "0.1.12" 973 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 974 | dependencies: 975 | iconv-lite "~0.4.13" 976 | 977 | escape-string-regexp@^1.0.2: 978 | version "1.0.5" 979 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 980 | 981 | escodegen@^1.9.1: 982 | version "1.11.0" 983 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" 984 | dependencies: 985 | esprima "^3.1.3" 986 | estraverse "^4.2.0" 987 | esutils "^2.0.2" 988 | optionator "^0.8.1" 989 | optionalDependencies: 990 | source-map "~0.6.1" 991 | 992 | esprima@^3.1.3: 993 | version "3.1.3" 994 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 995 | 996 | estraverse@^4.2.0: 997 | version "4.2.0" 998 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 999 | 1000 | esutils@^2.0.2: 1001 | version "2.0.2" 1002 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1003 | 1004 | expand-brackets@^0.1.4: 1005 | version "0.1.5" 1006 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1007 | dependencies: 1008 | is-posix-bracket "^0.1.0" 1009 | 1010 | expand-range@^1.8.1: 1011 | version "1.8.2" 1012 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1013 | dependencies: 1014 | fill-range "^2.1.0" 1015 | 1016 | extend@~3.0.1: 1017 | version "3.0.2" 1018 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 1019 | 1020 | extglob@^0.3.1: 1021 | version "0.3.2" 1022 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1023 | dependencies: 1024 | is-extglob "^1.0.0" 1025 | 1026 | extsprintf@1.3.0, extsprintf@^1.2.0: 1027 | version "1.3.0" 1028 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 1029 | 1030 | fast-deep-equal@^1.0.0: 1031 | version "1.1.0" 1032 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 1033 | 1034 | fast-json-stable-stringify@^2.0.0: 1035 | version "2.0.0" 1036 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 1037 | 1038 | fast-levenshtein@~2.0.4: 1039 | version "2.0.6" 1040 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1041 | 1042 | fbjs@^0.8.1: 1043 | version "0.8.14" 1044 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.14.tgz#d1dbe2be254c35a91e09f31f9cd50a40b2a0ed1c" 1045 | dependencies: 1046 | core-js "^1.0.0" 1047 | isomorphic-fetch "^2.1.1" 1048 | loose-envify "^1.0.0" 1049 | object-assign "^4.1.0" 1050 | promise "^7.1.1" 1051 | setimmediate "^1.0.5" 1052 | ua-parser-js "^0.7.9" 1053 | 1054 | fbjs@^0.8.16: 1055 | version "0.8.17" 1056 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" 1057 | dependencies: 1058 | core-js "^1.0.0" 1059 | isomorphic-fetch "^2.1.1" 1060 | loose-envify "^1.0.0" 1061 | object-assign "^4.1.0" 1062 | promise "^7.1.1" 1063 | setimmediate "^1.0.5" 1064 | ua-parser-js "^0.7.18" 1065 | 1066 | filename-regex@^2.0.0: 1067 | version "2.0.1" 1068 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 1069 | 1070 | fill-range@^2.1.0: 1071 | version "2.2.3" 1072 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1073 | dependencies: 1074 | is-number "^2.1.0" 1075 | isobject "^2.0.0" 1076 | randomatic "^1.1.3" 1077 | repeat-element "^1.1.2" 1078 | repeat-string "^1.5.2" 1079 | 1080 | folktale@^v2.0.0-rc1: 1081 | version "2.1.0" 1082 | resolved "https://registry.yarnpkg.com/folktale/-/folktale-2.1.0.tgz#3332b9e37b4b92150788b72bd0e2ddd8d70e4096" 1083 | 1084 | for-in@^1.0.1: 1085 | version "1.0.2" 1086 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1087 | 1088 | for-own@^0.1.4: 1089 | version "0.1.5" 1090 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 1091 | dependencies: 1092 | for-in "^1.0.1" 1093 | 1094 | forever-agent@~0.6.1: 1095 | version "0.6.1" 1096 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1097 | 1098 | form-data@~2.3.1: 1099 | version "2.3.2" 1100 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 1101 | dependencies: 1102 | asynckit "^0.4.0" 1103 | combined-stream "1.0.6" 1104 | mime-types "^2.1.12" 1105 | 1106 | fs-minipass@^1.2.5: 1107 | version "1.2.5" 1108 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 1109 | dependencies: 1110 | minipass "^2.2.1" 1111 | 1112 | fs-readdir-recursive@^1.0.0: 1113 | version "1.1.0" 1114 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" 1115 | 1116 | fs.realpath@^1.0.0: 1117 | version "1.0.0" 1118 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1119 | 1120 | fsevents@^1.0.0: 1121 | version "1.2.4" 1122 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 1123 | dependencies: 1124 | nan "^2.9.2" 1125 | node-pre-gyp "^0.10.0" 1126 | 1127 | gauge@~2.7.3: 1128 | version "2.7.4" 1129 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1130 | dependencies: 1131 | aproba "^1.0.3" 1132 | console-control-strings "^1.0.0" 1133 | has-unicode "^2.0.0" 1134 | object-assign "^4.1.0" 1135 | signal-exit "^3.0.0" 1136 | string-width "^1.0.1" 1137 | strip-ansi "^3.0.1" 1138 | wide-align "^1.1.0" 1139 | 1140 | getpass@^0.1.1: 1141 | version "0.1.7" 1142 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1143 | dependencies: 1144 | assert-plus "^1.0.0" 1145 | 1146 | glob-base@^0.3.0: 1147 | version "0.3.0" 1148 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1149 | dependencies: 1150 | glob-parent "^2.0.0" 1151 | is-glob "^2.0.0" 1152 | 1153 | glob-parent@^2.0.0: 1154 | version "2.0.0" 1155 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1156 | dependencies: 1157 | is-glob "^2.0.0" 1158 | 1159 | glob@^7.0.5, glob@^7.1.2: 1160 | version "7.1.2" 1161 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 1162 | dependencies: 1163 | fs.realpath "^1.0.0" 1164 | inflight "^1.0.4" 1165 | inherits "2" 1166 | minimatch "^3.0.4" 1167 | once "^1.3.0" 1168 | path-is-absolute "^1.0.0" 1169 | 1170 | globals@^9.0.0, globals@^9.18.0: 1171 | version "9.18.0" 1172 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1173 | 1174 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 1175 | version "4.1.11" 1176 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1177 | 1178 | har-schema@^2.0.0: 1179 | version "2.0.0" 1180 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 1181 | 1182 | har-validator@~5.0.3: 1183 | version "5.0.3" 1184 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 1185 | dependencies: 1186 | ajv "^5.1.0" 1187 | har-schema "^2.0.0" 1188 | 1189 | has-ansi@^2.0.0: 1190 | version "2.0.0" 1191 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1192 | dependencies: 1193 | ansi-regex "^2.0.0" 1194 | 1195 | has-unicode@^2.0.0: 1196 | version "2.0.1" 1197 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1198 | 1199 | hoist-non-react-statics@^1.0.0: 1200 | version "1.2.0" 1201 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" 1202 | 1203 | home-or-tmp@^2.0.0: 1204 | version "2.0.0" 1205 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1206 | dependencies: 1207 | os-homedir "^1.0.0" 1208 | os-tmpdir "^1.0.1" 1209 | 1210 | html-encoding-sniffer@^1.0.2: 1211 | version "1.0.2" 1212 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" 1213 | dependencies: 1214 | whatwg-encoding "^1.0.1" 1215 | 1216 | http-signature@~1.2.0: 1217 | version "1.2.0" 1218 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1219 | dependencies: 1220 | assert-plus "^1.0.0" 1221 | jsprim "^1.2.2" 1222 | sshpk "^1.7.0" 1223 | 1224 | iconv-lite@0.4.13: 1225 | version "0.4.13" 1226 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" 1227 | 1228 | iconv-lite@0.4.19: 1229 | version "0.4.19" 1230 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1231 | 1232 | iconv-lite@^0.4.4: 1233 | version "0.4.23" 1234 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 1235 | dependencies: 1236 | safer-buffer ">= 2.1.2 < 3" 1237 | 1238 | iconv-lite@~0.4.13: 1239 | version "0.4.18" 1240 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" 1241 | 1242 | ignore-walk@^3.0.1: 1243 | version "3.0.1" 1244 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 1245 | dependencies: 1246 | minimatch "^3.0.4" 1247 | 1248 | immutable-ext@^1.0.8: 1249 | version "1.1.5" 1250 | resolved "https://registry.yarnpkg.com/immutable-ext/-/immutable-ext-1.1.5.tgz#3cdf27a067527c85817bf161a0dad1361ed579cb" 1251 | 1252 | immutable@^3.8.1: 1253 | version "3.8.2" 1254 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 1255 | 1256 | infestines@^0.4.2: 1257 | version "0.4.9" 1258 | resolved "https://registry.yarnpkg.com/infestines/-/infestines-0.4.9.tgz#51480ddce36430b102835153bddac61a15c4bbde" 1259 | 1260 | inflight@^1.0.4: 1261 | version "1.0.6" 1262 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1263 | dependencies: 1264 | once "^1.3.0" 1265 | wrappy "1" 1266 | 1267 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 1268 | version "2.0.3" 1269 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1270 | 1271 | ini@~1.3.0: 1272 | version "1.3.4" 1273 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1274 | 1275 | invariant@^2.2.0: 1276 | version "2.2.2" 1277 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1278 | dependencies: 1279 | loose-envify "^1.0.0" 1280 | 1281 | invariant@^2.2.2: 1282 | version "2.2.4" 1283 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1284 | dependencies: 1285 | loose-envify "^1.0.0" 1286 | 1287 | is-binary-path@^1.0.0: 1288 | version "1.0.1" 1289 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1290 | dependencies: 1291 | binary-extensions "^1.0.0" 1292 | 1293 | is-buffer@^1.1.5: 1294 | version "1.1.5" 1295 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1296 | 1297 | is-dotfile@^1.0.0: 1298 | version "1.0.3" 1299 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1300 | 1301 | is-equal-shallow@^0.1.3: 1302 | version "0.1.3" 1303 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1304 | dependencies: 1305 | is-primitive "^2.0.0" 1306 | 1307 | is-extendable@^0.1.1: 1308 | version "0.1.1" 1309 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1310 | 1311 | is-extglob@^1.0.0: 1312 | version "1.0.0" 1313 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1314 | 1315 | is-finite@^1.0.0: 1316 | version "1.0.2" 1317 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1318 | dependencies: 1319 | number-is-nan "^1.0.0" 1320 | 1321 | is-fullwidth-code-point@^1.0.0: 1322 | version "1.0.0" 1323 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1324 | dependencies: 1325 | number-is-nan "^1.0.0" 1326 | 1327 | is-glob@^2.0.0, is-glob@^2.0.1: 1328 | version "2.0.1" 1329 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1330 | dependencies: 1331 | is-extglob "^1.0.0" 1332 | 1333 | is-number@^2.1.0: 1334 | version "2.1.0" 1335 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1336 | dependencies: 1337 | kind-of "^3.0.2" 1338 | 1339 | is-number@^3.0.0: 1340 | version "3.0.0" 1341 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1342 | dependencies: 1343 | kind-of "^3.0.2" 1344 | 1345 | is-posix-bracket@^0.1.0: 1346 | version "0.1.1" 1347 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1348 | 1349 | is-primitive@^2.0.0: 1350 | version "2.0.0" 1351 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1352 | 1353 | is-stream@^1.0.1: 1354 | version "1.1.0" 1355 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1356 | 1357 | is-typedarray@~1.0.0: 1358 | version "1.0.0" 1359 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1360 | 1361 | isarray@1.0.0, isarray@~1.0.0: 1362 | version "1.0.0" 1363 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1364 | 1365 | isobject@^2.0.0: 1366 | version "2.1.0" 1367 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1368 | dependencies: 1369 | isarray "1.0.0" 1370 | 1371 | isomorphic-fetch@^2.1.1: 1372 | version "2.2.1" 1373 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1374 | dependencies: 1375 | node-fetch "^1.0.1" 1376 | whatwg-fetch ">=0.10.0" 1377 | 1378 | isstream@~0.1.2: 1379 | version "0.1.2" 1380 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1381 | 1382 | js-tokens@^3.0.0, js-tokens@^3.0.2: 1383 | version "3.0.2" 1384 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1385 | 1386 | jsbn@~0.1.0: 1387 | version "0.1.1" 1388 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1389 | 1390 | jsdom-global@^3.0.2: 1391 | version "3.0.2" 1392 | resolved "https://registry.yarnpkg.com/jsdom-global/-/jsdom-global-3.0.2.tgz#6bd299c13b0c4626b2da2c0393cd4385d606acb9" 1393 | 1394 | jsdom@^11.12.0: 1395 | version "11.12.0" 1396 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" 1397 | dependencies: 1398 | abab "^2.0.0" 1399 | acorn "^5.5.3" 1400 | acorn-globals "^4.1.0" 1401 | array-equal "^1.0.0" 1402 | cssom ">= 0.3.2 < 0.4.0" 1403 | cssstyle "^1.0.0" 1404 | data-urls "^1.0.0" 1405 | domexception "^1.0.1" 1406 | escodegen "^1.9.1" 1407 | html-encoding-sniffer "^1.0.2" 1408 | left-pad "^1.3.0" 1409 | nwsapi "^2.0.7" 1410 | parse5 "4.0.0" 1411 | pn "^1.1.0" 1412 | request "^2.87.0" 1413 | request-promise-native "^1.0.5" 1414 | sax "^1.2.4" 1415 | symbol-tree "^3.2.2" 1416 | tough-cookie "^2.3.4" 1417 | w3c-hr-time "^1.0.1" 1418 | webidl-conversions "^4.0.2" 1419 | whatwg-encoding "^1.0.3" 1420 | whatwg-mimetype "^2.1.0" 1421 | whatwg-url "^6.4.1" 1422 | ws "^5.2.0" 1423 | xml-name-validator "^3.0.0" 1424 | 1425 | jsesc@^1.3.0: 1426 | version "1.3.0" 1427 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1428 | 1429 | jsesc@~0.5.0: 1430 | version "0.5.0" 1431 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1432 | 1433 | json-schema-traverse@^0.3.0: 1434 | version "0.3.1" 1435 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1436 | 1437 | json-schema@0.2.3: 1438 | version "0.2.3" 1439 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1440 | 1441 | json-stringify-safe@~5.0.1: 1442 | version "5.0.1" 1443 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1444 | 1445 | json5@^0.5.1: 1446 | version "0.5.1" 1447 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1448 | 1449 | jsprim@^1.2.2: 1450 | version "1.4.1" 1451 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1452 | dependencies: 1453 | assert-plus "1.0.0" 1454 | extsprintf "1.3.0" 1455 | json-schema "0.2.3" 1456 | verror "1.10.0" 1457 | 1458 | jwt-decode@^2.2.0: 1459 | version "2.2.0" 1460 | resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-2.2.0.tgz#7d86bd56679f58ce6a84704a657dd392bba81a79" 1461 | 1462 | kind-of@^3.0.2: 1463 | version "3.2.2" 1464 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1465 | dependencies: 1466 | is-buffer "^1.1.5" 1467 | 1468 | kind-of@^4.0.0: 1469 | version "4.0.0" 1470 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1471 | dependencies: 1472 | is-buffer "^1.1.5" 1473 | 1474 | left-pad@^1.3.0: 1475 | version "1.3.0" 1476 | resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" 1477 | 1478 | levn@~0.3.0: 1479 | version "0.3.0" 1480 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1481 | dependencies: 1482 | prelude-ls "~1.1.2" 1483 | type-check "~0.3.2" 1484 | 1485 | lodash.sortby@^4.7.0: 1486 | version "4.7.0" 1487 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 1488 | 1489 | lodash@^4.13.1, lodash@^4.17.4, lodash@^4.2.0: 1490 | version "4.17.15" 1491 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1492 | 1493 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 1494 | version "1.3.1" 1495 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1496 | dependencies: 1497 | js-tokens "^3.0.0" 1498 | 1499 | micromatch@^2.1.5: 1500 | version "2.3.11" 1501 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1502 | dependencies: 1503 | arr-diff "^2.0.0" 1504 | array-unique "^0.2.1" 1505 | braces "^1.8.2" 1506 | expand-brackets "^0.1.4" 1507 | extglob "^0.3.1" 1508 | filename-regex "^2.0.0" 1509 | is-extglob "^1.0.0" 1510 | is-glob "^2.0.1" 1511 | kind-of "^3.0.2" 1512 | normalize-path "^2.0.1" 1513 | object.omit "^2.0.0" 1514 | parse-glob "^3.0.4" 1515 | regex-cache "^0.4.2" 1516 | 1517 | mime-db@~1.29.0: 1518 | version "1.29.0" 1519 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" 1520 | 1521 | mime-db@~1.35.0: 1522 | version "1.35.0" 1523 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" 1524 | 1525 | mime-types@^2.1.12: 1526 | version "2.1.16" 1527 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" 1528 | dependencies: 1529 | mime-db "~1.29.0" 1530 | 1531 | mime-types@~2.1.17: 1532 | version "2.1.19" 1533 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" 1534 | dependencies: 1535 | mime-db "~1.35.0" 1536 | 1537 | minimatch@^3.0.2, minimatch@^3.0.4: 1538 | version "3.0.4" 1539 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1540 | dependencies: 1541 | brace-expansion "^1.1.7" 1542 | 1543 | minimist@0.0.8: 1544 | version "0.0.8" 1545 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1546 | 1547 | minimist@^1.2.0: 1548 | version "1.2.0" 1549 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1550 | 1551 | minipass@^2.2.1, minipass@^2.3.3: 1552 | version "2.3.3" 1553 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" 1554 | dependencies: 1555 | safe-buffer "^5.1.2" 1556 | yallist "^3.0.0" 1557 | 1558 | minizlib@^1.1.0: 1559 | version "1.1.0" 1560 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" 1561 | dependencies: 1562 | minipass "^2.2.1" 1563 | 1564 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1565 | version "0.5.1" 1566 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1567 | dependencies: 1568 | minimist "0.0.8" 1569 | 1570 | ms@2.0.0: 1571 | version "2.0.0" 1572 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1573 | 1574 | nan@^2.9.2: 1575 | version "2.10.0" 1576 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" 1577 | 1578 | needle@^2.2.0: 1579 | version "2.2.1" 1580 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" 1581 | dependencies: 1582 | debug "^2.1.2" 1583 | iconv-lite "^0.4.4" 1584 | sax "^1.2.4" 1585 | 1586 | node-fetch@^1.0.1: 1587 | version "1.7.1" 1588 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" 1589 | dependencies: 1590 | encoding "^0.1.11" 1591 | is-stream "^1.0.1" 1592 | 1593 | node-pre-gyp@^0.10.0: 1594 | version "0.10.0" 1595 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" 1596 | dependencies: 1597 | detect-libc "^1.0.2" 1598 | mkdirp "^0.5.1" 1599 | needle "^2.2.0" 1600 | nopt "^4.0.1" 1601 | npm-packlist "^1.1.6" 1602 | npmlog "^4.0.2" 1603 | rc "^1.1.7" 1604 | rimraf "^2.6.1" 1605 | semver "^5.3.0" 1606 | tar "^4" 1607 | 1608 | nopt@^4.0.1: 1609 | version "4.0.1" 1610 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1611 | dependencies: 1612 | abbrev "1" 1613 | osenv "^0.1.4" 1614 | 1615 | normalize-path@^2.0.0, normalize-path@^2.0.1: 1616 | version "2.1.1" 1617 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1618 | dependencies: 1619 | remove-trailing-separator "^1.0.1" 1620 | 1621 | npm-bundled@^1.0.1: 1622 | version "1.0.3" 1623 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" 1624 | 1625 | npm-packlist@^1.1.6: 1626 | version "1.1.10" 1627 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" 1628 | dependencies: 1629 | ignore-walk "^3.0.1" 1630 | npm-bundled "^1.0.1" 1631 | 1632 | npmlog@^4.0.2: 1633 | version "4.1.2" 1634 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1635 | dependencies: 1636 | are-we-there-yet "~1.1.2" 1637 | console-control-strings "~1.1.0" 1638 | gauge "~2.7.3" 1639 | set-blocking "~2.0.0" 1640 | 1641 | number-is-nan@^1.0.0: 1642 | version "1.0.1" 1643 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1644 | 1645 | nwsapi@^2.0.7: 1646 | version "2.0.7" 1647 | resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" 1648 | 1649 | oauth-sign@~0.8.2: 1650 | version "0.8.2" 1651 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1652 | 1653 | object-assign@^4.1.0, object-assign@^4.1.1: 1654 | version "4.1.1" 1655 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1656 | 1657 | object.omit@^2.0.0: 1658 | version "2.0.1" 1659 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1660 | dependencies: 1661 | for-own "^0.1.4" 1662 | is-extendable "^0.1.1" 1663 | 1664 | once@^1.3.0: 1665 | version "1.4.0" 1666 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1667 | dependencies: 1668 | wrappy "1" 1669 | 1670 | optionator@^0.8.1: 1671 | version "0.8.2" 1672 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1673 | dependencies: 1674 | deep-is "~0.1.3" 1675 | fast-levenshtein "~2.0.4" 1676 | levn "~0.3.0" 1677 | prelude-ls "~1.1.2" 1678 | type-check "~0.3.2" 1679 | wordwrap "~1.0.0" 1680 | 1681 | os-homedir@^1.0.0: 1682 | version "1.0.2" 1683 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1684 | 1685 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1686 | version "1.0.2" 1687 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1688 | 1689 | osenv@^0.1.4: 1690 | version "0.1.4" 1691 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1692 | dependencies: 1693 | os-homedir "^1.0.0" 1694 | os-tmpdir "^1.0.0" 1695 | 1696 | output-file-sync@^1.1.2: 1697 | version "1.1.2" 1698 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1699 | dependencies: 1700 | graceful-fs "^4.1.4" 1701 | mkdirp "^0.5.1" 1702 | object-assign "^4.1.0" 1703 | 1704 | parse-glob@^3.0.4: 1705 | version "3.0.4" 1706 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1707 | dependencies: 1708 | glob-base "^0.3.0" 1709 | is-dotfile "^1.0.0" 1710 | is-extglob "^1.0.0" 1711 | is-glob "^2.0.0" 1712 | 1713 | parse5@4.0.0: 1714 | version "4.0.0" 1715 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" 1716 | 1717 | partial.lenses@^9.4.1: 1718 | version "9.8.0" 1719 | resolved "https://registry.yarnpkg.com/partial.lenses/-/partial.lenses-9.8.0.tgz#f8514fccc9eeb539b4dfcdb66249ed18d1f84202" 1720 | dependencies: 1721 | infestines "^0.4.2" 1722 | 1723 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 1724 | version "1.0.1" 1725 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1726 | 1727 | performance-now@^2.1.0: 1728 | version "2.1.0" 1729 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1730 | 1731 | pn@^1.1.0: 1732 | version "1.1.0" 1733 | resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" 1734 | 1735 | prelude-ls@~1.1.2: 1736 | version "1.1.2" 1737 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1738 | 1739 | preserve@^0.2.0: 1740 | version "0.2.0" 1741 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1742 | 1743 | prettier@^1.5.3: 1744 | version "1.5.3" 1745 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.5.3.tgz#59dadc683345ec6b88f88b94ed4ae7e1da394bfe" 1746 | 1747 | private@^0.1.6: 1748 | version "0.1.7" 1749 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1750 | 1751 | private@^0.1.8: 1752 | version "0.1.8" 1753 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 1754 | 1755 | process-nextick-args@~1.0.6: 1756 | version "1.0.7" 1757 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1758 | 1759 | promise@^7.1.1: 1760 | version "7.3.1" 1761 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1762 | dependencies: 1763 | asap "~2.0.3" 1764 | 1765 | prop-types@^15.6.0: 1766 | version "15.6.2" 1767 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" 1768 | dependencies: 1769 | loose-envify "^1.3.1" 1770 | object-assign "^4.1.1" 1771 | 1772 | psl@^1.1.24: 1773 | version "1.1.28" 1774 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" 1775 | 1776 | punycode@^1.4.1: 1777 | version "1.4.1" 1778 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1779 | 1780 | punycode@^2.1.0: 1781 | version "2.1.1" 1782 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1783 | 1784 | qs@~6.5.1: 1785 | version "6.5.2" 1786 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1787 | 1788 | ramda@^0.25.0: 1789 | version "0.25.0" 1790 | resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" 1791 | 1792 | randomatic@^1.1.3: 1793 | version "1.1.7" 1794 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 1795 | dependencies: 1796 | is-number "^3.0.0" 1797 | kind-of "^4.0.0" 1798 | 1799 | rc@^1.1.7: 1800 | version "1.2.1" 1801 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1802 | dependencies: 1803 | deep-extend "~0.4.0" 1804 | ini "~1.3.0" 1805 | minimist "^1.2.0" 1806 | strip-json-comments "~2.0.1" 1807 | 1808 | react-is@^16.4.1: 1809 | version "16.4.1" 1810 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" 1811 | 1812 | react-test-renderer@^16.0.0: 1813 | version "16.4.1" 1814 | resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" 1815 | dependencies: 1816 | fbjs "^0.8.16" 1817 | object-assign "^4.1.1" 1818 | prop-types "^15.6.0" 1819 | react-is "^16.4.1" 1820 | 1821 | react@^16.0.0: 1822 | version "16.4.1" 1823 | resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" 1824 | dependencies: 1825 | fbjs "^0.8.16" 1826 | loose-envify "^1.1.0" 1827 | object-assign "^4.1.1" 1828 | prop-types "^15.6.0" 1829 | 1830 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1831 | version "2.3.3" 1832 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1833 | dependencies: 1834 | core-util-is "~1.0.0" 1835 | inherits "~2.0.3" 1836 | isarray "~1.0.0" 1837 | process-nextick-args "~1.0.6" 1838 | safe-buffer "~5.1.1" 1839 | string_decoder "~1.0.3" 1840 | util-deprecate "~1.0.1" 1841 | 1842 | readdirp@^2.0.0: 1843 | version "2.1.0" 1844 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1845 | dependencies: 1846 | graceful-fs "^4.1.2" 1847 | minimatch "^3.0.2" 1848 | readable-stream "^2.0.2" 1849 | set-immediate-shim "^1.0.1" 1850 | 1851 | recompose@^0.23.4: 1852 | version "0.23.5" 1853 | resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.23.5.tgz#72ac8261246bec378235d187467d02a721e8b1de" 1854 | dependencies: 1855 | change-emitter "^0.1.2" 1856 | fbjs "^0.8.1" 1857 | hoist-non-react-statics "^1.0.0" 1858 | symbol-observable "^1.0.4" 1859 | 1860 | recompose@^0.24.0: 1861 | version "0.24.0" 1862 | resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.24.0.tgz#262e93f974439eb17e7779824d88cce90492a5dd" 1863 | dependencies: 1864 | change-emitter "^0.1.2" 1865 | fbjs "^0.8.1" 1866 | hoist-non-react-statics "^1.0.0" 1867 | symbol-observable "^1.0.4" 1868 | 1869 | regenerate@^1.2.1: 1870 | version "1.4.0" 1871 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" 1872 | 1873 | regenerator-runtime@^0.10.0, regenerator-runtime@^0.10.5: 1874 | version "0.10.5" 1875 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 1876 | 1877 | regenerator-runtime@^0.11.0: 1878 | version "0.11.1" 1879 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 1880 | 1881 | regenerator-transform@^0.10.0: 1882 | version "0.10.1" 1883 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" 1884 | dependencies: 1885 | babel-runtime "^6.18.0" 1886 | babel-types "^6.19.0" 1887 | private "^0.1.6" 1888 | 1889 | regex-cache@^0.4.2: 1890 | version "0.4.3" 1891 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1892 | dependencies: 1893 | is-equal-shallow "^0.1.3" 1894 | is-primitive "^2.0.0" 1895 | 1896 | regexpu-core@^2.0.0: 1897 | version "2.0.0" 1898 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1899 | dependencies: 1900 | regenerate "^1.2.1" 1901 | regjsgen "^0.2.0" 1902 | regjsparser "^0.1.4" 1903 | 1904 | regjsgen@^0.2.0: 1905 | version "0.2.0" 1906 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1907 | 1908 | regjsparser@^0.1.4: 1909 | version "0.1.5" 1910 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1911 | dependencies: 1912 | jsesc "~0.5.0" 1913 | 1914 | remove-trailing-separator@^1.0.1: 1915 | version "1.0.2" 1916 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" 1917 | 1918 | repeat-element@^1.1.2: 1919 | version "1.1.2" 1920 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1921 | 1922 | repeat-string@^1.5.2: 1923 | version "1.6.1" 1924 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1925 | 1926 | repeating@^2.0.0: 1927 | version "2.0.1" 1928 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1929 | dependencies: 1930 | is-finite "^1.0.0" 1931 | 1932 | request-promise-core@1.1.1: 1933 | version "1.1.1" 1934 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" 1935 | dependencies: 1936 | lodash "^4.13.1" 1937 | 1938 | request-promise-native@^1.0.5: 1939 | version "1.0.5" 1940 | resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" 1941 | dependencies: 1942 | request-promise-core "1.1.1" 1943 | stealthy-require "^1.1.0" 1944 | tough-cookie ">=2.3.3" 1945 | 1946 | request@^2.87.0: 1947 | version "2.87.0" 1948 | resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" 1949 | dependencies: 1950 | aws-sign2 "~0.7.0" 1951 | aws4 "^1.6.0" 1952 | caseless "~0.12.0" 1953 | combined-stream "~1.0.5" 1954 | extend "~3.0.1" 1955 | forever-agent "~0.6.1" 1956 | form-data "~2.3.1" 1957 | har-validator "~5.0.3" 1958 | http-signature "~1.2.0" 1959 | is-typedarray "~1.0.0" 1960 | isstream "~0.1.2" 1961 | json-stringify-safe "~5.0.1" 1962 | mime-types "~2.1.17" 1963 | oauth-sign "~0.8.2" 1964 | performance-now "^2.1.0" 1965 | qs "~6.5.1" 1966 | safe-buffer "^5.1.1" 1967 | tough-cookie "~2.3.3" 1968 | tunnel-agent "^0.6.0" 1969 | uuid "^3.1.0" 1970 | 1971 | rimraf@^2.6.1: 1972 | version "2.6.1" 1973 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1974 | dependencies: 1975 | glob "^7.0.5" 1976 | 1977 | safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1978 | version "5.1.1" 1979 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1980 | 1981 | safe-buffer@^5.1.1, safe-buffer@^5.1.2: 1982 | version "5.1.2" 1983 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1984 | 1985 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1986 | version "2.1.2" 1987 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1988 | 1989 | sax@^1.2.4: 1990 | version "1.2.4" 1991 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1992 | 1993 | seed-random@^2.2.0: 1994 | version "2.2.0" 1995 | resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" 1996 | 1997 | semver@^5.3.0: 1998 | version "5.4.1" 1999 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 2000 | 2001 | set-blocking@~2.0.0: 2002 | version "2.0.0" 2003 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2004 | 2005 | set-immediate-shim@^1.0.1: 2006 | version "1.0.1" 2007 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2008 | 2009 | setimmediate@^1.0.5: 2010 | version "1.0.5" 2011 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 2012 | 2013 | signal-exit@^3.0.0: 2014 | version "3.0.2" 2015 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2016 | 2017 | slash@^1.0.0: 2018 | version "1.0.0" 2019 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2020 | 2021 | source-map-support@^0.4.15: 2022 | version "0.4.18" 2023 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 2024 | dependencies: 2025 | source-map "^0.5.6" 2026 | 2027 | source-map@^0.5.6: 2028 | version "0.5.6" 2029 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2030 | 2031 | source-map@^0.5.7: 2032 | version "0.5.7" 2033 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2034 | 2035 | source-map@~0.6.1: 2036 | version "0.6.1" 2037 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2038 | 2039 | sshpk@^1.7.0: 2040 | version "1.16.1" 2041 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 2042 | dependencies: 2043 | asn1 "~0.2.3" 2044 | assert-plus "^1.0.0" 2045 | bcrypt-pbkdf "^1.0.0" 2046 | dashdash "^1.12.0" 2047 | ecc-jsbn "~0.1.1" 2048 | getpass "^0.1.1" 2049 | jsbn "~0.1.0" 2050 | safer-buffer "^2.0.2" 2051 | tweetnacl "~0.14.0" 2052 | 2053 | stealthy-require@^1.1.0: 2054 | version "1.1.1" 2055 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 2056 | 2057 | string-width@^1.0.1, string-width@^1.0.2: 2058 | version "1.0.2" 2059 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2060 | dependencies: 2061 | code-point-at "^1.0.0" 2062 | is-fullwidth-code-point "^1.0.0" 2063 | strip-ansi "^3.0.0" 2064 | 2065 | string_decoder@~1.0.3: 2066 | version "1.0.3" 2067 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2068 | dependencies: 2069 | safe-buffer "~5.1.0" 2070 | 2071 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2072 | version "3.0.1" 2073 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2074 | dependencies: 2075 | ansi-regex "^2.0.0" 2076 | 2077 | strip-json-comments@~2.0.1: 2078 | version "2.0.1" 2079 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2080 | 2081 | supports-color@^2.0.0: 2082 | version "2.0.0" 2083 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2084 | 2085 | symbol-observable@^1.0.4: 2086 | version "1.0.4" 2087 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" 2088 | 2089 | symbol-tree@^3.2.2: 2090 | version "3.2.2" 2091 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 2092 | 2093 | tar@^4: 2094 | version "4.4.4" 2095 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" 2096 | dependencies: 2097 | chownr "^1.0.1" 2098 | fs-minipass "^1.2.5" 2099 | minipass "^2.3.3" 2100 | minizlib "^1.1.0" 2101 | mkdirp "^0.5.0" 2102 | safe-buffer "^5.1.2" 2103 | yallist "^3.0.2" 2104 | 2105 | to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: 2106 | version "1.0.3" 2107 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 2108 | 2109 | tough-cookie@>=2.3.3, tough-cookie@^2.3.4: 2110 | version "2.4.3" 2111 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 2112 | dependencies: 2113 | psl "^1.1.24" 2114 | punycode "^1.4.1" 2115 | 2116 | tough-cookie@~2.3.3: 2117 | version "2.3.4" 2118 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" 2119 | dependencies: 2120 | punycode "^1.4.1" 2121 | 2122 | tr46@^1.0.1: 2123 | version "1.0.1" 2124 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" 2125 | dependencies: 2126 | punycode "^2.1.0" 2127 | 2128 | trim-right@^1.0.1: 2129 | version "1.0.1" 2130 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 2131 | 2132 | tunnel-agent@^0.6.0: 2133 | version "0.6.0" 2134 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2135 | dependencies: 2136 | safe-buffer "^5.0.1" 2137 | 2138 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2139 | version "0.14.5" 2140 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2141 | 2142 | type-check@~0.3.2: 2143 | version "0.3.2" 2144 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2145 | dependencies: 2146 | prelude-ls "~1.1.2" 2147 | 2148 | ua-parser-js@^0.7.18: 2149 | version "0.7.18" 2150 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" 2151 | 2152 | ua-parser-js@^0.7.9: 2153 | version "0.7.14" 2154 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.14.tgz#110d53fa4c3f326c121292bbeac904d2e03387ca" 2155 | 2156 | user-home@^1.1.1: 2157 | version "1.1.1" 2158 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2159 | 2160 | util-deprecate@~1.0.1: 2161 | version "1.0.2" 2162 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2163 | 2164 | uuid@^3.1.0: 2165 | version "3.3.2" 2166 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 2167 | 2168 | v8flags@^2.1.1: 2169 | version "2.1.1" 2170 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 2171 | dependencies: 2172 | user-home "^1.1.1" 2173 | 2174 | verror@1.10.0: 2175 | version "1.10.0" 2176 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2177 | dependencies: 2178 | assert-plus "^1.0.0" 2179 | core-util-is "1.0.2" 2180 | extsprintf "^1.2.0" 2181 | 2182 | w3c-hr-time@^1.0.1: 2183 | version "1.0.1" 2184 | resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" 2185 | dependencies: 2186 | browser-process-hrtime "^0.1.2" 2187 | 2188 | washington.core@^2.0.0-rc.3: 2189 | version "2.0.0-rc.3" 2190 | resolved "https://registry.yarnpkg.com/washington.core/-/washington.core-2.0.0-rc.3.tgz#e9b52f736f177961fa962160f9810d4068c2db01" 2191 | dependencies: 2192 | folktale "^v2.0.0-rc1" 2193 | immutable "^3.8.1" 2194 | immutable-ext "^1.0.8" 2195 | partial.lenses "^9.4.1" 2196 | 2197 | washington.formatter.terminal@^2.0.0-rc.3: 2198 | version "2.0.0-rc.3" 2199 | resolved "https://registry.yarnpkg.com/washington.formatter.terminal/-/washington.formatter.terminal-2.0.0-rc.3.tgz#da80f5a8faa4d56a6d7297783e55d657c41e7417" 2200 | dependencies: 2201 | chalk "^1.1.3" 2202 | folktale "^v2.0.0-rc1" 2203 | partial.lenses "^9.4.1" 2204 | 2205 | washington@^2.0.0-rc.3: 2206 | version "2.0.0-rc.3" 2207 | resolved "https://registry.yarnpkg.com/washington/-/washington-2.0.0-rc.3.tgz#40d40ef0dde10563f9f469e8ed38a25feae1baf7" 2208 | dependencies: 2209 | washington.core "^2.0.0-rc.3" 2210 | washington.formatter.terminal "^2.0.0-rc.3" 2211 | 2212 | webidl-conversions@^4.0.2: 2213 | version "4.0.2" 2214 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 2215 | 2216 | whatwg-encoding@^1.0.1: 2217 | version "1.0.1" 2218 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" 2219 | dependencies: 2220 | iconv-lite "0.4.13" 2221 | 2222 | whatwg-encoding@^1.0.3: 2223 | version "1.0.3" 2224 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" 2225 | dependencies: 2226 | iconv-lite "0.4.19" 2227 | 2228 | whatwg-fetch@>=0.10.0: 2229 | version "2.0.3" 2230 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 2231 | 2232 | whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: 2233 | version "2.1.0" 2234 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" 2235 | 2236 | whatwg-url@^6.4.0, whatwg-url@^6.4.1: 2237 | version "6.5.0" 2238 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" 2239 | dependencies: 2240 | lodash.sortby "^4.7.0" 2241 | tr46 "^1.0.1" 2242 | webidl-conversions "^4.0.2" 2243 | 2244 | wide-align@^1.1.0: 2245 | version "1.1.2" 2246 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2247 | dependencies: 2248 | string-width "^1.0.2" 2249 | 2250 | wordwrap@~1.0.0: 2251 | version "1.0.0" 2252 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2253 | 2254 | wrappy@1: 2255 | version "1.0.2" 2256 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2257 | 2258 | ws@^5.2.0: 2259 | version "5.2.2" 2260 | resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" 2261 | dependencies: 2262 | async-limiter "~1.0.0" 2263 | 2264 | xml-name-validator@^3.0.0: 2265 | version "3.0.0" 2266 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" 2267 | 2268 | yallist@^3.0.0, yallist@^3.0.2: 2269 | version "3.0.2" 2270 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" 2271 | --------------------------------------------------------------------------------