├── .babelrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── example ├── .babelrc ├── BasicExample.js ├── CustomBlocksAndStyles.js ├── CustomExample.js ├── DropdownExample.js ├── app.js ├── build │ ├── Draft.css │ ├── app.js │ └── index.html ├── package.json └── yarn.lock ├── package.json └── src ├── BlockButton └── index.js ├── StyleButton └── index.js ├── __test__ └── index.js ├── config └── types.js └── index.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react", "es2015", "stage-0"] 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib/* 2 | node_modules 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Dependency directory 2 | # Commenting this out is preferred by some people, see 3 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 4 | node_modules 5 | example 6 | 7 | # sources 8 | /src/ 9 | .babelrc 10 | .gitignore 11 | README.md 12 | CHANGELOG.md 13 | 14 | # NPM debug 15 | npm-debug.log 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. 4 | This project adheres to [Semantic Versioning](http://semver.org/). 5 | 6 | ## 2.2.0 - 2018-01-26 7 | 8 | Buttons for custom block types or custom inline styles can now easily be generated; see the example at `/example/CustomBlocksAndStyles.js`. 9 | 10 | ## 2.1.0 - 2017-06-22 11 | Updated key handling code to use new signature from recent draft-js changes; move to latest release candidate of draft-js-plugins. 12 | 13 | ## 2.0.0 - 2017-03-03 14 | Compatibility with draft-js-plugins 2.0 beta / release candidates (note: use 1.x.x release of this plugin if sticking with draft-js-plugins v1.x.x) 15 | 16 | ## 1.0.1 - 2016-06-17 17 | Cleand up npm module 18 | 19 | ## 1.0.0 - 2016-06-16 20 | Released the first working version of DraftJS RichButtons Plugin 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DraftJS RichButtons Plugin 2 | 3 | [![npm version](https://badge.fury.io/js/draft-js-richbuttons-plugin.svg)](http://badge.fury.io/js/draft-js-richbuttons-plugin) [![Build Status](https://travis-ci.org/jasonphillips/draft-js-richbuttons-plugin.svg?branch=master)](https://travis-ci.org/jasonphillips/draft-js-richbuttons-plugin) [![npm downloads](https://img.shields.io/npm/dm/draft-js-richbuttons-plugin.svg)](https://www.npmjs.com/package/draft-js-richbuttons-plugin) 4 | 5 | *This is a plugin for the `draft-js-plugins-editor`.* 6 | This plugin allows you to add essential rich formatting buttons (inline and block styles) to your plugins-enabled editor. 7 | 8 | ## Usage 9 | 10 | First instantiate the plugin: 11 | 12 | ```js 13 | import createRichButtonsPlugin from 'draft-js-richbuttons-plugin'; 14 | 15 | const richButtonsPlugin = createRichButtonsPlugin(); 16 | ``` 17 | 18 | Now get any desired components for inline or block formatting buttons from the instance: 19 | 20 | ```js 21 | /* import only the ones you need; all available shown */ 22 | const { 23 | // inline buttons 24 | ItalicButton, BoldButton, MonospaceButton, UnderlineButton, 25 | // block buttons 26 | ParagraphButton, BlockquoteButton, CodeButton, OLButton, ULButton, H1Button, H2Button, H3Button, H4Button, H5Button, H6Button 27 | } = richButtonsPlugin; 28 | ``` 29 | 30 | Render these where desired in your component: 31 | 32 | ```HTML 33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | ``` 42 | 43 | ## Custom Block Types or Inline Styles 44 | 45 | Button components behaving exactly like those above can be obtained for any custom block or inline style types used in your draft instance, by invoking either `createStyleButton` or `createBlockButton`: 46 | 47 | ```js 48 | const { createStyleButton, createBlockButton } = richButtonsPlugin; 49 | 50 | // create a custom inlinestyle button 51 | const RedStyleButton = createStyleButton({style: 'RED', label: 'Red'}); 52 | 53 | // create a custom block-type button 54 | const BorderedBlockButton = createBlockButton({type: 'BorderedBox', label: 'LittleBox'}); 55 | ``` 56 | 57 | See more complete code in the included example. 58 | 59 | ## Rendering Your Own Buttons 60 | 61 | The default buttons are intentionally plain, but will pass the needed props down to their child, allowing you to customize rendering to your needs. 62 | 63 | Props passed to both inline and block buttons: 64 | 65 | - **isActive** (_bool_) - true if style / blocktype active in selection 66 | - **label** (_string_) - default label 67 | 68 | Props unique to inline buttons: 69 | 70 | - **toggleInlineStyle** (_func_) - to be attached to your click event 71 | - **inlineStyle** (_string_) - the draft code for the style 72 | - **onMouseDown** (_func_) - attach this to the onMouseDown event of your custom controls; important for preventing focus from leaving the editor when toggling an inline style with a click 73 | 74 | Props unique to block buttons: 75 | 76 | - **toggleBlockType** (_func_) - to be attached to your click event 77 | - **blockType** (_string_) - the draft code for the block type 78 | 79 | Example: 80 | 81 | ```js 82 | /* 83 | Stateless component for inline style buttons, using the passed props as well as a custom prop "iconName" 84 | */ 85 | const MyIconButton = ({iconName, toggleInlineStyle, isActive, label, inlineStyle, onMouseDown, title}) => 86 | 87 | 92 | ; 93 | ``` 94 | 95 | The above presentational component could then be used this way: 96 | 97 | ```html 98 | 99 | 100 | 101 | 102 | 103 | 104 | ``` 105 | 106 | ## Key Bindings 107 | 108 | The plugin automatically applies default key bindings from draft's `RichUtils`, including Tab / Shift-Tab behavior for nested lists. 109 | 110 | ## License 111 | 112 | MIT 113 | -------------------------------------------------------------------------------- /example/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react", "es2015", "stage-0"] 3 | } 4 | -------------------------------------------------------------------------------- /example/BasicExample.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Well, Panel } from 'react-bootstrap'; 3 | 4 | import Draft from 'draft-js'; 5 | import DraftPasteProcessor from 'draft-js/lib/DraftPasteProcessor'; 6 | const { EditorState, ContentState } = Draft; 7 | import Editor from 'draft-js-plugins-editor'; 8 | 9 | import createBlockBreakoutPlugin from 'draft-js-block-breakout-plugin'; 10 | const blockBreakoutPlugin = createBlockBreakoutPlugin(); 11 | 12 | import createRichButtonsPlugin from 'draft-js-richbuttons-plugin'; 13 | const richButtonsPlugin = createRichButtonsPlugin(); 14 | 15 | const { 16 | // inline buttons 17 | ItalicButton, BoldButton, MonospaceButton, UnderlineButton, 18 | // block buttons 19 | ParagraphButton, H1Button, H2Button, ULButton, OLButton 20 | } = richButtonsPlugin; 21 | 22 | 23 | class BasicExample extends React.Component { 24 | 25 | state = { 26 | editorState: this._getPlaceholder() 27 | } 28 | 29 | _getPlaceholder() { 30 | const placeholder = '

Add rich controls to your editor with minimal hassle.

'; 31 | const contentHTML = DraftPasteProcessor.processHTML(placeholder); 32 | const state = ContentState.createFromBlockArray(contentHTML); 33 | return Draft.EditorState.createWithContent(state); 34 | } 35 | 36 | _onChange(editorState) { 37 | this.setState({editorState}); 38 | } 39 | 40 | render() { 41 | let { editorState } = this.state; 42 | 43 | return ( 44 |
45 | 46 | 47 | 48 | 49 | 50 | |   51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 64 | 65 | 66 |
67 | ); 68 | } 69 | } 70 | 71 | export default BasicExample; 72 | -------------------------------------------------------------------------------- /example/CustomBlocksAndStyles.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Well, Panel } from 'react-bootstrap'; 3 | import Immutable from 'immutable'; 4 | 5 | import Draft from 'draft-js'; 6 | import DraftPasteProcessor from 'draft-js/lib/DraftPasteProcessor'; 7 | const { EditorState, ContentState } = Draft; 8 | import Editor from 'draft-js-plugins-editor'; 9 | 10 | import createBlockBreakoutPlugin from 'draft-js-block-breakout-plugin'; 11 | const blockBreakoutPlugin = createBlockBreakoutPlugin(); 12 | 13 | import createRichButtonsPlugin from '../' // from 'draft-js-richbuttons-plugin'; 14 | const richButtonsPlugin = createRichButtonsPlugin(); 15 | 16 | const { 17 | // inline buttons 18 | ItalicButton, BoldButton, createStyleButton, 19 | // block buttons 20 | ParagraphButton, H2Button, createBlockButton, 21 | } = richButtonsPlugin; 22 | 23 | // create your custom inlinestyle button 24 | const RedStyleButton = createStyleButton({style: 'RED', label: 'Red'}); 25 | 26 | // create your custom block-type button 27 | const BorderedBlockButton = createBlockButton({type: 'BorderedBox', label: 'LittleBox'}); 28 | 29 | // draft style map to apply that custom RED style 30 | const styleMap = { 31 | 'RED': { 32 | color: '#900', 33 | }, 34 | }; 35 | 36 | // all this does is set a css class (.bordered_style) on the custom block 37 | const blockStyleFn = (contentBlock) => { 38 | const type = contentBlock.getType(); 39 | if (type==='BorderedBox') { 40 | return 'bordered_style'; 41 | } 42 | } 43 | 44 | // this maps tags to the custom block type mainly so that I can create them in the placeholder HTML below 45 | const blockRenderMap = Draft.DefaultDraftBlockRenderMap.merge( 46 | Immutable.Map({ 47 | 'BorderedBox': { 48 | element: 'summary', 49 | } 50 | }) 51 | ); 52 | 53 | 54 | class BasicExample extends React.Component { 55 | 56 | state = { 57 | editorState: this._getPlaceholder() 58 | } 59 | 60 | _getPlaceholder() { 61 | const placeholder = ` 62 |

You can also create custom styles or block types.

63 | Press the LittleBox button above to toggle a custom block like this one; and try the Red button to highlight text in red. 64 |

See the example code for usage.

65 | `; 66 | const blocksFromHTML = Draft.convertFromHTML( 67 | placeholder, 68 | Draft.getSafeBodyFromHTML, 69 | blockRenderMap 70 | ); 71 | const state = ContentState.createFromBlockArray( 72 | blocksFromHTML.contentBlocks, 73 | blocksFromHTML.entityMap 74 | ); 75 | return Draft.EditorState.createWithContent(state); 76 | } 77 | 78 | _onChange(editorState) { 79 | this.setState({editorState}); 80 | } 81 | 82 | render() { 83 | let { editorState } = this.state; 84 | 85 | return ( 86 |
87 | 88 | 89 | 90 | 91 | |   92 | 93 | 94 | 95 | 96 | 97 | 98 | 107 | 108 | 109 |
110 | ); 111 | } 112 | } 113 | 114 | export default BasicExample; 115 | -------------------------------------------------------------------------------- /example/CustomExample.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Well, Panel, Button, ButtonToolbar, ButtonGroup, Glyphicon } from 'react-bootstrap'; 3 | 4 | import Draft from 'draft-js'; 5 | import DraftPasteProcessor from 'draft-js/lib/DraftPasteProcessor'; 6 | const { EditorState, ContentState } = Draft; 7 | import Editor from 'draft-js-plugins-editor'; 8 | 9 | import createBlockBreakoutPlugin from 'draft-js-block-breakout-plugin'; 10 | const blockBreakoutPlugin = createBlockBreakoutPlugin(); 11 | 12 | import createRichButtonsPlugin from '../' // from 'draft-js-richbuttons-plugin'; 13 | const richButtonsPlugin = createRichButtonsPlugin(); 14 | 15 | const { 16 | // inline buttons 17 | ItalicButton, BoldButton, 18 | // block buttons 19 | H2Button, H3Button, ULButton, OLButton 20 | } = richButtonsPlugin; 21 | 22 | // custom inline button 23 | const MyIconButton = ({glyph, toggleInlineStyle, isActive, label, inlineStyle, onMouseDown }) => 24 | ; 30 | 31 | // custom block button 32 | const MyBlockButton = ({ toggleBlockType, isActive, label, blockType }) => 33 | ; 38 | 39 | 40 | class CustomExample extends React.Component { 41 | 42 | state = { 43 | editorState: this._getPlaceholder() 44 | } 45 | 46 | _getPlaceholder() { 47 | const placeholder = 48 | '

You can customize your own buttons easily.

' + 49 | '' 50 | ; 51 | const contentHTML = DraftPasteProcessor.processHTML(placeholder); 52 | const state = ContentState.createFromBlockArray(contentHTML); 53 | return Draft.EditorState.createWithContent(state); 54 | } 55 | 56 | _onChange(editorState) { 57 | this.setState({editorState}); 58 | } 59 | 60 | render() { 61 | let { editorState } = this.state; 62 | 63 | return ( 64 |
65 | 66 | 67 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 |
89 | ); 90 | } 91 | } 92 | 93 | export default CustomExample; 94 | -------------------------------------------------------------------------------- /example/DropdownExample.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Well, Panel, Button, ButtonToolbar, ButtonGroup, Glyphicon, DropdownButton, MenuItem } from 'react-bootstrap'; 3 | 4 | import Draft from 'draft-js'; 5 | import DraftPasteProcessor from 'draft-js/lib/DraftPasteProcessor'; 6 | const { EditorState, ContentState } = Draft; 7 | import Editor from 'draft-js-plugins-editor'; 8 | 9 | import createBlockBreakoutPlugin from 'draft-js-block-breakout-plugin'; 10 | const blockBreakoutPlugin = createBlockBreakoutPlugin(); 11 | 12 | import createRichButtonsPlugin from '../'; 13 | const richButtonsPlugin = createRichButtonsPlugin(); 14 | 15 | const { 16 | // inline buttons 17 | ItalicButton, BoldButton, UnderlineButton, 18 | // single component for block controls 19 | BlockControls 20 | } = richButtonsPlugin; 21 | 22 | // custom inline button 23 | const CustomButton = ({children, toggleInlineStyle, isActive, label, inlineStyle, onMouseDown }) => 24 | ; 30 | 31 | // custom dropdown for block types 32 | const MySelect = ({blockTypes, activeType, activeLabel, selectBlockType}) => 33 | 34 | {blockTypes.map(({style, label}) => 35 | { label } 36 | )} 37 | 38 | 39 | 40 | class DropdownExample extends React.Component { 41 | 42 | state = { 43 | editorState: this._getPlaceholder() 44 | } 45 | 46 | _getPlaceholder() { 47 | const placeholder = 48 | '

Another option provided for block controls is a dropdown menu.

' 49 | ; 50 | const contentHTML = DraftPasteProcessor.processHTML(placeholder); 51 | const state = ContentState.createFromBlockArray(contentHTML); 52 | return Draft.EditorState.createWithContent(state); 53 | } 54 | 55 | _onChange(editorState) { 56 | this.setState({editorState}); 57 | } 58 | 59 | render() { 60 | let { editorState } = this.state; 61 | 62 | return ( 63 |
64 | 65 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | Abc 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
93 | ); 94 | } 95 | } 96 | 97 | export default DropdownExample; 98 | -------------------------------------------------------------------------------- /example/app.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import BasicExample from './BasicExample'; 4 | import CustomExample from './CustomExample'; 5 | import CustomTypes from './CustomBlocksAndStyles'; 6 | import { Grid, Alert } from 'react-bootstrap'; 7 | 8 | class App extends React.Component { 9 | render() { 10 | return ( 11 | 12 |

DraftJS RichButtons Plugin

13 | 14 | A plugin for the 15 | DraftJS Plugins Editor 16 | that provides a simple way to add customizable rich-text controls to your draft-js instance. 17 | 18 |

19 |

Basic Example   20 | 21 | {code} 22 | 23 |

24 | 25 |

26 |

Custom Buttons Example   27 | 28 | {code} 29 | 30 |

31 | 32 |

33 |

34 |

Custom Block Types & Styles   35 | 36 | {code} 37 | 38 |

39 | 40 |
41 | ); 42 | } 43 | } 44 | 45 | ReactDOM.render(, document.getElementById( 'app' )); 46 | -------------------------------------------------------------------------------- /example/build/Draft.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Draft v0.7.0 3 | * 4 | * Copyright (c) 2013-present, Facebook, Inc. 5 | * All rights reserved. 6 | * 7 | * This source code is licensed under the BSD-style license found in the 8 | * LICENSE file in the root directory of this source tree. An additional grant 9 | * of patent rights can be found in the PATENTS file in the same directory. 10 | */ 11 | .DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:rgba(255,255,255,0);border-left:.1px solid transparent;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;z-index:0}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.public-DraftStyleDefault-listLTR{direction:ltr}.public-DraftStyleDefault-listRTL{direction:rtl}.public-DraftStyleDefault-ol,.public-DraftStyleDefault-ul{margin:16px 0;padding:0}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listLTR{margin-left:1.5em}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-listRTL{margin-right:1.5em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listLTR{margin-left:3em}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-listRTL{margin-right:3em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listLTR{margin-left:4.5em}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-listRTL{margin-right:4.5em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listLTR{margin-left:6em}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-listRTL{margin-right:6em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listLTR{margin-left:7.5em}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-listRTL{margin-right:7.5em}.public-DraftStyleDefault-unorderedListItem{list-style-type:square;position:relative}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth0{list-style-type:disc}.public-DraftStyleDefault-unorderedListItem.public-DraftStyleDefault-depth1{list-style-type:circle}.public-DraftStyleDefault-orderedListItem{list-style-type:none;position:relative}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listLTR:before{left:-36px;position:absolute;text-align:right;width:30px}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-listRTL:before{position:absolute;right:-36px;text-align:left;width:30px}.public-DraftStyleDefault-orderedListItem:before{content:counter(ol0) ". ";counter-increment:ol0}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth1:before{content:counter(ol1) ". ";counter-increment:ol1}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth2:before{content:counter(ol2) ". ";counter-increment:ol2}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth3:before{content:counter(ol3) ". ";counter-increment:ol3}.public-DraftStyleDefault-orderedListItem.public-DraftStyleDefault-depth4:before{content:counter(ol4) ". ";counter-increment:ol4}.public-DraftStyleDefault-depth0.public-DraftStyleDefault-reset{counter-reset:ol0}.public-DraftStyleDefault-depth1.public-DraftStyleDefault-reset{counter-reset:ol1}.public-DraftStyleDefault-depth2.public-DraftStyleDefault-reset{counter-reset:ol2}.public-DraftStyleDefault-depth3.public-DraftStyleDefault-reset{counter-reset:ol3}.public-DraftStyleDefault-depth4.public-DraftStyleDefault-reset{counter-reset:ol4} -------------------------------------------------------------------------------- /example/build/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | DraftJS RichButtons Plugin 7 | 8 | 9 | 10 | 11 | 26 | 27 | 28 | 29 | Fork me on GitHub 30 | 31 |
32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "draft-js-richbuttons-plugin-example", 3 | "version": "1.0.0", 4 | "description": "Demonstration of the plugin", 5 | "main": "app.js", 6 | "scripts": { 7 | "build": "browserify ./app.js -t babelify --outfile build/app.js" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "babel-preset-es2015": "^6.9.0", 13 | "babel-preset-react": "^6.5.0", 14 | "babel-preset-stage-2": "^6.5.0", 15 | "babelify": "^7.3.0", 16 | "browserify": "^13.0.1" 17 | }, 18 | "dependencies": { 19 | "draft-js-block-breakout-plugin": "2.0.1", 20 | "draft-js-richbuttons-plugin": "^2.1.0", 21 | "draft-js-plugins-editor": "~2.0.4", 22 | "draft-js": "~0.10.5", 23 | "prop-types": "^15.5.10", 24 | "react": "^16.0.0", 25 | "react-bootstrap": "^0.32.1", 26 | "react-dom": "^16.0.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /example/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | JSONStream@^1.0.3: 6 | version "1.3.2" 7 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" 8 | dependencies: 9 | jsonparse "^1.2.0" 10 | through ">=2.2.7 <3" 11 | 12 | acorn@^4.0.3: 13 | version "4.0.13" 14 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" 15 | 16 | acorn@^5.2.1: 17 | version "5.3.0" 18 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" 19 | 20 | ansi-regex@^2.0.0: 21 | version "2.1.1" 22 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 23 | 24 | ansi-styles@^2.2.1: 25 | version "2.2.1" 26 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 27 | 28 | array-filter@~0.0.0: 29 | version "0.0.1" 30 | resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" 31 | 32 | array-map@~0.0.0: 33 | version "0.0.0" 34 | resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" 35 | 36 | array-reduce@~0.0.0: 37 | version "0.0.0" 38 | resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" 39 | 40 | asap@~2.0.3: 41 | version "2.0.6" 42 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 43 | 44 | asn1.js@^4.0.0: 45 | version "4.9.2" 46 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" 47 | dependencies: 48 | bn.js "^4.0.0" 49 | inherits "^2.0.1" 50 | minimalistic-assert "^1.0.0" 51 | 52 | assert@^1.4.0: 53 | version "1.4.1" 54 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" 55 | dependencies: 56 | util "0.10.3" 57 | 58 | astw@^2.0.0: 59 | version "2.2.0" 60 | resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" 61 | dependencies: 62 | acorn "^4.0.3" 63 | 64 | babel-code-frame@^6.26.0: 65 | version "6.26.0" 66 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 67 | dependencies: 68 | chalk "^1.1.3" 69 | esutils "^2.0.2" 70 | js-tokens "^3.0.2" 71 | 72 | babel-core@^6.0.14, babel-core@^6.26.0: 73 | version "6.26.0" 74 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" 75 | dependencies: 76 | babel-code-frame "^6.26.0" 77 | babel-generator "^6.26.0" 78 | babel-helpers "^6.24.1" 79 | babel-messages "^6.23.0" 80 | babel-register "^6.26.0" 81 | babel-runtime "^6.26.0" 82 | babel-template "^6.26.0" 83 | babel-traverse "^6.26.0" 84 | babel-types "^6.26.0" 85 | babylon "^6.18.0" 86 | convert-source-map "^1.5.0" 87 | debug "^2.6.8" 88 | json5 "^0.5.1" 89 | lodash "^4.17.4" 90 | minimatch "^3.0.4" 91 | path-is-absolute "^1.0.1" 92 | private "^0.1.7" 93 | slash "^1.0.0" 94 | source-map "^0.5.6" 95 | 96 | babel-generator@^6.26.0: 97 | version "6.26.0" 98 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" 99 | dependencies: 100 | babel-messages "^6.23.0" 101 | babel-runtime "^6.26.0" 102 | babel-types "^6.26.0" 103 | detect-indent "^4.0.0" 104 | jsesc "^1.3.0" 105 | lodash "^4.17.4" 106 | source-map "^0.5.6" 107 | trim-right "^1.0.1" 108 | 109 | babel-helper-bindify-decorators@^6.24.1: 110 | version "6.24.1" 111 | resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" 112 | dependencies: 113 | babel-runtime "^6.22.0" 114 | babel-traverse "^6.24.1" 115 | babel-types "^6.24.1" 116 | 117 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 118 | version "6.24.1" 119 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 120 | dependencies: 121 | babel-helper-explode-assignable-expression "^6.24.1" 122 | babel-runtime "^6.22.0" 123 | babel-types "^6.24.1" 124 | 125 | babel-helper-builder-react-jsx@^6.24.1: 126 | version "6.26.0" 127 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" 128 | dependencies: 129 | babel-runtime "^6.26.0" 130 | babel-types "^6.26.0" 131 | esutils "^2.0.2" 132 | 133 | babel-helper-call-delegate@^6.24.1: 134 | version "6.24.1" 135 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 136 | dependencies: 137 | babel-helper-hoist-variables "^6.24.1" 138 | babel-runtime "^6.22.0" 139 | babel-traverse "^6.24.1" 140 | babel-types "^6.24.1" 141 | 142 | babel-helper-define-map@^6.24.1: 143 | version "6.26.0" 144 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" 145 | dependencies: 146 | babel-helper-function-name "^6.24.1" 147 | babel-runtime "^6.26.0" 148 | babel-types "^6.26.0" 149 | lodash "^4.17.4" 150 | 151 | babel-helper-explode-assignable-expression@^6.24.1: 152 | version "6.24.1" 153 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 154 | dependencies: 155 | babel-runtime "^6.22.0" 156 | babel-traverse "^6.24.1" 157 | babel-types "^6.24.1" 158 | 159 | babel-helper-explode-class@^6.24.1: 160 | version "6.24.1" 161 | resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" 162 | dependencies: 163 | babel-helper-bindify-decorators "^6.24.1" 164 | babel-runtime "^6.22.0" 165 | babel-traverse "^6.24.1" 166 | babel-types "^6.24.1" 167 | 168 | babel-helper-function-name@^6.24.1: 169 | version "6.24.1" 170 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 171 | dependencies: 172 | babel-helper-get-function-arity "^6.24.1" 173 | babel-runtime "^6.22.0" 174 | babel-template "^6.24.1" 175 | babel-traverse "^6.24.1" 176 | babel-types "^6.24.1" 177 | 178 | babel-helper-get-function-arity@^6.24.1: 179 | version "6.24.1" 180 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 181 | dependencies: 182 | babel-runtime "^6.22.0" 183 | babel-types "^6.24.1" 184 | 185 | babel-helper-hoist-variables@^6.24.1: 186 | version "6.24.1" 187 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 188 | dependencies: 189 | babel-runtime "^6.22.0" 190 | babel-types "^6.24.1" 191 | 192 | babel-helper-optimise-call-expression@^6.24.1: 193 | version "6.24.1" 194 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 195 | dependencies: 196 | babel-runtime "^6.22.0" 197 | babel-types "^6.24.1" 198 | 199 | babel-helper-regex@^6.24.1: 200 | version "6.26.0" 201 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" 202 | dependencies: 203 | babel-runtime "^6.26.0" 204 | babel-types "^6.26.0" 205 | lodash "^4.17.4" 206 | 207 | babel-helper-remap-async-to-generator@^6.24.1: 208 | version "6.24.1" 209 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 210 | dependencies: 211 | babel-helper-function-name "^6.24.1" 212 | babel-runtime "^6.22.0" 213 | babel-template "^6.24.1" 214 | babel-traverse "^6.24.1" 215 | babel-types "^6.24.1" 216 | 217 | babel-helper-replace-supers@^6.24.1: 218 | version "6.24.1" 219 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 220 | dependencies: 221 | babel-helper-optimise-call-expression "^6.24.1" 222 | babel-messages "^6.23.0" 223 | babel-runtime "^6.22.0" 224 | babel-template "^6.24.1" 225 | babel-traverse "^6.24.1" 226 | babel-types "^6.24.1" 227 | 228 | babel-helpers@^6.24.1: 229 | version "6.24.1" 230 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 231 | dependencies: 232 | babel-runtime "^6.22.0" 233 | babel-template "^6.24.1" 234 | 235 | babel-messages@^6.23.0: 236 | version "6.23.0" 237 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 238 | dependencies: 239 | babel-runtime "^6.22.0" 240 | 241 | babel-plugin-check-es2015-constants@^6.22.0: 242 | version "6.22.0" 243 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 244 | dependencies: 245 | babel-runtime "^6.22.0" 246 | 247 | babel-plugin-syntax-async-functions@^6.8.0: 248 | version "6.13.0" 249 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 250 | 251 | babel-plugin-syntax-async-generators@^6.5.0: 252 | version "6.13.0" 253 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 254 | 255 | babel-plugin-syntax-class-properties@^6.8.0: 256 | version "6.13.0" 257 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" 258 | 259 | babel-plugin-syntax-decorators@^6.13.0: 260 | version "6.13.0" 261 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" 262 | 263 | babel-plugin-syntax-dynamic-import@^6.18.0: 264 | version "6.18.0" 265 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" 266 | 267 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 268 | version "6.13.0" 269 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 270 | 271 | babel-plugin-syntax-flow@^6.18.0: 272 | version "6.18.0" 273 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" 274 | 275 | babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: 276 | version "6.18.0" 277 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" 278 | 279 | babel-plugin-syntax-object-rest-spread@^6.8.0: 280 | version "6.13.0" 281 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 282 | 283 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 284 | version "6.22.0" 285 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 286 | 287 | babel-plugin-transform-async-generator-functions@^6.24.1: 288 | version "6.24.1" 289 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" 290 | dependencies: 291 | babel-helper-remap-async-to-generator "^6.24.1" 292 | babel-plugin-syntax-async-generators "^6.5.0" 293 | babel-runtime "^6.22.0" 294 | 295 | babel-plugin-transform-async-to-generator@^6.24.1: 296 | version "6.24.1" 297 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 298 | dependencies: 299 | babel-helper-remap-async-to-generator "^6.24.1" 300 | babel-plugin-syntax-async-functions "^6.8.0" 301 | babel-runtime "^6.22.0" 302 | 303 | babel-plugin-transform-class-properties@^6.24.1: 304 | version "6.24.1" 305 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" 306 | dependencies: 307 | babel-helper-function-name "^6.24.1" 308 | babel-plugin-syntax-class-properties "^6.8.0" 309 | babel-runtime "^6.22.0" 310 | babel-template "^6.24.1" 311 | 312 | babel-plugin-transform-decorators@^6.24.1: 313 | version "6.24.1" 314 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" 315 | dependencies: 316 | babel-helper-explode-class "^6.24.1" 317 | babel-plugin-syntax-decorators "^6.13.0" 318 | babel-runtime "^6.22.0" 319 | babel-template "^6.24.1" 320 | babel-types "^6.24.1" 321 | 322 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 323 | version "6.22.0" 324 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 325 | dependencies: 326 | babel-runtime "^6.22.0" 327 | 328 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 329 | version "6.22.0" 330 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 331 | dependencies: 332 | babel-runtime "^6.22.0" 333 | 334 | babel-plugin-transform-es2015-block-scoping@^6.24.1: 335 | version "6.26.0" 336 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" 337 | dependencies: 338 | babel-runtime "^6.26.0" 339 | babel-template "^6.26.0" 340 | babel-traverse "^6.26.0" 341 | babel-types "^6.26.0" 342 | lodash "^4.17.4" 343 | 344 | babel-plugin-transform-es2015-classes@^6.24.1: 345 | version "6.24.1" 346 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 347 | dependencies: 348 | babel-helper-define-map "^6.24.1" 349 | babel-helper-function-name "^6.24.1" 350 | babel-helper-optimise-call-expression "^6.24.1" 351 | babel-helper-replace-supers "^6.24.1" 352 | babel-messages "^6.23.0" 353 | babel-runtime "^6.22.0" 354 | babel-template "^6.24.1" 355 | babel-traverse "^6.24.1" 356 | babel-types "^6.24.1" 357 | 358 | babel-plugin-transform-es2015-computed-properties@^6.24.1: 359 | version "6.24.1" 360 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 361 | dependencies: 362 | babel-runtime "^6.22.0" 363 | babel-template "^6.24.1" 364 | 365 | babel-plugin-transform-es2015-destructuring@^6.22.0: 366 | version "6.23.0" 367 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 368 | dependencies: 369 | babel-runtime "^6.22.0" 370 | 371 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1: 372 | version "6.24.1" 373 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 374 | dependencies: 375 | babel-runtime "^6.22.0" 376 | babel-types "^6.24.1" 377 | 378 | babel-plugin-transform-es2015-for-of@^6.22.0: 379 | version "6.23.0" 380 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 381 | dependencies: 382 | babel-runtime "^6.22.0" 383 | 384 | babel-plugin-transform-es2015-function-name@^6.24.1: 385 | version "6.24.1" 386 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 387 | dependencies: 388 | babel-helper-function-name "^6.24.1" 389 | babel-runtime "^6.22.0" 390 | babel-types "^6.24.1" 391 | 392 | babel-plugin-transform-es2015-literals@^6.22.0: 393 | version "6.22.0" 394 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 395 | dependencies: 396 | babel-runtime "^6.22.0" 397 | 398 | babel-plugin-transform-es2015-modules-amd@^6.24.1: 399 | version "6.24.1" 400 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 401 | dependencies: 402 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 403 | babel-runtime "^6.22.0" 404 | babel-template "^6.24.1" 405 | 406 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 407 | version "6.26.0" 408 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" 409 | dependencies: 410 | babel-plugin-transform-strict-mode "^6.24.1" 411 | babel-runtime "^6.26.0" 412 | babel-template "^6.26.0" 413 | babel-types "^6.26.0" 414 | 415 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1: 416 | version "6.24.1" 417 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 418 | dependencies: 419 | babel-helper-hoist-variables "^6.24.1" 420 | babel-runtime "^6.22.0" 421 | babel-template "^6.24.1" 422 | 423 | babel-plugin-transform-es2015-modules-umd@^6.24.1: 424 | version "6.24.1" 425 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 426 | dependencies: 427 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 428 | babel-runtime "^6.22.0" 429 | babel-template "^6.24.1" 430 | 431 | babel-plugin-transform-es2015-object-super@^6.24.1: 432 | version "6.24.1" 433 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 434 | dependencies: 435 | babel-helper-replace-supers "^6.24.1" 436 | babel-runtime "^6.22.0" 437 | 438 | babel-plugin-transform-es2015-parameters@^6.24.1: 439 | version "6.24.1" 440 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 441 | dependencies: 442 | babel-helper-call-delegate "^6.24.1" 443 | babel-helper-get-function-arity "^6.24.1" 444 | babel-runtime "^6.22.0" 445 | babel-template "^6.24.1" 446 | babel-traverse "^6.24.1" 447 | babel-types "^6.24.1" 448 | 449 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1: 450 | version "6.24.1" 451 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 452 | dependencies: 453 | babel-runtime "^6.22.0" 454 | babel-types "^6.24.1" 455 | 456 | babel-plugin-transform-es2015-spread@^6.22.0: 457 | version "6.22.0" 458 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 459 | dependencies: 460 | babel-runtime "^6.22.0" 461 | 462 | babel-plugin-transform-es2015-sticky-regex@^6.24.1: 463 | version "6.24.1" 464 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 465 | dependencies: 466 | babel-helper-regex "^6.24.1" 467 | babel-runtime "^6.22.0" 468 | babel-types "^6.24.1" 469 | 470 | babel-plugin-transform-es2015-template-literals@^6.22.0: 471 | version "6.22.0" 472 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 473 | dependencies: 474 | babel-runtime "^6.22.0" 475 | 476 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0: 477 | version "6.23.0" 478 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 479 | dependencies: 480 | babel-runtime "^6.22.0" 481 | 482 | babel-plugin-transform-es2015-unicode-regex@^6.24.1: 483 | version "6.24.1" 484 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 485 | dependencies: 486 | babel-helper-regex "^6.24.1" 487 | babel-runtime "^6.22.0" 488 | regexpu-core "^2.0.0" 489 | 490 | babel-plugin-transform-exponentiation-operator@^6.24.1: 491 | version "6.24.1" 492 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 493 | dependencies: 494 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 495 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 496 | babel-runtime "^6.22.0" 497 | 498 | babel-plugin-transform-flow-strip-types@^6.22.0: 499 | version "6.22.0" 500 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" 501 | dependencies: 502 | babel-plugin-syntax-flow "^6.18.0" 503 | babel-runtime "^6.22.0" 504 | 505 | babel-plugin-transform-object-rest-spread@^6.22.0: 506 | version "6.26.0" 507 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" 508 | dependencies: 509 | babel-plugin-syntax-object-rest-spread "^6.8.0" 510 | babel-runtime "^6.26.0" 511 | 512 | babel-plugin-transform-react-display-name@^6.23.0: 513 | version "6.25.0" 514 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" 515 | dependencies: 516 | babel-runtime "^6.22.0" 517 | 518 | babel-plugin-transform-react-jsx-self@^6.22.0: 519 | version "6.22.0" 520 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" 521 | dependencies: 522 | babel-plugin-syntax-jsx "^6.8.0" 523 | babel-runtime "^6.22.0" 524 | 525 | babel-plugin-transform-react-jsx-source@^6.22.0: 526 | version "6.22.0" 527 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" 528 | dependencies: 529 | babel-plugin-syntax-jsx "^6.8.0" 530 | babel-runtime "^6.22.0" 531 | 532 | babel-plugin-transform-react-jsx@^6.24.1: 533 | version "6.24.1" 534 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" 535 | dependencies: 536 | babel-helper-builder-react-jsx "^6.24.1" 537 | babel-plugin-syntax-jsx "^6.8.0" 538 | babel-runtime "^6.22.0" 539 | 540 | babel-plugin-transform-regenerator@^6.24.1: 541 | version "6.26.0" 542 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" 543 | dependencies: 544 | regenerator-transform "^0.10.0" 545 | 546 | babel-plugin-transform-strict-mode@^6.24.1: 547 | version "6.24.1" 548 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 549 | dependencies: 550 | babel-runtime "^6.22.0" 551 | babel-types "^6.24.1" 552 | 553 | babel-preset-es2015@^6.9.0: 554 | version "6.24.1" 555 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" 556 | dependencies: 557 | babel-plugin-check-es2015-constants "^6.22.0" 558 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 559 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 560 | babel-plugin-transform-es2015-block-scoping "^6.24.1" 561 | babel-plugin-transform-es2015-classes "^6.24.1" 562 | babel-plugin-transform-es2015-computed-properties "^6.24.1" 563 | babel-plugin-transform-es2015-destructuring "^6.22.0" 564 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1" 565 | babel-plugin-transform-es2015-for-of "^6.22.0" 566 | babel-plugin-transform-es2015-function-name "^6.24.1" 567 | babel-plugin-transform-es2015-literals "^6.22.0" 568 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 569 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 570 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1" 571 | babel-plugin-transform-es2015-modules-umd "^6.24.1" 572 | babel-plugin-transform-es2015-object-super "^6.24.1" 573 | babel-plugin-transform-es2015-parameters "^6.24.1" 574 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1" 575 | babel-plugin-transform-es2015-spread "^6.22.0" 576 | babel-plugin-transform-es2015-sticky-regex "^6.24.1" 577 | babel-plugin-transform-es2015-template-literals "^6.22.0" 578 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0" 579 | babel-plugin-transform-es2015-unicode-regex "^6.24.1" 580 | babel-plugin-transform-regenerator "^6.24.1" 581 | 582 | babel-preset-flow@^6.23.0: 583 | version "6.23.0" 584 | resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" 585 | dependencies: 586 | babel-plugin-transform-flow-strip-types "^6.22.0" 587 | 588 | babel-preset-react@^6.5.0: 589 | version "6.24.1" 590 | resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" 591 | dependencies: 592 | babel-plugin-syntax-jsx "^6.3.13" 593 | babel-plugin-transform-react-display-name "^6.23.0" 594 | babel-plugin-transform-react-jsx "^6.24.1" 595 | babel-plugin-transform-react-jsx-self "^6.22.0" 596 | babel-plugin-transform-react-jsx-source "^6.22.0" 597 | babel-preset-flow "^6.23.0" 598 | 599 | babel-preset-stage-2@^6.5.0: 600 | version "6.24.1" 601 | resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" 602 | dependencies: 603 | babel-plugin-syntax-dynamic-import "^6.18.0" 604 | babel-plugin-transform-class-properties "^6.24.1" 605 | babel-plugin-transform-decorators "^6.24.1" 606 | babel-preset-stage-3 "^6.24.1" 607 | 608 | babel-preset-stage-3@^6.24.1: 609 | version "6.24.1" 610 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" 611 | dependencies: 612 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 613 | babel-plugin-transform-async-generator-functions "^6.24.1" 614 | babel-plugin-transform-async-to-generator "^6.24.1" 615 | babel-plugin-transform-exponentiation-operator "^6.24.1" 616 | babel-plugin-transform-object-rest-spread "^6.22.0" 617 | 618 | babel-register@^6.26.0: 619 | version "6.26.0" 620 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 621 | dependencies: 622 | babel-core "^6.26.0" 623 | babel-runtime "^6.26.0" 624 | core-js "^2.5.0" 625 | home-or-tmp "^2.0.0" 626 | lodash "^4.17.4" 627 | mkdirp "^0.5.1" 628 | source-map-support "^0.4.15" 629 | 630 | babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: 631 | version "6.26.0" 632 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 633 | dependencies: 634 | core-js "^2.4.0" 635 | regenerator-runtime "^0.11.0" 636 | 637 | babel-template@^6.24.1, babel-template@^6.26.0: 638 | version "6.26.0" 639 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 640 | dependencies: 641 | babel-runtime "^6.26.0" 642 | babel-traverse "^6.26.0" 643 | babel-types "^6.26.0" 644 | babylon "^6.18.0" 645 | lodash "^4.17.4" 646 | 647 | babel-traverse@^6.24.1, babel-traverse@^6.26.0: 648 | version "6.26.0" 649 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 650 | dependencies: 651 | babel-code-frame "^6.26.0" 652 | babel-messages "^6.23.0" 653 | babel-runtime "^6.26.0" 654 | babel-types "^6.26.0" 655 | babylon "^6.18.0" 656 | debug "^2.6.8" 657 | globals "^9.18.0" 658 | invariant "^2.2.2" 659 | lodash "^4.17.4" 660 | 661 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: 662 | version "6.26.0" 663 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 664 | dependencies: 665 | babel-runtime "^6.26.0" 666 | esutils "^2.0.2" 667 | lodash "^4.17.4" 668 | to-fast-properties "^1.0.3" 669 | 670 | babelify@^7.3.0: 671 | version "7.3.0" 672 | resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" 673 | dependencies: 674 | babel-core "^6.0.14" 675 | object-assign "^4.0.0" 676 | 677 | babylon@^6.18.0: 678 | version "6.18.0" 679 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 680 | 681 | balanced-match@^1.0.0: 682 | version "1.0.0" 683 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 684 | 685 | base64-js@^1.0.2: 686 | version "1.2.1" 687 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" 688 | 689 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: 690 | version "4.11.8" 691 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 692 | 693 | brace-expansion@^1.1.7: 694 | version "1.1.8" 695 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 696 | dependencies: 697 | balanced-match "^1.0.0" 698 | concat-map "0.0.1" 699 | 700 | brorand@^1.0.1: 701 | version "1.1.0" 702 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 703 | 704 | browser-pack@^6.0.1: 705 | version "6.0.3" 706 | resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.3.tgz#91ca96518583ef580ab063a309de62e407767a39" 707 | dependencies: 708 | JSONStream "^1.0.3" 709 | combine-source-map "~0.8.0" 710 | defined "^1.0.0" 711 | safe-buffer "^5.1.1" 712 | through2 "^2.0.0" 713 | umd "^3.0.0" 714 | 715 | browser-resolve@^1.11.0, browser-resolve@^1.7.0: 716 | version "1.11.2" 717 | resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" 718 | dependencies: 719 | resolve "1.1.7" 720 | 721 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 722 | version "1.1.1" 723 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" 724 | dependencies: 725 | buffer-xor "^1.0.3" 726 | cipher-base "^1.0.0" 727 | create-hash "^1.1.0" 728 | evp_bytestokey "^1.0.3" 729 | inherits "^2.0.1" 730 | safe-buffer "^5.0.1" 731 | 732 | browserify-cipher@^1.0.0: 733 | version "1.0.0" 734 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" 735 | dependencies: 736 | browserify-aes "^1.0.4" 737 | browserify-des "^1.0.0" 738 | evp_bytestokey "^1.0.0" 739 | 740 | browserify-des@^1.0.0: 741 | version "1.0.0" 742 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" 743 | dependencies: 744 | cipher-base "^1.0.1" 745 | des.js "^1.0.0" 746 | inherits "^2.0.1" 747 | 748 | browserify-rsa@^4.0.0: 749 | version "4.0.1" 750 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 751 | dependencies: 752 | bn.js "^4.1.0" 753 | randombytes "^2.0.1" 754 | 755 | browserify-sign@^4.0.0: 756 | version "4.0.4" 757 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" 758 | dependencies: 759 | bn.js "^4.1.1" 760 | browserify-rsa "^4.0.0" 761 | create-hash "^1.1.0" 762 | create-hmac "^1.1.2" 763 | elliptic "^6.0.0" 764 | inherits "^2.0.1" 765 | parse-asn1 "^5.0.0" 766 | 767 | browserify-zlib@~0.1.2: 768 | version "0.1.4" 769 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" 770 | dependencies: 771 | pako "~0.2.0" 772 | 773 | browserify@^13.0.1: 774 | version "13.3.0" 775 | resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce" 776 | dependencies: 777 | JSONStream "^1.0.3" 778 | assert "^1.4.0" 779 | browser-pack "^6.0.1" 780 | browser-resolve "^1.11.0" 781 | browserify-zlib "~0.1.2" 782 | buffer "^4.1.0" 783 | cached-path-relative "^1.0.0" 784 | concat-stream "~1.5.1" 785 | console-browserify "^1.1.0" 786 | constants-browserify "~1.0.0" 787 | crypto-browserify "^3.0.0" 788 | defined "^1.0.0" 789 | deps-sort "^2.0.0" 790 | domain-browser "~1.1.0" 791 | duplexer2 "~0.1.2" 792 | events "~1.1.0" 793 | glob "^7.1.0" 794 | has "^1.0.0" 795 | htmlescape "^1.1.0" 796 | https-browserify "~0.0.0" 797 | inherits "~2.0.1" 798 | insert-module-globals "^7.0.0" 799 | labeled-stream-splicer "^2.0.0" 800 | module-deps "^4.0.8" 801 | os-browserify "~0.1.1" 802 | parents "^1.0.1" 803 | path-browserify "~0.0.0" 804 | process "~0.11.0" 805 | punycode "^1.3.2" 806 | querystring-es3 "~0.2.0" 807 | read-only-stream "^2.0.0" 808 | readable-stream "^2.0.2" 809 | resolve "^1.1.4" 810 | shasum "^1.0.0" 811 | shell-quote "^1.6.1" 812 | stream-browserify "^2.0.0" 813 | stream-http "^2.0.0" 814 | string_decoder "~0.10.0" 815 | subarg "^1.0.0" 816 | syntax-error "^1.1.1" 817 | through2 "^2.0.0" 818 | timers-browserify "^1.0.1" 819 | tty-browserify "~0.0.0" 820 | url "~0.11.0" 821 | util "~0.10.1" 822 | vm-browserify "~0.0.1" 823 | xtend "^4.0.0" 824 | 825 | buffer-xor@^1.0.3: 826 | version "1.0.3" 827 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 828 | 829 | buffer@^4.1.0: 830 | version "4.9.1" 831 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 832 | dependencies: 833 | base64-js "^1.0.2" 834 | ieee754 "^1.1.4" 835 | isarray "^1.0.0" 836 | 837 | builtin-status-codes@^3.0.0: 838 | version "3.0.0" 839 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 840 | 841 | cached-path-relative@^1.0.0: 842 | version "1.0.1" 843 | resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7" 844 | 845 | chain-function@^1.0.0: 846 | version "1.0.0" 847 | resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" 848 | 849 | chalk@^1.1.3: 850 | version "1.1.3" 851 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 852 | dependencies: 853 | ansi-styles "^2.2.1" 854 | escape-string-regexp "^1.0.2" 855 | has-ansi "^2.0.0" 856 | strip-ansi "^3.0.0" 857 | supports-color "^2.0.0" 858 | 859 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 860 | version "1.0.4" 861 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 862 | dependencies: 863 | inherits "^2.0.1" 864 | safe-buffer "^5.0.1" 865 | 866 | classnames@^2.2.5: 867 | version "2.2.5" 868 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" 869 | 870 | combine-source-map@~0.7.1: 871 | version "0.7.2" 872 | resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e" 873 | dependencies: 874 | convert-source-map "~1.1.0" 875 | inline-source-map "~0.6.0" 876 | lodash.memoize "~3.0.3" 877 | source-map "~0.5.3" 878 | 879 | combine-source-map@~0.8.0: 880 | version "0.8.0" 881 | resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" 882 | dependencies: 883 | convert-source-map "~1.1.0" 884 | inline-source-map "~0.6.0" 885 | lodash.memoize "~3.0.3" 886 | source-map "~0.5.3" 887 | 888 | concat-map@0.0.1: 889 | version "0.0.1" 890 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 891 | 892 | concat-stream@~1.5.0, concat-stream@~1.5.1: 893 | version "1.5.2" 894 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" 895 | dependencies: 896 | inherits "~2.0.1" 897 | readable-stream "~2.0.0" 898 | typedarray "~0.0.5" 899 | 900 | console-browserify@^1.1.0: 901 | version "1.1.0" 902 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 903 | dependencies: 904 | date-now "^0.1.4" 905 | 906 | constants-browserify@~1.0.0: 907 | version "1.0.0" 908 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 909 | 910 | convert-source-map@^1.5.0: 911 | version "1.5.1" 912 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 913 | 914 | convert-source-map@~1.1.0: 915 | version "1.1.3" 916 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" 917 | 918 | core-js@^1.0.0: 919 | version "1.2.7" 920 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 921 | 922 | core-js@^2.4.0, core-js@^2.5.0: 923 | version "2.5.3" 924 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" 925 | 926 | core-util-is@~1.0.0: 927 | version "1.0.2" 928 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 929 | 930 | create-ecdh@^4.0.0: 931 | version "4.0.0" 932 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" 933 | dependencies: 934 | bn.js "^4.1.0" 935 | elliptic "^6.0.0" 936 | 937 | create-hash@^1.1.0, create-hash@^1.1.2: 938 | version "1.1.3" 939 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" 940 | dependencies: 941 | cipher-base "^1.0.1" 942 | inherits "^2.0.1" 943 | ripemd160 "^2.0.0" 944 | sha.js "^2.4.0" 945 | 946 | create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: 947 | version "1.1.6" 948 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" 949 | dependencies: 950 | cipher-base "^1.0.3" 951 | create-hash "^1.1.0" 952 | inherits "^2.0.1" 953 | ripemd160 "^2.0.0" 954 | safe-buffer "^5.0.1" 955 | sha.js "^2.4.8" 956 | 957 | crypto-browserify@^3.0.0: 958 | version "3.12.0" 959 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 960 | dependencies: 961 | browserify-cipher "^1.0.0" 962 | browserify-sign "^4.0.0" 963 | create-ecdh "^4.0.0" 964 | create-hash "^1.1.0" 965 | create-hmac "^1.1.0" 966 | diffie-hellman "^5.0.0" 967 | inherits "^2.0.1" 968 | pbkdf2 "^3.0.3" 969 | public-encrypt "^4.0.0" 970 | randombytes "^2.0.0" 971 | randomfill "^1.0.3" 972 | 973 | date-now@^0.1.4: 974 | version "0.1.4" 975 | resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 976 | 977 | debug@^2.6.8: 978 | version "2.6.9" 979 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 980 | dependencies: 981 | ms "2.0.0" 982 | 983 | decorate-component-with-props@^1.0.2: 984 | version "1.1.0" 985 | resolved "https://registry.yarnpkg.com/decorate-component-with-props/-/decorate-component-with-props-1.1.0.tgz#b496c814c6a2aba0cf2ad26e44cbedb8ead42f15" 986 | 987 | defined@^1.0.0: 988 | version "1.0.0" 989 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 990 | 991 | deps-sort@^2.0.0: 992 | version "2.0.0" 993 | resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" 994 | dependencies: 995 | JSONStream "^1.0.3" 996 | shasum "^1.0.0" 997 | subarg "^1.0.0" 998 | through2 "^2.0.0" 999 | 1000 | des.js@^1.0.0: 1001 | version "1.0.0" 1002 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" 1003 | dependencies: 1004 | inherits "^2.0.1" 1005 | minimalistic-assert "^1.0.0" 1006 | 1007 | detect-indent@^4.0.0: 1008 | version "4.0.0" 1009 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 1010 | dependencies: 1011 | repeating "^2.0.0" 1012 | 1013 | detective@^4.0.0: 1014 | version "4.7.1" 1015 | resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" 1016 | dependencies: 1017 | acorn "^5.2.1" 1018 | defined "^1.0.0" 1019 | 1020 | diffie-hellman@^5.0.0: 1021 | version "5.0.2" 1022 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" 1023 | dependencies: 1024 | bn.js "^4.1.0" 1025 | miller-rabin "^4.0.0" 1026 | randombytes "^2.0.0" 1027 | 1028 | dom-helpers@^3.2.0, dom-helpers@^3.2.1: 1029 | version "3.3.1" 1030 | resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" 1031 | 1032 | domain-browser@~1.1.0: 1033 | version "1.1.7" 1034 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" 1035 | 1036 | draft-js-block-breakout-plugin@2.0.1: 1037 | version "2.0.1" 1038 | resolved "https://registry.yarnpkg.com/draft-js-block-breakout-plugin/-/draft-js-block-breakout-plugin-2.0.1.tgz#a38e3bd68d9538d7af15d4d966844d6e6d2ad850" 1039 | dependencies: 1040 | immutable "~3.7.4" 1041 | 1042 | draft-js-plugins-editor@~2.0.4: 1043 | version "2.0.4" 1044 | resolved "https://registry.yarnpkg.com/draft-js-plugins-editor/-/draft-js-plugins-editor-2.0.4.tgz#ab7178de886d6d11f9f43a448c844da6266053e0" 1045 | dependencies: 1046 | decorate-component-with-props "^1.0.2" 1047 | find-with-regex "^1.0.2" 1048 | immutable "~3.7.4" 1049 | prop-types "^15.5.8" 1050 | union-class-names "^1.0.0" 1051 | 1052 | draft-js-richbuttons-plugin@^2.1.0: 1053 | version "2.1.0" 1054 | resolved "https://registry.yarnpkg.com/draft-js-richbuttons-plugin/-/draft-js-richbuttons-plugin-2.1.0.tgz#a78500fac3575b0e8bd5eaf143ed51a1ead37451" 1055 | dependencies: 1056 | decorate-component-with-props "^1.0.2" 1057 | prop-types "^15.5.10" 1058 | 1059 | draft-js@~0.10.5: 1060 | version "0.10.5" 1061 | resolved "https://registry.yarnpkg.com/draft-js/-/draft-js-0.10.5.tgz#bfa9beb018fe0533dbb08d6675c371a6b08fa742" 1062 | dependencies: 1063 | fbjs "^0.8.15" 1064 | immutable "~3.7.4" 1065 | object-assign "^4.1.0" 1066 | 1067 | duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: 1068 | version "0.1.4" 1069 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 1070 | dependencies: 1071 | readable-stream "^2.0.2" 1072 | 1073 | elliptic@^6.0.0: 1074 | version "6.4.0" 1075 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" 1076 | dependencies: 1077 | bn.js "^4.4.0" 1078 | brorand "^1.0.1" 1079 | hash.js "^1.0.0" 1080 | hmac-drbg "^1.0.0" 1081 | inherits "^2.0.1" 1082 | minimalistic-assert "^1.0.0" 1083 | minimalistic-crypto-utils "^1.0.0" 1084 | 1085 | encoding@^0.1.11: 1086 | version "0.1.12" 1087 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 1088 | dependencies: 1089 | iconv-lite "~0.4.13" 1090 | 1091 | escape-string-regexp@^1.0.2: 1092 | version "1.0.5" 1093 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1094 | 1095 | esutils@^2.0.2: 1096 | version "2.0.2" 1097 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1098 | 1099 | events@~1.1.0: 1100 | version "1.1.1" 1101 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 1102 | 1103 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 1104 | version "1.0.3" 1105 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 1106 | dependencies: 1107 | md5.js "^1.3.4" 1108 | safe-buffer "^5.1.1" 1109 | 1110 | fbjs@^0.8.15, fbjs@^0.8.16: 1111 | version "0.8.16" 1112 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" 1113 | dependencies: 1114 | core-js "^1.0.0" 1115 | isomorphic-fetch "^2.1.1" 1116 | loose-envify "^1.0.0" 1117 | object-assign "^4.1.0" 1118 | promise "^7.1.1" 1119 | setimmediate "^1.0.5" 1120 | ua-parser-js "^0.7.9" 1121 | 1122 | find-with-regex@^1.0.2: 1123 | version "1.0.2" 1124 | resolved "https://registry.yarnpkg.com/find-with-regex/-/find-with-regex-1.0.2.tgz#d3b36286539f14c527e31f194159c6d251651a45" 1125 | 1126 | fs.realpath@^1.0.0: 1127 | version "1.0.0" 1128 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1129 | 1130 | function-bind@^1.0.2: 1131 | version "1.1.1" 1132 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1133 | 1134 | glob@^7.1.0: 1135 | version "7.1.2" 1136 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 1137 | dependencies: 1138 | fs.realpath "^1.0.0" 1139 | inflight "^1.0.4" 1140 | inherits "2" 1141 | minimatch "^3.0.4" 1142 | once "^1.3.0" 1143 | path-is-absolute "^1.0.0" 1144 | 1145 | globals@^9.18.0: 1146 | version "9.18.0" 1147 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1148 | 1149 | has-ansi@^2.0.0: 1150 | version "2.0.0" 1151 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1152 | dependencies: 1153 | ansi-regex "^2.0.0" 1154 | 1155 | has@^1.0.0: 1156 | version "1.0.1" 1157 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1158 | dependencies: 1159 | function-bind "^1.0.2" 1160 | 1161 | hash-base@^2.0.0: 1162 | version "2.0.2" 1163 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" 1164 | dependencies: 1165 | inherits "^2.0.1" 1166 | 1167 | hash-base@^3.0.0: 1168 | version "3.0.4" 1169 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 1170 | dependencies: 1171 | inherits "^2.0.1" 1172 | safe-buffer "^5.0.1" 1173 | 1174 | hash.js@^1.0.0, hash.js@^1.0.3: 1175 | version "1.1.3" 1176 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" 1177 | dependencies: 1178 | inherits "^2.0.3" 1179 | minimalistic-assert "^1.0.0" 1180 | 1181 | hmac-drbg@^1.0.0: 1182 | version "1.0.1" 1183 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1184 | dependencies: 1185 | hash.js "^1.0.3" 1186 | minimalistic-assert "^1.0.0" 1187 | minimalistic-crypto-utils "^1.0.1" 1188 | 1189 | home-or-tmp@^2.0.0: 1190 | version "2.0.0" 1191 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1192 | dependencies: 1193 | os-homedir "^1.0.0" 1194 | os-tmpdir "^1.0.1" 1195 | 1196 | htmlescape@^1.1.0: 1197 | version "1.1.1" 1198 | resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" 1199 | 1200 | https-browserify@~0.0.0: 1201 | version "0.0.1" 1202 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" 1203 | 1204 | iconv-lite@~0.4.13: 1205 | version "0.4.19" 1206 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1207 | 1208 | ieee754@^1.1.4: 1209 | version "1.1.8" 1210 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 1211 | 1212 | immutable@~3.7.4: 1213 | version "3.7.6" 1214 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" 1215 | 1216 | indexof@0.0.1: 1217 | version "0.0.1" 1218 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 1219 | 1220 | inflight@^1.0.4: 1221 | version "1.0.6" 1222 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1223 | dependencies: 1224 | once "^1.3.0" 1225 | wrappy "1" 1226 | 1227 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 1228 | version "2.0.3" 1229 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1230 | 1231 | inherits@2.0.1: 1232 | version "2.0.1" 1233 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1234 | 1235 | inline-source-map@~0.6.0: 1236 | version "0.6.2" 1237 | resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" 1238 | dependencies: 1239 | source-map "~0.5.3" 1240 | 1241 | insert-module-globals@^7.0.0: 1242 | version "7.0.1" 1243 | resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" 1244 | dependencies: 1245 | JSONStream "^1.0.3" 1246 | combine-source-map "~0.7.1" 1247 | concat-stream "~1.5.1" 1248 | is-buffer "^1.1.0" 1249 | lexical-scope "^1.2.0" 1250 | process "~0.11.0" 1251 | through2 "^2.0.0" 1252 | xtend "^4.0.0" 1253 | 1254 | invariant@^2.1.0, invariant@^2.2.1, invariant@^2.2.2: 1255 | version "2.2.2" 1256 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1257 | dependencies: 1258 | loose-envify "^1.0.0" 1259 | 1260 | is-buffer@^1.1.0: 1261 | version "1.1.6" 1262 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1263 | 1264 | is-finite@^1.0.0: 1265 | version "1.0.2" 1266 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1267 | dependencies: 1268 | number-is-nan "^1.0.0" 1269 | 1270 | is-stream@^1.0.1: 1271 | version "1.1.0" 1272 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1273 | 1274 | isarray@^1.0.0, isarray@~1.0.0: 1275 | version "1.0.0" 1276 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1277 | 1278 | isarray@~0.0.1: 1279 | version "0.0.1" 1280 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1281 | 1282 | isomorphic-fetch@^2.1.1: 1283 | version "2.2.1" 1284 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1285 | dependencies: 1286 | node-fetch "^1.0.1" 1287 | whatwg-fetch ">=0.10.0" 1288 | 1289 | js-tokens@^3.0.0, js-tokens@^3.0.2: 1290 | version "3.0.2" 1291 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1292 | 1293 | jsesc@^1.3.0: 1294 | version "1.3.0" 1295 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1296 | 1297 | jsesc@~0.5.0: 1298 | version "0.5.0" 1299 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1300 | 1301 | json-stable-stringify@~0.0.0: 1302 | version "0.0.1" 1303 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" 1304 | dependencies: 1305 | jsonify "~0.0.0" 1306 | 1307 | json5@^0.5.1: 1308 | version "0.5.1" 1309 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1310 | 1311 | jsonify@~0.0.0: 1312 | version "0.0.0" 1313 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1314 | 1315 | jsonparse@^1.2.0: 1316 | version "1.3.1" 1317 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 1318 | 1319 | keycode@^2.1.2: 1320 | version "2.1.9" 1321 | resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa" 1322 | 1323 | labeled-stream-splicer@^2.0.0: 1324 | version "2.0.0" 1325 | resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" 1326 | dependencies: 1327 | inherits "^2.0.1" 1328 | isarray "~0.0.1" 1329 | stream-splicer "^2.0.0" 1330 | 1331 | lexical-scope@^1.2.0: 1332 | version "1.2.0" 1333 | resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" 1334 | dependencies: 1335 | astw "^2.0.0" 1336 | 1337 | lodash.memoize@~3.0.3: 1338 | version "3.0.4" 1339 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" 1340 | 1341 | lodash@^4.17.4: 1342 | version "4.17.4" 1343 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1344 | 1345 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 1346 | version "1.3.1" 1347 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1348 | dependencies: 1349 | js-tokens "^3.0.0" 1350 | 1351 | md5.js@^1.3.4: 1352 | version "1.3.4" 1353 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" 1354 | dependencies: 1355 | hash-base "^3.0.0" 1356 | inherits "^2.0.1" 1357 | 1358 | miller-rabin@^4.0.0: 1359 | version "4.0.1" 1360 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 1361 | dependencies: 1362 | bn.js "^4.0.0" 1363 | brorand "^1.0.1" 1364 | 1365 | minimalistic-assert@^1.0.0: 1366 | version "1.0.0" 1367 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" 1368 | 1369 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: 1370 | version "1.0.1" 1371 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1372 | 1373 | minimatch@^3.0.4: 1374 | version "3.0.4" 1375 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1376 | dependencies: 1377 | brace-expansion "^1.1.7" 1378 | 1379 | minimist@0.0.8: 1380 | version "0.0.8" 1381 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1382 | 1383 | minimist@^1.1.0: 1384 | version "1.2.0" 1385 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1386 | 1387 | mkdirp@^0.5.1: 1388 | version "0.5.1" 1389 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1390 | dependencies: 1391 | minimist "0.0.8" 1392 | 1393 | module-deps@^4.0.8: 1394 | version "4.1.1" 1395 | resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" 1396 | dependencies: 1397 | JSONStream "^1.0.3" 1398 | browser-resolve "^1.7.0" 1399 | cached-path-relative "^1.0.0" 1400 | concat-stream "~1.5.0" 1401 | defined "^1.0.0" 1402 | detective "^4.0.0" 1403 | duplexer2 "^0.1.2" 1404 | inherits "^2.0.1" 1405 | parents "^1.0.0" 1406 | readable-stream "^2.0.2" 1407 | resolve "^1.1.3" 1408 | stream-combiner2 "^1.1.1" 1409 | subarg "^1.0.0" 1410 | through2 "^2.0.0" 1411 | xtend "^4.0.0" 1412 | 1413 | ms@2.0.0: 1414 | version "2.0.0" 1415 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1416 | 1417 | node-fetch@^1.0.1: 1418 | version "1.7.3" 1419 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1420 | dependencies: 1421 | encoding "^0.1.11" 1422 | is-stream "^1.0.1" 1423 | 1424 | number-is-nan@^1.0.0: 1425 | version "1.0.1" 1426 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1427 | 1428 | object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: 1429 | version "4.1.1" 1430 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1431 | 1432 | once@^1.3.0: 1433 | version "1.4.0" 1434 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1435 | dependencies: 1436 | wrappy "1" 1437 | 1438 | os-browserify@~0.1.1: 1439 | version "0.1.2" 1440 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" 1441 | 1442 | os-homedir@^1.0.0: 1443 | version "1.0.2" 1444 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1445 | 1446 | os-tmpdir@^1.0.1: 1447 | version "1.0.2" 1448 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1449 | 1450 | pako@~0.2.0: 1451 | version "0.2.9" 1452 | resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" 1453 | 1454 | parents@^1.0.0, parents@^1.0.1: 1455 | version "1.0.1" 1456 | resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" 1457 | dependencies: 1458 | path-platform "~0.11.15" 1459 | 1460 | parse-asn1@^5.0.0: 1461 | version "5.1.0" 1462 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" 1463 | dependencies: 1464 | asn1.js "^4.0.0" 1465 | browserify-aes "^1.0.0" 1466 | create-hash "^1.1.0" 1467 | evp_bytestokey "^1.0.0" 1468 | pbkdf2 "^3.0.3" 1469 | 1470 | path-browserify@~0.0.0: 1471 | version "0.0.0" 1472 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" 1473 | 1474 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 1475 | version "1.0.1" 1476 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1477 | 1478 | path-parse@^1.0.5: 1479 | version "1.0.5" 1480 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1481 | 1482 | path-platform@~0.11.15: 1483 | version "0.11.15" 1484 | resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" 1485 | 1486 | pbkdf2@^3.0.3: 1487 | version "3.0.14" 1488 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" 1489 | dependencies: 1490 | create-hash "^1.1.2" 1491 | create-hmac "^1.1.4" 1492 | ripemd160 "^2.0.1" 1493 | safe-buffer "^5.0.1" 1494 | sha.js "^2.4.8" 1495 | 1496 | private@^0.1.6, private@^0.1.7: 1497 | version "0.1.8" 1498 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 1499 | 1500 | process-nextick-args@~1.0.6: 1501 | version "1.0.7" 1502 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1503 | 1504 | process@~0.11.0: 1505 | version "0.11.10" 1506 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1507 | 1508 | promise@^7.1.1: 1509 | version "7.3.1" 1510 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1511 | dependencies: 1512 | asap "~2.0.3" 1513 | 1514 | prop-types-extra@^1.0.1: 1515 | version "1.0.1" 1516 | resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.0.1.tgz#a57bd4810e82d27a3ff4317ecc1b4ad005f79a82" 1517 | dependencies: 1518 | warning "^3.0.0" 1519 | 1520 | prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0: 1521 | version "15.6.0" 1522 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" 1523 | dependencies: 1524 | fbjs "^0.8.16" 1525 | loose-envify "^1.3.1" 1526 | object-assign "^4.1.1" 1527 | 1528 | public-encrypt@^4.0.0: 1529 | version "4.0.0" 1530 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" 1531 | dependencies: 1532 | bn.js "^4.1.0" 1533 | browserify-rsa "^4.0.0" 1534 | create-hash "^1.1.0" 1535 | parse-asn1 "^5.0.0" 1536 | randombytes "^2.0.1" 1537 | 1538 | punycode@1.3.2: 1539 | version "1.3.2" 1540 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1541 | 1542 | punycode@^1.3.2: 1543 | version "1.4.1" 1544 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1545 | 1546 | querystring-es3@~0.2.0: 1547 | version "0.2.1" 1548 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 1549 | 1550 | querystring@0.2.0: 1551 | version "0.2.0" 1552 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1553 | 1554 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 1555 | version "2.0.6" 1556 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" 1557 | dependencies: 1558 | safe-buffer "^5.1.0" 1559 | 1560 | randomfill@^1.0.3: 1561 | version "1.0.3" 1562 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" 1563 | dependencies: 1564 | randombytes "^2.0.5" 1565 | safe-buffer "^5.1.0" 1566 | 1567 | react-bootstrap@^0.32.1: 1568 | version "0.32.1" 1569 | resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-0.32.1.tgz#60624c1b48a39d773ef6cce6421a4f33ecc166bb" 1570 | dependencies: 1571 | babel-runtime "^6.11.6" 1572 | classnames "^2.2.5" 1573 | dom-helpers "^3.2.0" 1574 | invariant "^2.2.1" 1575 | keycode "^2.1.2" 1576 | prop-types "^15.5.10" 1577 | prop-types-extra "^1.0.1" 1578 | react-overlays "^0.8.0" 1579 | react-prop-types "^0.4.0" 1580 | react-transition-group "^2.0.0" 1581 | uncontrollable "^4.1.0" 1582 | warning "^3.0.0" 1583 | 1584 | react-dom@^16.0.0: 1585 | version "16.2.0" 1586 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" 1587 | dependencies: 1588 | fbjs "^0.8.16" 1589 | loose-envify "^1.1.0" 1590 | object-assign "^4.1.1" 1591 | prop-types "^15.6.0" 1592 | 1593 | react-overlays@^0.8.0: 1594 | version "0.8.3" 1595 | resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz#fad65eea5b24301cca192a169f5dddb0b20d3ac5" 1596 | dependencies: 1597 | classnames "^2.2.5" 1598 | dom-helpers "^3.2.1" 1599 | prop-types "^15.5.10" 1600 | prop-types-extra "^1.0.1" 1601 | react-transition-group "^2.2.0" 1602 | warning "^3.0.0" 1603 | 1604 | react-prop-types@^0.4.0: 1605 | version "0.4.0" 1606 | resolved "https://registry.yarnpkg.com/react-prop-types/-/react-prop-types-0.4.0.tgz#f99b0bfb4006929c9af2051e7c1414a5c75b93d0" 1607 | dependencies: 1608 | warning "^3.0.0" 1609 | 1610 | react-transition-group@^2.0.0, react-transition-group@^2.2.0: 1611 | version "2.2.1" 1612 | resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.1.tgz#e9fb677b79e6455fd391b03823afe84849df4a10" 1613 | dependencies: 1614 | chain-function "^1.0.0" 1615 | classnames "^2.2.5" 1616 | dom-helpers "^3.2.0" 1617 | loose-envify "^1.3.1" 1618 | prop-types "^15.5.8" 1619 | warning "^3.0.0" 1620 | 1621 | react@^16.0.0: 1622 | version "16.2.0" 1623 | resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" 1624 | dependencies: 1625 | fbjs "^0.8.16" 1626 | loose-envify "^1.1.0" 1627 | object-assign "^4.1.1" 1628 | prop-types "^15.6.0" 1629 | 1630 | read-only-stream@^2.0.0: 1631 | version "2.0.0" 1632 | resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" 1633 | dependencies: 1634 | readable-stream "^2.0.2" 1635 | 1636 | readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.3.3: 1637 | version "2.3.3" 1638 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1639 | dependencies: 1640 | core-util-is "~1.0.0" 1641 | inherits "~2.0.3" 1642 | isarray "~1.0.0" 1643 | process-nextick-args "~1.0.6" 1644 | safe-buffer "~5.1.1" 1645 | string_decoder "~1.0.3" 1646 | util-deprecate "~1.0.1" 1647 | 1648 | readable-stream@~2.0.0: 1649 | version "2.0.6" 1650 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 1651 | dependencies: 1652 | core-util-is "~1.0.0" 1653 | inherits "~2.0.1" 1654 | isarray "~1.0.0" 1655 | process-nextick-args "~1.0.6" 1656 | string_decoder "~0.10.x" 1657 | util-deprecate "~1.0.1" 1658 | 1659 | regenerate@^1.2.1: 1660 | version "1.3.3" 1661 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" 1662 | 1663 | regenerator-runtime@^0.11.0: 1664 | version "0.11.1" 1665 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 1666 | 1667 | regenerator-transform@^0.10.0: 1668 | version "0.10.1" 1669 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" 1670 | dependencies: 1671 | babel-runtime "^6.18.0" 1672 | babel-types "^6.19.0" 1673 | private "^0.1.6" 1674 | 1675 | regexpu-core@^2.0.0: 1676 | version "2.0.0" 1677 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1678 | dependencies: 1679 | regenerate "^1.2.1" 1680 | regjsgen "^0.2.0" 1681 | regjsparser "^0.1.4" 1682 | 1683 | regjsgen@^0.2.0: 1684 | version "0.2.0" 1685 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1686 | 1687 | regjsparser@^0.1.4: 1688 | version "0.1.5" 1689 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1690 | dependencies: 1691 | jsesc "~0.5.0" 1692 | 1693 | repeating@^2.0.0: 1694 | version "2.0.1" 1695 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1696 | dependencies: 1697 | is-finite "^1.0.0" 1698 | 1699 | resolve@1.1.7: 1700 | version "1.1.7" 1701 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 1702 | 1703 | resolve@^1.1.3, resolve@^1.1.4: 1704 | version "1.5.0" 1705 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 1706 | dependencies: 1707 | path-parse "^1.0.5" 1708 | 1709 | ripemd160@^2.0.0, ripemd160@^2.0.1: 1710 | version "2.0.1" 1711 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" 1712 | dependencies: 1713 | hash-base "^2.0.0" 1714 | inherits "^2.0.1" 1715 | 1716 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1717 | version "5.1.1" 1718 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1719 | 1720 | setimmediate@^1.0.5: 1721 | version "1.0.5" 1722 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1723 | 1724 | sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: 1725 | version "2.4.10" 1726 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" 1727 | dependencies: 1728 | inherits "^2.0.1" 1729 | safe-buffer "^5.0.1" 1730 | 1731 | shasum@^1.0.0: 1732 | version "1.0.2" 1733 | resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" 1734 | dependencies: 1735 | json-stable-stringify "~0.0.0" 1736 | sha.js "~2.4.4" 1737 | 1738 | shell-quote@^1.6.1: 1739 | version "1.6.1" 1740 | resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" 1741 | dependencies: 1742 | array-filter "~0.0.0" 1743 | array-map "~0.0.0" 1744 | array-reduce "~0.0.0" 1745 | jsonify "~0.0.0" 1746 | 1747 | slash@^1.0.0: 1748 | version "1.0.0" 1749 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1750 | 1751 | source-map-support@^0.4.15: 1752 | version "0.4.18" 1753 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 1754 | dependencies: 1755 | source-map "^0.5.6" 1756 | 1757 | source-map@^0.5.6, source-map@~0.5.3: 1758 | version "0.5.7" 1759 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1760 | 1761 | stream-browserify@^2.0.0: 1762 | version "2.0.1" 1763 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" 1764 | dependencies: 1765 | inherits "~2.0.1" 1766 | readable-stream "^2.0.2" 1767 | 1768 | stream-combiner2@^1.1.1: 1769 | version "1.1.1" 1770 | resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" 1771 | dependencies: 1772 | duplexer2 "~0.1.0" 1773 | readable-stream "^2.0.2" 1774 | 1775 | stream-http@^2.0.0: 1776 | version "2.8.0" 1777 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" 1778 | dependencies: 1779 | builtin-status-codes "^3.0.0" 1780 | inherits "^2.0.1" 1781 | readable-stream "^2.3.3" 1782 | to-arraybuffer "^1.0.0" 1783 | xtend "^4.0.0" 1784 | 1785 | stream-splicer@^2.0.0: 1786 | version "2.0.0" 1787 | resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" 1788 | dependencies: 1789 | inherits "^2.0.1" 1790 | readable-stream "^2.0.2" 1791 | 1792 | string_decoder@~0.10.0, string_decoder@~0.10.x: 1793 | version "0.10.31" 1794 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1795 | 1796 | string_decoder@~1.0.3: 1797 | version "1.0.3" 1798 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1799 | dependencies: 1800 | safe-buffer "~5.1.0" 1801 | 1802 | strip-ansi@^3.0.0: 1803 | version "3.0.1" 1804 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1805 | dependencies: 1806 | ansi-regex "^2.0.0" 1807 | 1808 | subarg@^1.0.0: 1809 | version "1.0.0" 1810 | resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" 1811 | dependencies: 1812 | minimist "^1.1.0" 1813 | 1814 | supports-color@^2.0.0: 1815 | version "2.0.0" 1816 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1817 | 1818 | syntax-error@^1.1.1: 1819 | version "1.3.0" 1820 | resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1" 1821 | dependencies: 1822 | acorn "^4.0.3" 1823 | 1824 | through2@^2.0.0: 1825 | version "2.0.3" 1826 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1827 | dependencies: 1828 | readable-stream "^2.1.5" 1829 | xtend "~4.0.1" 1830 | 1831 | "through@>=2.2.7 <3": 1832 | version "2.3.8" 1833 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1834 | 1835 | timers-browserify@^1.0.1: 1836 | version "1.4.2" 1837 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" 1838 | dependencies: 1839 | process "~0.11.0" 1840 | 1841 | to-arraybuffer@^1.0.0: 1842 | version "1.0.1" 1843 | resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 1844 | 1845 | to-fast-properties@^1.0.3: 1846 | version "1.0.3" 1847 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 1848 | 1849 | trim-right@^1.0.1: 1850 | version "1.0.1" 1851 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1852 | 1853 | tty-browserify@~0.0.0: 1854 | version "0.0.0" 1855 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 1856 | 1857 | typedarray@~0.0.5: 1858 | version "0.0.6" 1859 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1860 | 1861 | ua-parser-js@^0.7.9: 1862 | version "0.7.17" 1863 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" 1864 | 1865 | umd@^3.0.0: 1866 | version "3.0.1" 1867 | resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" 1868 | 1869 | uncontrollable@^4.1.0: 1870 | version "4.1.0" 1871 | resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-4.1.0.tgz#e0358291252e1865222d90939b19f2f49f81c1a9" 1872 | dependencies: 1873 | invariant "^2.1.0" 1874 | 1875 | union-class-names@^1.0.0: 1876 | version "1.0.0" 1877 | resolved "https://registry.yarnpkg.com/union-class-names/-/union-class-names-1.0.0.tgz#9259608adacc39094a2b0cfe16c78e6200617847" 1878 | 1879 | url@~0.11.0: 1880 | version "0.11.0" 1881 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 1882 | dependencies: 1883 | punycode "1.3.2" 1884 | querystring "0.2.0" 1885 | 1886 | util-deprecate@~1.0.1: 1887 | version "1.0.2" 1888 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1889 | 1890 | util@0.10.3, util@~0.10.1: 1891 | version "0.10.3" 1892 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 1893 | dependencies: 1894 | inherits "2.0.1" 1895 | 1896 | vm-browserify@~0.0.1: 1897 | version "0.0.4" 1898 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" 1899 | dependencies: 1900 | indexof "0.0.1" 1901 | 1902 | warning@^3.0.0: 1903 | version "3.0.0" 1904 | resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" 1905 | dependencies: 1906 | loose-envify "^1.0.0" 1907 | 1908 | whatwg-fetch@>=0.10.0: 1909 | version "2.0.3" 1910 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 1911 | 1912 | wrappy@1: 1913 | version "1.0.2" 1914 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1915 | 1916 | xtend@^4.0.0, xtend@~4.0.1: 1917 | version "4.0.1" 1918 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1919 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "draft-js-richbuttons-plugin", 3 | "version": "2.2.0", 4 | "description": "Rich Editing Buttons Plugin for DraftJS Plugins Editor", 5 | "author": { 6 | "name": "Jason Phillips", 7 | "url": "https://github.com/jasonphillips" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/jasonphillips/draft-js-richbuttons-plugin.git" 12 | }, 13 | "main": "lib/index.js", 14 | "keywords": [ 15 | "editor", 16 | "wysiwyg", 17 | "draft", 18 | "react", 19 | "ux", 20 | "components", 21 | "widget", 22 | "react-component" 23 | ], 24 | "peerDependencies": { 25 | "draft-js-plugins-editor": "^2.0.0", 26 | "react": "^15.0.0 || ^16.0.0", 27 | "react-dom": "^15.0.0 || ^16.0.0" 28 | }, 29 | "scripts": { 30 | "clean": "rimraf lib", 31 | "build": "npm run clean && npm run build:js", 32 | "build:js": "BABEL_DISABLE_CACHE=1 BABEL_ENV=production NODE_ENV=production babel --out-dir='lib' --ignore='__test__/*' src", 33 | "prepublish": "npm run build", 34 | "test": "mocha --compilers js:babel-core/register --require jsdom-global/register **/__test__/*.js" 35 | }, 36 | "license": "MIT", 37 | "dependencies": { 38 | "decorate-component-with-props": "^1.0.2", 39 | "prop-types": "^15.5.10" 40 | }, 41 | "devDependencies": { 42 | "babel-cli": "^6.18.0", 43 | "babel-preset-es2015": "^6.18.0", 44 | "babel-preset-react": "^6.16.0", 45 | "babel-preset-react-hmre": "^1.1.1", 46 | "babel-preset-stage-0": "^6.16.0", 47 | "chai": "^3.5.0", 48 | "chai-enzyme": "^0.7.1", 49 | "draft-js-plugins-editor": "~2.0.4", 50 | "draft-js": "~0.10.5", 51 | "enzyme": "^2.9.0", 52 | "jsdom": "^9.8.3", 53 | "jsdom-global": "^2.1.0", 54 | "mocha": "^3.2.0", 55 | "react": "^15.5.0", 56 | "react-dom": "^15.5.0", 57 | "react-test-renderer": "^15.6.1", 58 | "rimraf": "^2.5.4", 59 | "sinon": "^1.17.6", 60 | "sinon-chai": "^2.8.0" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/BlockButton/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | class BlockButton extends Component { 5 | 6 | static propTypes = { 7 | store: PropTypes.object, 8 | bindToState: PropTypes.func, 9 | label: PropTypes.string, 10 | blockType: PropTypes.string 11 | }; 12 | 13 | constructor(props) { 14 | super(props); 15 | this.componentWillMount = this.componentWillMount.bind(this); 16 | this.componentWillUnmount = this.componentWillUnmount.bind(this); 17 | } 18 | 19 | // register with store updates to ensure rerender 20 | componentWillMount() { 21 | this.props.bindToState(this); 22 | } 23 | 24 | componentWillUnmount() { 25 | this.props.bindToState(this, true); 26 | } 27 | 28 | render() { 29 | const { store, blockType, label, children } = this.props; 30 | const toggleBlockType = store.toggleBlockType.bind(store, blockType); 31 | let isActive = undefined; 32 | 33 | if (store.getEditorState) { 34 | const editorState = store.getEditorState(); 35 | const selection = editorState.getSelection(); 36 | const currentType = editorState 37 | .getCurrentContent() 38 | .getBlockForKey(selection.getStartKey()) 39 | .getType(); 40 | isActive = currentType == blockType; 41 | } else { 42 | // editor not yet available / initialized 43 | isActive = false; 44 | } 45 | 46 | if (children && typeof children == 'object') { 47 | const ChildInput = React.cloneElement(children, { 48 | toggleBlockType, 49 | isActive, 50 | label, 51 | blockType 52 | }); 53 | 54 | return ChildInput; 55 | } 56 | 57 | const spanStyle = { 58 | color: isActive ? '#900' : '#999', 59 | cursor: 'pointer', 60 | display: 'inline-block', 61 | marginRight: '1em' 62 | } 63 | 64 | return ( 65 | 66 | { label } 67 | 68 | ); 69 | } 70 | } 71 | 72 | export default BlockButton; 73 | -------------------------------------------------------------------------------- /src/StyleButton/index.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | const preventDefault = (event) => event.preventDefault(); 5 | 6 | const wrapPrevent = (callback) => { 7 | return (event) => { 8 | event.preventDefault(); 9 | callback(); 10 | } 11 | } 12 | 13 | class StyleButton extends Component { 14 | 15 | static propTypes = { 16 | store: PropTypes.object, 17 | bindToState: PropTypes.func, 18 | label: PropTypes.string, 19 | inlineStyle: PropTypes.string 20 | }; 21 | 22 | constructor(props) { 23 | super(props); 24 | this.componentWillMount = this.componentWillMount.bind(this); 25 | this.componentWillUnmount = this.componentWillUnmount.bind(this); 26 | } 27 | 28 | // register with store updates to ensure rerender 29 | componentWillMount() { 30 | this.props.bindToState(this); 31 | } 32 | 33 | componentWillUnmount() { 34 | this.props.bindToState(this, true); 35 | } 36 | 37 | render() { 38 | const { store, inlineStyle, label, children } = this.props; 39 | const toggleInlineStyle = store.toggleInlineStyle.bind(store, inlineStyle); 40 | let isActive = undefined; 41 | 42 | if (store.getEditorState) { 43 | const currentStyle = store.getEditorState().getCurrentInlineStyle(); 44 | isActive = currentStyle.has(inlineStyle); 45 | } else { 46 | // editor not yet available / initialized 47 | isActive = false; 48 | } 49 | 50 | if (children && typeof children == 'object') { 51 | const ChildInput = React.cloneElement(children, { 52 | toggleInlineStyle: wrapPrevent(toggleInlineStyle), 53 | isActive, 54 | label, 55 | inlineStyle, 56 | onMouseDown: preventDefault 57 | }); 58 | 59 | return ChildInput; 60 | } 61 | 62 | const spanStyle = { 63 | color: isActive ? '#900' : '#999', 64 | cursor: 'pointer', 65 | display: 'inline-block', 66 | marginRight: '1em' 67 | } 68 | 69 | return ( 70 | 75 | { label } 76 | 77 | ); 78 | } 79 | } 80 | 81 | export default StyleButton; 82 | -------------------------------------------------------------------------------- /src/__test__/index.js: -------------------------------------------------------------------------------- 1 | import { jsdom } from 'jsdom'; 2 | import React from 'react'; 3 | import { mount } from 'enzyme'; 4 | import { EditorState, ContentState } from 'draft-js'; 5 | import DraftPasteProcessor from 'draft-js/lib/DraftPasteProcessor'; 6 | import chai from 'chai'; 7 | const expect = chai.expect; 8 | 9 | import createRichButtonsPlugin from '../index'; 10 | import { MAX_LIST_DEPTH, INLINE_STYLES, BLOCK_TYPES } from '../config/types'; 11 | 12 | process.env.NODE_ENV = 'test'; 13 | 14 | const exposedProperties = ['window', 'navigator', 'document']; 15 | const blankEvent = {preventDefault: () => null} 16 | 17 | global.document = jsdom(''); 18 | global.window = document.defaultView; 19 | Object.keys(document.defaultView).forEach((property) => { 20 | if (typeof global[property] === 'undefined') { 21 | exposedProperties.push(property); 22 | global[property] = document.defaultView[property]; 23 | } 24 | }); 25 | 26 | // chaiEnzyme needs to be initialised here, so that canUseDOM is set 27 | // to true when react-dom initialises (which chai-enzyme depends upon) 28 | const chaiEnzyme = require('chai-enzyme'); 29 | chai.use(chaiEnzyme()); 30 | 31 | describe('Draft RichButtons Plugin', () => { 32 | const createEditorStateFromHTML = (html) => { 33 | const blocks = DraftPasteProcessor.processHTML(html); 34 | const contentState = ContentState.createFromBlockArray(blocks); 35 | return EditorState.createWithContent(contentState); 36 | }; 37 | 38 | const getCurrentBlockType = (editorState) => { 39 | const selection = editorState.getSelection(); 40 | return editorState 41 | .getCurrentContent() 42 | .getBlockForKey(selection.getStartKey()) 43 | .getType(); 44 | }; 45 | 46 | let richButtonsPlugin; 47 | 48 | describe('style buttons', () => { 49 | richButtonsPlugin = createRichButtonsPlugin(); 50 | const html = '

Some normal text

'; 51 | let editorState = createEditorStateFromHTML(html); 52 | 53 | richButtonsPlugin.initialize({ 54 | getEditorState: () => editorState, 55 | setEditorState: (newState) => { 56 | editorState = newState; 57 | return editorState; 58 | } 59 | }); 60 | 61 | const { 62 | ItalicButton, BoldButton, MonospaceButton, UnderlineButton, 63 | createStyleButton, 64 | } = richButtonsPlugin; 65 | 66 | describe('default buttons', () => { 67 | // render with refs for iteration 68 | class ButtonsBar extends React.Component { 69 | render() { 70 | return ( 71 |

72 | 73 | 74 | 75 | 76 |
77 | ); 78 | } 79 | } 80 | const buttons = mount(); 81 | 82 | INLINE_STYLES.forEach(({ label, style }) => { 83 | describe(`${label}Button`, () => { 84 | 85 | it('renders with default labels', () => { 86 | expect(buttons.ref(label)).to.have.text(label); 87 | }); 88 | 89 | it('toggles current style on and off', () => { 90 | expect(editorState.getCurrentInlineStyle().has(style)).to.be.false; 91 | buttons.ref(label).simulate('click'); 92 | expect(editorState.getCurrentInlineStyle().has(style)).to.be.true; 93 | buttons.ref(label).simulate('click'); 94 | expect(editorState.getCurrentInlineStyle().has(style)).to.be.false; 95 | }); 96 | 97 | }); 98 | }); 99 | }) 100 | 101 | describe('custom inline style with createStyleButton()', () => { 102 | // create a custom inline style button 103 | const BarStyleButton = createStyleButton({style: 'bar', label:'Bar'}); 104 | 105 | // render with refs for iteration 106 | class ButtonsBar extends React.Component { 107 | render() { 108 | return ( 109 |
110 | 111 |
112 | ); 113 | } 114 | } 115 | const buttons = mount(); 116 | 117 | it('renders with correct label', () => { 118 | expect(buttons.ref('BarButton')).to.have.text('Bar'); 119 | }); 120 | 121 | it('toggles custom inline style on and off', () => { 122 | expect(editorState.getCurrentInlineStyle().has('bar')).to.be.false; 123 | buttons.ref('BarButton').simulate('click'); 124 | expect(editorState.getCurrentInlineStyle().has('bar')).to.be.true; 125 | buttons.ref('BarButton').simulate('click'); 126 | expect(editorState.getCurrentInlineStyle().has('bar')).to.be.false; 127 | }); 128 | }); 129 | 130 | describe('custom buttons', () => { 131 | // render with refs for iteration 132 | class CustomButtonsBar extends React.Component { 133 | render() { 134 | return ( 135 |
136 | 137 |
138 | 139 | 140 |
141 | 142 | 143 |
144 | 145 | 146 |
147 | 148 |
149 | ); 150 | } 151 | } 152 | const buttons = mount(); 153 | 154 | INLINE_STYLES.forEach(({ label, style }) => { 155 | describe(`Custom ${label}Button`, () => { 156 | const childWithProps = buttons.ref(`${label}Child`); 157 | 158 | it('passes properties to child component', () => { 159 | expect(childWithProps.prop('label')).to.be.a.string; 160 | expect(childWithProps.prop('inlineStyle')).to.be.a.string; 161 | expect(childWithProps.prop('toggleInlineStyle')).to.be.a.function; 162 | }); 163 | 164 | it('toggles isActive prop of child', () => { 165 | expect(childWithProps.prop('isActive')).to.be.false; 166 | 167 | childWithProps.prop('toggleInlineStyle')(blankEvent); 168 | expect(editorState.getCurrentInlineStyle().has(style)).to.be.true; 169 | expect(childWithProps.prop('isActive')).to.be.true; 170 | 171 | childWithProps.prop('toggleInlineStyle')(blankEvent); 172 | expect(childWithProps.prop('isActive')).to.be.false; 173 | }); 174 | 175 | }); 176 | }); 177 | }); 178 | }); 179 | 180 | describe('block buttons', () => { 181 | richButtonsPlugin = createRichButtonsPlugin(); 182 | const html = '

Some normal text

'; 183 | let editorState = createEditorStateFromHTML(html); 184 | 185 | richButtonsPlugin.initialize({ 186 | getEditorState: () => editorState, 187 | setEditorState: (newState) => { 188 | editorState = newState; 189 | return editorState; 190 | } 191 | }); 192 | 193 | const { 194 | ParagraphButton, BlockquoteButton, CodeButton, OLButton, ULButton, 195 | H1Button, H2Button, H3Button, H4Button, H5Button, H6Button, 196 | createBlockButton, 197 | } = richButtonsPlugin; 198 | 199 | describe('default buttons', () => { 200 | // render with refs for iteration 201 | class ButtonsBar extends React.Component { 202 | render() { 203 | return ( 204 |

205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 |
217 | ); 218 | } 219 | } 220 | const buttons = mount(); 221 | 222 | BLOCK_TYPES.forEach(({ label, style }) => { 223 | describe(`${label}Button`, () => { 224 | 225 | it('renders with default labels', () => { 226 | expect(buttons.ref(label)).to.have.text(label); 227 | }); 228 | 229 | it('toggles current block style on and off', () => { 230 | if (label=='Paragraph') return; 231 | 232 | expect(getCurrentBlockType(editorState)).to.not.equal(style); 233 | buttons.ref(label).simulate('click'); 234 | expect(getCurrentBlockType(editorState)).to.equal(style); 235 | buttons.ref(label).simulate('click'); 236 | expect(getCurrentBlockType(editorState)).to.not.equal(style); 237 | }); 238 | }); 239 | }); 240 | }); 241 | 242 | describe('custom block with createBlockButton()', () => { 243 | // create a custom block type 244 | const FooBlockButton = createBlockButton({type: 'foo', label:'Foo'}); 245 | 246 | // render with refs for iteration 247 | class ButtonsBar extends React.Component { 248 | render() { 249 | return ( 250 |
251 | 252 |
253 | ); 254 | } 255 | } 256 | const buttons = mount(); 257 | 258 | it('renders with correct label', () => { 259 | expect(buttons.ref('FooButton')).to.have.text('Foo'); 260 | }); 261 | 262 | it('toggles custom block type on and off', () => { 263 | expect(getCurrentBlockType(editorState)).to.not.equal('foo'); 264 | buttons.ref('FooButton').simulate('click'); 265 | expect(getCurrentBlockType(editorState)).to.equal('foo'); 266 | buttons.ref('FooButton').simulate('click'); 267 | expect(getCurrentBlockType(editorState)).to.not.equal('foo'); 268 | }); 269 | }); 270 | 271 | describe('custom buttons', () => { 272 | // render with refs for iteration 273 | class CustomButtonsBar extends React.Component { 274 | render() { 275 | return ( 276 |
277 | 278 |
279 | 280 | 281 |
282 | 283 | 284 |
285 | 286 | 287 |
288 | 289 | 290 |
291 | 292 | 293 |
294 | 295 | 296 |
297 | 298 | 299 |
300 | 301 | 302 |
303 | 304 | 305 |
306 | 307 | 308 |
309 | 310 |
311 | ); 312 | } 313 | } 314 | const buttons = mount(); 315 | 316 | BLOCK_TYPES.forEach(({ label, style }) => { 317 | describe(`Custom ${label}Button`, () => { 318 | const childWithProps = buttons.ref(`${label}Child`); 319 | 320 | it('passes properties to child component', () => { 321 | expect(childWithProps.prop('label')).to.be.a.string; 322 | expect(childWithProps.prop('blockType')).to.be.a.string; 323 | expect(childWithProps.prop('toggleBlockType')).to.be.a.function; 324 | }); 325 | 326 | it('toggles isActive prop of child', () => { 327 | if (label=='Paragraph') return; 328 | 329 | expect(getCurrentBlockType(editorState)).to.not.equal(style); 330 | expect(childWithProps.prop('isActive')).to.be.false; 331 | 332 | childWithProps.prop('toggleBlockType')(); 333 | expect(getCurrentBlockType(editorState)).to.equal(style); 334 | expect(childWithProps.prop('isActive')).to.be.true; 335 | 336 | childWithProps.prop('toggleBlockType')(); 337 | expect(getCurrentBlockType(editorState)).to.not.equal(style); 338 | expect(childWithProps.prop('isActive')).to.be.false; 339 | }); 340 | 341 | }); 342 | }); 343 | }); 344 | }); 345 | 346 | }); 347 | -------------------------------------------------------------------------------- /src/config/types.js: -------------------------------------------------------------------------------- 1 | export const MAX_LIST_DEPTH = 5; 2 | 3 | export const INLINE_STYLES = [ 4 | { label: 'Bold', style: 'BOLD' }, 5 | { label: 'Italic', style: 'ITALIC' }, 6 | { label: 'Underline', style: 'UNDERLINE' }, 7 | { label: 'Monospace', style: 'CODE' }, 8 | ]; 9 | 10 | export const BLOCK_TYPES = [ 11 | { label: 'H1', style: 'header-one' }, 12 | { label: 'H2', style: 'header-two' }, 13 | { label: 'H3', style: 'header-three' }, 14 | { label: 'H4', style: 'header-four' }, 15 | { label: 'H5', style: 'header-five' }, 16 | { label: 'H6', style: 'header-six' }, 17 | { label: 'Blockquote', style: 'blockquote' }, 18 | { label: 'UL', style: 'unordered-list-item' }, 19 | { label: 'OL', style: 'ordered-list-item' }, 20 | { label: 'Code', style: 'code-block' }, 21 | { label: 'Paragraph', style: 'unstyled' } 22 | ]; 23 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import StyleButton from './StyleButton'; 2 | import BlockButton from './BlockButton'; 3 | import { RichUtils, EditorState } from 'draft-js'; 4 | import { MAX_LIST_DEPTH, INLINE_STYLES, BLOCK_TYPES } from './config/types'; 5 | 6 | import decorateComponentWithProps from 'decorate-component-with-props'; 7 | 8 | const richButtonsPlugin = () => { 9 | const store = { 10 | getEditorState: undefined, 11 | setEditorState: undefined, 12 | currentState: undefined, 13 | 14 | onChange: function onChange(newState) { 15 | if (newState!==this.currentState) { 16 | this.currentState = newState; 17 | this.notifyBound(); 18 | } 19 | return newState; 20 | }, 21 | 22 | // buttons must be subscribed explicitly to ensure rerender 23 | boundComponents: [], 24 | bindToState: function bindToState(component, remove) { 25 | if (remove) { 26 | this.boundComponents = this.boundComponents.filter((registered) => 27 | registered!==component 28 | ); 29 | } else { 30 | this.boundComponents.push(component); 31 | } 32 | }, 33 | notifyBound: function notifyBound() { 34 | this.boundComponents.forEach((component) => component.forceUpdate()); 35 | }, 36 | 37 | toggleInlineStyle: function toggleInlineStyle(inlineStyle) { 38 | const state = this.getEditorState(); 39 | const newState = RichUtils.toggleInlineStyle( 40 | state, 41 | inlineStyle 42 | ); 43 | this.setEditorState( 44 | newState 45 | ); 46 | }, 47 | 48 | toggleBlockType: function toggleBlockType(blockType) { 49 | const state = this.getEditorState(); 50 | const newState = RichUtils.toggleBlockType( 51 | state, 52 | blockType 53 | ); 54 | this.setEditorState( 55 | EditorState.forceSelection( 56 | newState, newState.getCurrentContent().getSelectionAfter() 57 | ) 58 | ); 59 | } 60 | }; 61 | 62 | const configured = { 63 | initialize: ({ getEditorState, setEditorState }) => { 64 | store.currentState = getEditorState(); 65 | store.getEditorState = () => store.currentState; 66 | store.setEditorState = (newState) => { 67 | store.onChange(newState); 68 | setEditorState(newState); 69 | }; 70 | }, 71 | 72 | handleKeyCommand: (command, state, { getEditorState, setEditorState }) => { 73 | const editorState = getEditorState(); 74 | const newState = RichUtils.handleKeyCommand(editorState, command); 75 | if (newState) { 76 | setEditorState(newState); 77 | return true; 78 | } 79 | return false; 80 | }, 81 | 82 | onTab: (event, { getEditorState, setEditorState }) => { 83 | const editorState = getEditorState(); 84 | const newState = RichUtils.onTab(event, editorState, MAX_LIST_DEPTH); 85 | 86 | if (newState !== editorState) { 87 | setEditorState(newState); 88 | } 89 | }, 90 | 91 | onChange: (newState) => store.onChange(newState) 92 | }; 93 | 94 | INLINE_STYLES.forEach((inlineStyle) => { 95 | configured[`${inlineStyle.label}Button`] = decorateComponentWithProps( 96 | StyleButton, { 97 | store, 98 | bindToState: store.bindToState.bind(store), 99 | label: inlineStyle.label, 100 | inlineStyle: inlineStyle.style 101 | } 102 | ); 103 | }); 104 | 105 | BLOCK_TYPES.forEach((blockType) => { 106 | configured[`${blockType.label}Button`] = decorateComponentWithProps( 107 | BlockButton, { 108 | store, 109 | bindToState: store.bindToState.bind(store), 110 | label: blockType.label, 111 | blockType: blockType.style 112 | } 113 | ); 114 | }); 115 | 116 | configured.createBlockButton = ({type, label}) => decorateComponentWithProps( 117 | BlockButton, { 118 | store, 119 | bindToState: store.bindToState.bind(store), 120 | label: label, 121 | blockType: type 122 | } 123 | ); 124 | 125 | configured.createStyleButton = ({style, label}) => decorateComponentWithProps( 126 | StyleButton, { 127 | store, 128 | bindToState: store.bindToState.bind(store), 129 | label: label, 130 | inlineStyle: style 131 | } 132 | ); 133 | 134 | return configured; 135 | }; 136 | 137 | export default richButtonsPlugin; 138 | --------------------------------------------------------------------------------