├── .gitignore ├── LICENSE ├── README.md ├── examples ├── .babelrc ├── bundle.js ├── components │ ├── App.js │ ├── Input.js │ ├── Items.js │ └── Tab.js ├── index.html ├── main.js ├── package.json ├── webpack.config.js └── yarn.lock ├── images ├── ReactDOM-10000-items.png ├── ReactDOM.png ├── ReactDOMFiber-10000-items-async.png ├── ReactDOMFiber-10000-items-sync.png ├── ReactDOMFiber-call-tree.png └── ReactDOMFiber.png └── toy-renderers ├── .babelrc ├── ReactConsole.js ├── ReactVoice.js ├── console.js ├── package-lock.json ├── package.json └── voice.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Toru Kobayashi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Fiber resources [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md#pull-requests) 2 | 3 | This is a repository for resources about React Fiber. 4 | 5 | React Fiber is a new React reconciliation algorithm, which started using from v16. React Fiber makes many features like Suspense and Concurrent Mode possible. 6 | 7 | Concurrent Mode is still in experimental stage, but React already has the documentation so you can see what Concurrent Mode makes possible at the documentation. 8 | 9 | https://reactjs.org/docs/concurrent-mode-intro.html 10 | 11 | ## React internal algorithm 12 | 13 | If you are not familiar with React internals, I recommend you reading the documentations first, which are very helpful resources. 14 | 15 | * [Codebase Overview](https://reactjs.org/docs/codebase-overview.html) 16 | * [Implementation Notes](https://reactjs.org/docs/implementation-notes.html) 17 | 18 | ## React Fiber 19 | 20 | * [ReactFiber](https://github.com/facebook/react/tree/master/packages/react-reconciler/src) 21 | * [ReactFiberDOM](https://github.com/facebook/react/blob/master/packages/react-dom/src/client/ReactDOM.js) 22 | * [Fiber Debugger](http://fiber-debugger.surge.sh/) 23 | 24 | ## Articles & Slides 25 | 26 | * [React Fiber Architecture](https://github.com/acdlite/react-fiber-architecture) 27 | * [Fiber Principles: Contributing To Fiber #7942](https://github.com/facebook/react/issues/7942) 28 | * [How React Fiber Works](https://www.facebook.com/groups/2003630259862046/permalink/2054053404819731/) 29 | * [React Internals](https://zackargyle.github.io/react-internals-slides/) 30 | * [Capability of React Fiber](https://speakerdeck.com/koba04/capability-of-react-fiber) 31 | * [A look inside React Fiber - how work will get done](http://makersden.io/blog/look-inside-fiber/) 32 | * [Build your own React Fiber](https://engineering.hexacta.com/didact-fiber-incremental-reconciliation-b2fe028dcaec) 33 | * [Algorithms in React](https://speakerdeck.com/koba04/algorithms-in-react) 34 | * [Implementation notes on react's scheduling model as of (shortly before) 16.8.0](https://gist.github.com/Jessidhia/49d0915b7e722dc5b49ab9779b5906e8) 35 | 36 | ## Videos 37 | 38 | * [Dan Abramov: Beyond React 16](https://reactjs.org/blog/2018/03/01/sneak-peek-beyond-react-16.html) 39 | * [Andrew Clark: Roadmap for React Fiber and Beyond](https://www.youtube.com/watch?v=QW5TE4vrklU) 40 | * [The Evolution of React and GraphQL at Facebook and Beyond](https://developers.facebook.com/videos/f8-2017/the-evolution-of-react-and-graphql-at-facebook-and-beyond/) 41 | * [Lin Clark - A Cartoon Intro to Fiber - React Conf 2017](https://www.youtube.com/watch?v=ZCuYPiUIONs) 42 | * [Sebastian Markbåge - React Performance End to End (React Fiber)](https://www.youtube.com/watch?v=bvFpe5j9-zQ) 43 | * [Andrew Clark: What's Next for React — ReactNext 2016](https://www.youtube.com/watch?v=aV1271hd9ew) 44 | * [Why, What, and How of React Fiber with Dan Abramov and Andrew Clark](https://www.youtube.com/watch?v=crM1iRVGpGQ) 45 | * [A tiny Fiber renderer](https://www.youtube.com/watch?v=U9zFfIww3Go) 46 | 47 | ## React Fiber function call stacks 48 | 49 | **[Note]** React Fiber now behaves as synchronous by default. See [#8127](https://github.com/facebook/react/pull/8127). 50 | This call stacks are results in the time when it behaved as asynchronous. 51 | 52 | ### ReactDOMFiber 53 | 54 | ![React Fiber function call stack](./images/ReactDOMFiber.png) 55 | 56 | ### ReactDOM 57 | 58 | ![ReactDOM function call stack](./images/ReactDOM.png) 59 | 60 | ### ReactDOMFiber with 10000 items (Async Scheduling) 61 | 62 | ![React Fiber function call stack with 10000 items (async)](./images/ReactDOMFiber-10000-items-async.png) 63 | 64 | ``` 65 | --- working asynchronously --------------------------------------------------------------------------- 66 | | ------- Fiber --------------- ------- Fiber --------------- ------ Fiber --------------- | 67 | | | beginWork -> completeWork | -> | beginWork -> completeWork | -> |beginWork -> completeWork | ... | 68 | | ----------------------------- ------------------------------ ---------------------------- | 69 | ------------------------------------------------------------------------------------------------------ 70 | ↓↓↓ 71 | ----------------------------------------------------------------------- 72 | | commitAllWork(flush side effects computed in the above to the host) | 73 | ----------------------------------------------------------------------- 74 | ``` 75 | 76 | ### ReactDOMFiber with 10000 items (Sync Scheduling) 77 | 78 | ![React Fiber function call stack with 10000 items (sync)](./images/ReactDOMFiber-10000-items-sync.png) 79 | 80 | ### ReactDOM with 10000 items 81 | 82 | ![ReactDOMFiber function call stack with 10000 items](./images/ReactDOM-10000-items.png) 83 | 84 | ## React Fiber call tree 85 | 86 | ![ReactDOMFiber call tree](./images/ReactDOMFiber-call-tree.png) 87 | 88 | ## Related Words 89 | 90 | * [Fiber](https://en.wikipedia.org/wiki/Fiber_(computer_science)) 91 | * [Call Stack](https://en.wikipedia.org/wiki/Call_stack) 92 | * [Coroutine](https://en.wikipedia.org/wiki/Coroutine) 93 | * [Continuation](https://en.wikipedia.org/wiki/Continuation) 94 | * Algebraic Effects 95 | * [One-shot Delimited Continuations with Effect Handlers](https://esdiscuss.org/topic/one-shot-delimited-continuations-with-effect-handlers) 96 | * [Effective Concurrency with Algebraic Effects](http://kcsrk.info/ocaml/multicore/2015/05/20/effects-multicore/) 97 | * [Concurrent & Multicore OCaml: A deep dive](http://kcsrk.info/slides/multicore_fb16.pdf) 98 | 99 | ## Custom Renderer Interface 100 | 101 | React doesn't depend on any specific environments like DOM and React provides us a way to create own custom renderers based on Fiber reconciliation. ReactDOM and ReactNative are implemented as one of the custom renderers. 102 | 103 | I've presented about the custom renderer; here is the link to the slide. 104 | 105 | * https://speakerdeck.com/koba04/make-it-declarative-with-react 106 | * https://github.com/koba04/jsconf-jp-presentation 107 | 108 | The following is a custom renderer named `react-fs`, which is a renderer for `fs` package 109 | 110 | ```js 111 | const React = require('react'); 112 | const { ReactFS } = require('@koba04/react-fs'); 113 | 114 | const targetDir = "test-react-fs-project"; 115 | ReactFS.render( 116 | <> 117 | 118 | # Title 119 | 120 | 121 | 122 | console.log("Hello"); 123 | 124 | 125 | , 126 | targetDir 127 | ); 128 | ``` 129 | 130 | ## ReactNoop 131 | 132 | ReactNoop is a renderer for React Fiber, which is using for testing and debugging. 133 | It is very useful to understand React Fiber renderer!! :eyes: 134 | 135 | * https://github.com/facebook/react/tree/master/packages/react-noop-renderer 136 | -------------------------------------------------------------------------------- /examples/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-react"] 3 | } 4 | -------------------------------------------------------------------------------- /examples/components/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | 4 | import Tab from './Tab'; 5 | import Input from './Input'; 6 | import Items from './Items'; 7 | 8 | export default class App extends React.Component { 9 | constructor(props) { 10 | super(props); 11 | this.state = { 12 | isAsync: true, 13 | text: '', 14 | items: [...new Array(5000)].map((_, i) => ({index: i, name: `item:${i}`, value: i})) 15 | } 16 | } 17 | syncUpdate(fn, cb) { 18 | ReactDOM.flushSync(() => { 19 | this.setState(fn, cb); 20 | }); 21 | } 22 | tick() { 23 | this.setState( 24 | state => ({ 25 | count: state.count + 1, 26 | items: state.items.map(item => Object.assign({}, item, {name: `item:${item.value + 1}`, value: item.value + 1})), 27 | }), 28 | () => { 29 | this.timerId = setTimeout(() => { 30 | this.state.isAsync ? this.tick() : ReactDOM.flushSync(() => this.tick()); 31 | }, 100); 32 | } 33 | ); 34 | } 35 | componentDidMount() { 36 | this.tick(); 37 | } 38 | componentWillUnmount() { 39 | if (this.timerId) { 40 | clearTimeout(this.timerId); 41 | } 42 | } 43 | render() { 44 | const {isAsync, text, count, items} = this.state; 45 | return ( 46 |
47 |

React Fiber Time Slicing Sample

48 |

You can switch a rendering mode to Async or Sync.

49 |

Please try to input text and switch the mode.

50 |

If you can't get any diferrence between Async mode and Sync mode, you should use CPU throttling on DevTools

51 | this.setState(() => ({isAsync: value, text: ''}))} 54 | /> 55 |

Rendering a text input as sync priority

56 | this.syncUpdate(() => ({text: value}))} /> 57 |

Rendering {items.length}items as {isAsync ? 'low' : 'sync'} priority

58 | 59 |
60 | ); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /examples/components/Input.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const style = { 4 | input: { 5 | fontSize: '1.5rem', 6 | lineHeight: 1.2, 7 | width: '90%', 8 | padding: 5, 9 | backgroundColor: '#fafafa' 10 | } 11 | } 12 | 13 | const Input = ({value, onChange}) => ( 14 |
15 | onChange(e.target.value)} 20 | placeholder="please input text" 21 | /> 22 |

{value}

23 |
24 | ); 25 | export default Input; 26 | -------------------------------------------------------------------------------- /examples/components/Items.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class Items extends React.PureComponent { 4 | render() { 5 | return ( 6 | 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /examples/components/Tab.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const style = { 4 | tab: { 5 | padding: 0, 6 | listStyle: 'none', 7 | display: 'flex', 8 | height: 100, 9 | }, 10 | content: { 11 | flex: 1, 12 | textAlign: 'center', 13 | padding: 'auto', 14 | backgroundColor: '#eee', 15 | color: 'black', 16 | borderRadius: 3, 17 | fontSize: '1.2rem', 18 | paddingTop: 40, 19 | }, 20 | active: { 21 | backgroundColor: 'tomato', 22 | color: '#fff', 23 | }, 24 | }; 25 | 26 | const Tab = ({isAsync, onClick}) => ( 27 | 41 | ); 42 | export default Tab; 43 | -------------------------------------------------------------------------------- /examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | React Fiber Time Slicing Sample 5 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /examples/main.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | 4 | import App from './components/App'; 5 | 6 | const AsyncMode = React.unstable_AsyncMode; 7 | 8 | ReactDOM.render( 9 | 10 | 11 | , 12 | document.getElementById('app') 13 | ); 14 | -------------------------------------------------------------------------------- /examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-fiber-examples", 3 | "version": "1.0.0", 4 | "description": "Resources for ReactFiber", 5 | "main": "app.js", 6 | "scripts": { 7 | "build": "webpack", 8 | "start": "webpack-dev-server", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": ["react", "react-fiber"], 12 | "author": "koba04", 13 | "license": "MIT", 14 | "dependencies": { 15 | "react": "^16.3.0-alpha.2", 16 | "react-dom": "^16.3.0-alpha.2" 17 | }, 18 | "devDependencies": { 19 | "@babel/core": "^7.0.0-beta.42", 20 | "@babel/preset-react": "^7.0.0-beta.42", 21 | "babel-loader": "^8.0.0-beta.2", 22 | "webpack": "^4.1.1", 23 | "webpack-cli": "^2.0.12", 24 | "webpack-dev-server": "^3.1.1" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | module.exports = { 3 | mode: 'development', 4 | entry: './main.js', 5 | output: { 6 | filename: 'bundle.js', 7 | path: path.resolve(__dirname), 8 | }, 9 | module: { 10 | rules: [ 11 | { 12 | test: /\.js$/, 13 | use: 'babel-loader', 14 | exclude: /node_modules/, 15 | } 16 | ] 17 | }, 18 | devServer: { 19 | contentBase: path.resolve(__dirname), 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /images/ReactDOM-10000-items.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koba04/react-fiber-resources/1c5124b859d5c58b2b48bae8bf685b988b4063c4/images/ReactDOM-10000-items.png -------------------------------------------------------------------------------- /images/ReactDOM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koba04/react-fiber-resources/1c5124b859d5c58b2b48bae8bf685b988b4063c4/images/ReactDOM.png -------------------------------------------------------------------------------- /images/ReactDOMFiber-10000-items-async.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koba04/react-fiber-resources/1c5124b859d5c58b2b48bae8bf685b988b4063c4/images/ReactDOMFiber-10000-items-async.png -------------------------------------------------------------------------------- /images/ReactDOMFiber-10000-items-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koba04/react-fiber-resources/1c5124b859d5c58b2b48bae8bf685b988b4063c4/images/ReactDOMFiber-10000-items-sync.png -------------------------------------------------------------------------------- /images/ReactDOMFiber-call-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koba04/react-fiber-resources/1c5124b859d5c58b2b48bae8bf685b988b4063c4/images/ReactDOMFiber-call-tree.png -------------------------------------------------------------------------------- /images/ReactDOMFiber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koba04/react-fiber-resources/1c5124b859d5c58b2b48bae8bf685b988b4063c4/images/ReactDOMFiber.png -------------------------------------------------------------------------------- /toy-renderers/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-react"] 3 | } 4 | -------------------------------------------------------------------------------- /toy-renderers/ReactConsole.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Reconciler = require('react-reconciler'); 4 | const colors = require('colors/safe'); 5 | 6 | const sideEffect = (method, text) => console.log(colors[method](text)); 7 | 8 | const ConsoleRenderer = Reconciler({ 9 | getRootHostContext() { 10 | return {}; 11 | }, 12 | 13 | getChildHostContext() { 14 | return {}; 15 | }, 16 | 17 | getPublicInstance(instance) { 18 | return null; 19 | }, 20 | 21 | createInstance(type, props) { 22 | return {}; 23 | }, 24 | 25 | appendInitialChild(parentInstance, child) {}, 26 | 27 | finalizeInitialChildren(host, type, props) { 28 | if (typeof props.children === 'string') { 29 | sideEffect(type, props.children); 30 | } 31 | return false; 32 | }, 33 | 34 | prepareUpdate(instance, type, oldProps, newProps) { 35 | return {}; 36 | }, 37 | 38 | shouldSetTextContent(type, props) {}, 39 | shouldDeprioritizeSubtree(type, props) {}, 40 | 41 | createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {}, 42 | 43 | useSyncScheduling: true, 44 | 45 | scheduleDeferredCallback(cb) {}, 46 | cancelDeferredCallback() {}, 47 | 48 | prepareForCommit() {}, 49 | resetAfterCommit() {}, 50 | 51 | now() { return Date.now() }, 52 | 53 | mutation: { 54 | commitUpdate(instance, updatePayload, type, oldProps, newProps) { 55 | if (typeof newProps.children === 'string') { 56 | if (newProps.children !== oldProps.children) { 57 | sideEffect(type, newProps.children); 58 | } 59 | } 60 | }, 61 | commitMount(instance, type, newProps) {}, 62 | commitTextUpdate(textInstance, oldText, newText) {}, 63 | resetTextContent(instance) {}, 64 | appendChild(parentInstance, child) {}, 65 | appendChildToContainer(parentInstance, child) {}, 66 | insertBefore(parentInstance, child, beforeChild) {}, 67 | insertInContainerBefore(container, child, beforeChild) {}, 68 | removeChild(parentInstance, child) {}, 69 | removeChildFromContainer(container, child) {}, 70 | }, 71 | }); 72 | 73 | let root; 74 | const ReactConsole = { 75 | render(element, callback) { 76 | if (!root) { 77 | const container = {}; 78 | root = ConsoleRenderer.createContainer(container); 79 | } 80 | ConsoleRenderer.updateContainer(element, root, null, callback); 81 | }, 82 | }; 83 | 84 | module.exports = ReactConsole; 85 | -------------------------------------------------------------------------------- /toy-renderers/ReactVoice.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const Reconciler = require('react-reconciler'); 4 | const {spawnSync} = require('child_process'); 5 | 6 | const sideEffect = (method, text) => spawnSync('say', ['-v', method, text]); 7 | 8 | const VoiceRenderer = Reconciler({ 9 | getRootHostContext() { 10 | return {}; 11 | }, 12 | 13 | getChildHostContext() { 14 | return {}; 15 | }, 16 | 17 | getPublicInstance(instance) { 18 | return null; 19 | }, 20 | 21 | createInstance(type, props) { 22 | return {}; 23 | }, 24 | 25 | appendInitialChild(parentInstance, child) {}, 26 | 27 | finalizeInitialChildren(host, type, props) { 28 | if (typeof props.children === 'string') { 29 | sideEffect(type, props.children); 30 | } 31 | return false; 32 | }, 33 | 34 | prepareUpdate(instance, type, oldProps, newProps) { 35 | return {}; 36 | }, 37 | 38 | shouldSetTextContent(type, props) {}, 39 | shouldDeprioritizeSubtree(type, props) {}, 40 | 41 | createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {}, 42 | 43 | useSyncScheduling: true, 44 | 45 | scheduleDeferredCallback(cb) {}, 46 | cancelDeferredCallback() {}, 47 | 48 | prepareForCommit() {}, 49 | resetAfterCommit() {}, 50 | 51 | now() { return Date.now() }, 52 | 53 | mutation: { 54 | commitUpdate(instance, updatePayload, type, oldProps, newProps) { 55 | if (typeof newProps.children === 'string') { 56 | if (newProps.children !== oldProps.children) { 57 | sideEffect(type, newProps.children); 58 | } 59 | } 60 | }, 61 | commitMount(instance, type, newProps) {}, 62 | commitTextUpdate(textInstance, oldText, newText) {}, 63 | resetTextContent(instance) {}, 64 | appendChild(parentInstance, child) {}, 65 | appendChildToContainer(parentInstance, child) {}, 66 | insertBefore(parentInstance, child, beforeChild) {}, 67 | insertInContainerBefore(container, child, beforeChild) {}, 68 | removeChild(parentInstance, child) {}, 69 | removeChildFromContainer(container, child) {}, 70 | }, 71 | }); 72 | 73 | let root; 74 | const ReactVoice = { 75 | render(element, callback) { 76 | if (!root) { 77 | const container = {}; 78 | root = VoiceRenderer.createContainer(container); 79 | } 80 | VoiceRenderer.updateContainer(element, root, null, callback); 81 | }, 82 | }; 83 | 84 | module.exports = ReactVoice; 85 | -------------------------------------------------------------------------------- /toy-renderers/console.js: -------------------------------------------------------------------------------- 1 | const React = require('react'); 2 | const ReactConsole = require('./ReactConsole'); 3 | const colors = require('colors/safe'); 4 | 5 | ReactConsole.render( 6 | <> 7 | Hello 8 | World 9 | React 10 | Custom Renderer! 11 | , 12 | () => console.log(colors.inverse('##### Update ######')) 13 | ); 14 | 15 | ReactConsole.render( 16 | <> 17 | Hello 18 | World2 19 | React 20 | 21 | ); 22 | -------------------------------------------------------------------------------- /toy-renderers/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "toy-renderers", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0-beta.39", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.39.tgz", 10 | "integrity": "sha512-PConL+YIK9BgNUWWC2q4fbltj1g475TofpNVNivSypcAAKElfpSS1cv7MrpLYRG8TzZvwcVu9M30hLA/WAp1HQ==", 11 | "dev": true, 12 | "requires": { 13 | "chalk": "2.3.0", 14 | "esutils": "2.0.2", 15 | "js-tokens": "3.0.2" 16 | } 17 | }, 18 | "@babel/core": { 19 | "version": "7.0.0-beta.39", 20 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.39.tgz", 21 | "integrity": "sha512-hYqbFuzkhj81kpeH/0s2VDRyzKcGAvDMUjtyfSgZMXsL0h8qNMp9nOx7NakzSErIt/LW/KQFyo7LbeIR0JKDNQ==", 22 | "dev": true, 23 | "requires": { 24 | "@babel/code-frame": "7.0.0-beta.39", 25 | "@babel/generator": "7.0.0-beta.39", 26 | "@babel/helpers": "7.0.0-beta.39", 27 | "@babel/template": "7.0.0-beta.39", 28 | "@babel/traverse": "7.0.0-beta.39", 29 | "@babel/types": "7.0.0-beta.39", 30 | "babylon": "7.0.0-beta.39", 31 | "convert-source-map": "1.5.1", 32 | "debug": "3.1.0", 33 | "json5": "0.5.1", 34 | "lodash": "4.17.5", 35 | "micromatch": "2.3.11", 36 | "resolve": "1.5.0", 37 | "source-map": "0.5.7" 38 | } 39 | }, 40 | "@babel/generator": { 41 | "version": "7.0.0-beta.39", 42 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.39.tgz", 43 | "integrity": "sha512-fjKbJxdvzmTxpZPDrXxSMrzzJ+qUEjVNXmJuXwMTupPVBAIr13EGE+VauHXp/14AcXAXqX1/XvFK9cf/tB3OMA==", 44 | "dev": true, 45 | "requires": { 46 | "@babel/types": "7.0.0-beta.39", 47 | "jsesc": "2.5.1", 48 | "lodash": "4.17.5", 49 | "source-map": "0.5.7", 50 | "trim-right": "1.0.1" 51 | } 52 | }, 53 | "@babel/helper-builder-react-jsx": { 54 | "version": "7.0.0-beta.39", 55 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0-beta.39.tgz", 56 | "integrity": "sha512-2HT/2DkgOgsOUQcSNeH29tOi4To6d2xofBisVhNysTbFMVnxllNJsgTholcD5za9Yk4VDZyVeOEVLQLmm/wpBw==", 57 | "requires": { 58 | "@babel/types": "7.0.0-beta.39", 59 | "esutils": "2.0.2" 60 | } 61 | }, 62 | "@babel/helper-function-name": { 63 | "version": "7.0.0-beta.39", 64 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.39.tgz", 65 | "integrity": "sha512-pxxwRka5meE13lBtwzuzYBRIZV/aPgp41aGWP2IMopHebCogOZUSNX0knwiEduyXtRsWlW/laewGwI+TV60xAw==", 66 | "dev": true, 67 | "requires": { 68 | "@babel/helper-get-function-arity": "7.0.0-beta.39", 69 | "@babel/template": "7.0.0-beta.39", 70 | "@babel/types": "7.0.0-beta.39" 71 | } 72 | }, 73 | "@babel/helper-get-function-arity": { 74 | "version": "7.0.0-beta.39", 75 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.39.tgz", 76 | "integrity": "sha512-OgtkcyBS8BtKItdb+NHoPBZGhlpJJkSFj0unfKH6/fwibcgCoC5CbuSiP/y8BT264hdQKXpw/QSt8WxYcUgMXA==", 77 | "dev": true, 78 | "requires": { 79 | "@babel/types": "7.0.0-beta.39" 80 | } 81 | }, 82 | "@babel/helpers": { 83 | "version": "7.0.0-beta.39", 84 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.39.tgz", 85 | "integrity": "sha512-lhi9xvTcTIpv/m/T/T6aa10e0V0lxaN+zFFh61cEseYlqqlt1rZ2rYQ+zpZVfIyL8enDwz+zZMBKOOkyskDdlQ==", 86 | "dev": true, 87 | "requires": { 88 | "@babel/template": "7.0.0-beta.39", 89 | "@babel/traverse": "7.0.0-beta.39", 90 | "@babel/types": "7.0.0-beta.39" 91 | } 92 | }, 93 | "@babel/node": { 94 | "version": "7.0.0-beta.39", 95 | "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.0.0-beta.39.tgz", 96 | "integrity": "sha512-PKaN0JIMETLXQnamHb5oa9D7i5qdH6dROehIxobFwf8BHucUsjCp3DvjkZ/m98ojOHIyOKdcCudryvciO6yBvw==", 97 | "requires": { 98 | "@babel/polyfill": "7.0.0-beta.39", 99 | "@babel/register": "7.0.0-beta.39", 100 | "commander": "2.13.0", 101 | "fs-readdir-recursive": "1.1.0", 102 | "lodash": "4.17.5", 103 | "output-file-sync": "2.0.0", 104 | "v8flags": "3.0.1" 105 | } 106 | }, 107 | "@babel/plugin-syntax-jsx": { 108 | "version": "7.0.0-beta.39", 109 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0-beta.39.tgz", 110 | "integrity": "sha512-Ir49hnpnyDTz/RlTStks6FTihjNarSOp8jdutwU2yFgBTWFM1OnRgIZV8gVhZjinZDGc6UGdVTr03QtgLwW4bA==" 111 | }, 112 | "@babel/plugin-transform-react-display-name": { 113 | "version": "7.0.0-beta.39", 114 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0-beta.39.tgz", 115 | "integrity": "sha512-qnVsLdKLvSNMuJD2pQwR35j8CtwY31TkoCusReZFFXKMKV+2dGwZ9lntI7yHTxFijsOY0ziWjO6MPhFAtklgtA==" 116 | }, 117 | "@babel/plugin-transform-react-jsx": { 118 | "version": "7.0.0-beta.39", 119 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0-beta.39.tgz", 120 | "integrity": "sha512-OA8PKBLfdmSwLdJ1Tx2bV35MXnMEiDZNXqgKZMpIoz1HDY3ShQbdev8hgtzCgJDu4M0/xx3c1skgAfN+hluSvg==", 121 | "requires": { 122 | "@babel/helper-builder-react-jsx": "7.0.0-beta.39", 123 | "@babel/plugin-syntax-jsx": "7.0.0-beta.39" 124 | } 125 | }, 126 | "@babel/plugin-transform-react-jsx-self": { 127 | "version": "7.0.0-beta.39", 128 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0-beta.39.tgz", 129 | "integrity": "sha512-dA85ufk2NFpJMy6ms1I6JB4jgtmz4SvIJ1YBAtBX4pEjXvTnY09qo4P46cf1CuXdpc8UXIy7nuUrgWgTDn6kLQ==", 130 | "requires": { 131 | "@babel/plugin-syntax-jsx": "7.0.0-beta.39" 132 | } 133 | }, 134 | "@babel/plugin-transform-react-jsx-source": { 135 | "version": "7.0.0-beta.39", 136 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0-beta.39.tgz", 137 | "integrity": "sha512-yYXrja2peiPWWnIzH7CmdsZkDuPtPF0Wv1HOOKIOE1fXwceMtef4eXOgD1mUo/eY3vsgJO2nTc1W+k5/1XrppQ==", 138 | "requires": { 139 | "@babel/plugin-syntax-jsx": "7.0.0-beta.39" 140 | } 141 | }, 142 | "@babel/polyfill": { 143 | "version": "7.0.0-beta.39", 144 | "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0-beta.39.tgz", 145 | "integrity": "sha512-tnvhzReuEr3s/FpEiruCZO/dXUBV8iIyV2AV9DCXIOcnA9YG2hkyJMgqAA2deC7Z4UVF0UN3R6+kZVpzox/RUg==", 146 | "requires": { 147 | "core-js": "2.5.3", 148 | "regenerator-runtime": "0.11.1" 149 | }, 150 | "dependencies": { 151 | "core-js": { 152 | "version": "2.5.3", 153 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", 154 | "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" 155 | } 156 | } 157 | }, 158 | "@babel/preset-react": { 159 | "version": "7.0.0-beta.39", 160 | "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0-beta.39.tgz", 161 | "integrity": "sha512-XDOeRVO/qxJrfN4fQXzeUUgLujQTxoHzIUP63phg5KB/avnd03H4TiKNgTBol4X6IvS7z/9/p6SECM5mKH5ZUA==", 162 | "requires": { 163 | "@babel/plugin-syntax-jsx": "7.0.0-beta.39", 164 | "@babel/plugin-transform-react-display-name": "7.0.0-beta.39", 165 | "@babel/plugin-transform-react-jsx": "7.0.0-beta.39", 166 | "@babel/plugin-transform-react-jsx-self": "7.0.0-beta.39", 167 | "@babel/plugin-transform-react-jsx-source": "7.0.0-beta.39" 168 | } 169 | }, 170 | "@babel/register": { 171 | "version": "7.0.0-beta.39", 172 | "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.0.0-beta.39.tgz", 173 | "integrity": "sha512-nipN2qZVT+hPlfaWaOLw3GqQLvNKUovj2ckdipffy2jJtE01uInVqZ52daiAkUGAi51l/LLmrr7+XRGlhx1zDA==", 174 | "requires": { 175 | "core-js": "2.5.3", 176 | "find-cache-dir": "1.0.0", 177 | "home-or-tmp": "3.0.0", 178 | "lodash": "4.17.5", 179 | "mkdirp": "0.5.1", 180 | "pirates": "3.0.2", 181 | "source-map-support": "0.4.18" 182 | }, 183 | "dependencies": { 184 | "core-js": { 185 | "version": "2.5.3", 186 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", 187 | "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" 188 | } 189 | } 190 | }, 191 | "@babel/template": { 192 | "version": "7.0.0-beta.39", 193 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.39.tgz", 194 | "integrity": "sha512-EDVszuqo0ZtNeC6j0yFrWIW1Sh5v+pv0POnj1xjPHy6gsg1U5IYjcc6uVarFgTCmtWsjFB5KSRqxC7N+YYcwCQ==", 195 | "dev": true, 196 | "requires": { 197 | "@babel/code-frame": "7.0.0-beta.39", 198 | "@babel/types": "7.0.0-beta.39", 199 | "babylon": "7.0.0-beta.39", 200 | "lodash": "4.17.5" 201 | } 202 | }, 203 | "@babel/traverse": { 204 | "version": "7.0.0-beta.39", 205 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.39.tgz", 206 | "integrity": "sha512-L/MFJCUTiiK4wAN2nCEEc67yYm5fMtsVtWOizCHgPi45iYeqI3Zp7mL5RMrLqd7cCn6WpsLWVHuCGhDyDIONjQ==", 207 | "dev": true, 208 | "requires": { 209 | "@babel/code-frame": "7.0.0-beta.39", 210 | "@babel/generator": "7.0.0-beta.39", 211 | "@babel/helper-function-name": "7.0.0-beta.39", 212 | "@babel/types": "7.0.0-beta.39", 213 | "babylon": "7.0.0-beta.39", 214 | "debug": "3.1.0", 215 | "globals": "11.3.0", 216 | "invariant": "2.2.2", 217 | "lodash": "4.17.5" 218 | } 219 | }, 220 | "@babel/types": { 221 | "version": "7.0.0-beta.39", 222 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.39.tgz", 223 | "integrity": "sha512-wrEe0z4kFP0KbFz8aHbPOGQal0gn+J2Iv9ZJGYbD77JN4BpavbF5l/BvLNZ0Omn665VENncoLVmQpclMbh64sQ==", 224 | "requires": { 225 | "esutils": "2.0.2", 226 | "lodash": "4.17.5", 227 | "to-fast-properties": "2.0.0" 228 | } 229 | }, 230 | "ansi-styles": { 231 | "version": "3.2.0", 232 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 233 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 234 | "dev": true, 235 | "requires": { 236 | "color-convert": "1.9.1" 237 | } 238 | }, 239 | "arr-diff": { 240 | "version": "2.0.0", 241 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 242 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 243 | "dev": true, 244 | "requires": { 245 | "arr-flatten": "1.1.0" 246 | } 247 | }, 248 | "arr-flatten": { 249 | "version": "1.1.0", 250 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 251 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 252 | "dev": true 253 | }, 254 | "array-unique": { 255 | "version": "0.2.1", 256 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 257 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 258 | "dev": true 259 | }, 260 | "asap": { 261 | "version": "2.0.6", 262 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 263 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 264 | }, 265 | "babylon": { 266 | "version": "7.0.0-beta.39", 267 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.39.tgz", 268 | "integrity": "sha512-ojkbli5jOr5oxSdXoRNV1vf8q+73fk7N54tcd86Dhxe72eudwoFv1uB5/ofxdnj9LtMeTtVPrMyaUo8FpCpE3Q==", 269 | "dev": true 270 | }, 271 | "braces": { 272 | "version": "1.8.5", 273 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 274 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 275 | "dev": true, 276 | "requires": { 277 | "expand-range": "1.8.2", 278 | "preserve": "0.2.0", 279 | "repeat-element": "1.1.2" 280 | } 281 | }, 282 | "chalk": { 283 | "version": "2.3.0", 284 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", 285 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", 286 | "dev": true, 287 | "requires": { 288 | "ansi-styles": "3.2.0", 289 | "escape-string-regexp": "1.0.5", 290 | "supports-color": "4.5.0" 291 | } 292 | }, 293 | "color-convert": { 294 | "version": "1.9.1", 295 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 296 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 297 | "dev": true, 298 | "requires": { 299 | "color-name": "1.1.3" 300 | } 301 | }, 302 | "color-name": { 303 | "version": "1.1.3", 304 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 305 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 306 | "dev": true 307 | }, 308 | "colors": { 309 | "version": "1.1.2", 310 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 311 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" 312 | }, 313 | "commander": { 314 | "version": "2.13.0", 315 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", 316 | "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" 317 | }, 318 | "commondir": { 319 | "version": "1.0.1", 320 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 321 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" 322 | }, 323 | "convert-source-map": { 324 | "version": "1.5.1", 325 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", 326 | "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", 327 | "dev": true 328 | }, 329 | "core-js": { 330 | "version": "1.2.7", 331 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 332 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" 333 | }, 334 | "debug": { 335 | "version": "3.1.0", 336 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 337 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 338 | "dev": true, 339 | "requires": { 340 | "ms": "2.0.0" 341 | } 342 | }, 343 | "encoding": { 344 | "version": "0.1.12", 345 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 346 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 347 | "requires": { 348 | "iconv-lite": "0.4.19" 349 | } 350 | }, 351 | "escape-string-regexp": { 352 | "version": "1.0.5", 353 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 354 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 355 | "dev": true 356 | }, 357 | "esutils": { 358 | "version": "2.0.2", 359 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 360 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 361 | }, 362 | "expand-brackets": { 363 | "version": "0.1.5", 364 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 365 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 366 | "dev": true, 367 | "requires": { 368 | "is-posix-bracket": "0.1.1" 369 | } 370 | }, 371 | "expand-range": { 372 | "version": "1.8.2", 373 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 374 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 375 | "dev": true, 376 | "requires": { 377 | "fill-range": "2.2.3" 378 | } 379 | }, 380 | "extglob": { 381 | "version": "0.3.2", 382 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 383 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 384 | "dev": true, 385 | "requires": { 386 | "is-extglob": "1.0.0" 387 | } 388 | }, 389 | "fbjs": { 390 | "version": "0.8.16", 391 | "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", 392 | "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", 393 | "requires": { 394 | "core-js": "1.2.7", 395 | "isomorphic-fetch": "2.2.1", 396 | "loose-envify": "1.3.1", 397 | "object-assign": "4.1.1", 398 | "promise": "7.3.1", 399 | "setimmediate": "1.0.5", 400 | "ua-parser-js": "0.7.17" 401 | } 402 | }, 403 | "filename-regex": { 404 | "version": "2.0.1", 405 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 406 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 407 | "dev": true 408 | }, 409 | "fill-range": { 410 | "version": "2.2.3", 411 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 412 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 413 | "dev": true, 414 | "requires": { 415 | "is-number": "2.1.0", 416 | "isobject": "2.1.0", 417 | "randomatic": "1.1.7", 418 | "repeat-element": "1.1.2", 419 | "repeat-string": "1.6.1" 420 | } 421 | }, 422 | "find-cache-dir": { 423 | "version": "1.0.0", 424 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", 425 | "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", 426 | "requires": { 427 | "commondir": "1.0.1", 428 | "make-dir": "1.1.0", 429 | "pkg-dir": "2.0.0" 430 | } 431 | }, 432 | "find-up": { 433 | "version": "2.1.0", 434 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 435 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 436 | "requires": { 437 | "locate-path": "2.0.0" 438 | } 439 | }, 440 | "for-in": { 441 | "version": "1.0.2", 442 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 443 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 444 | "dev": true 445 | }, 446 | "for-own": { 447 | "version": "0.1.5", 448 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 449 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 450 | "dev": true, 451 | "requires": { 452 | "for-in": "1.0.2" 453 | } 454 | }, 455 | "fs-readdir-recursive": { 456 | "version": "1.1.0", 457 | "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", 458 | "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" 459 | }, 460 | "glob-base": { 461 | "version": "0.3.0", 462 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 463 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 464 | "dev": true, 465 | "requires": { 466 | "glob-parent": "2.0.0", 467 | "is-glob": "2.0.1" 468 | } 469 | }, 470 | "glob-parent": { 471 | "version": "2.0.0", 472 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 473 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 474 | "dev": true, 475 | "requires": { 476 | "is-glob": "2.0.1" 477 | } 478 | }, 479 | "globals": { 480 | "version": "11.3.0", 481 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", 482 | "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", 483 | "dev": true 484 | }, 485 | "graceful-fs": { 486 | "version": "4.1.11", 487 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 488 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 489 | }, 490 | "has-flag": { 491 | "version": "2.0.0", 492 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 493 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 494 | "dev": true 495 | }, 496 | "home-or-tmp": { 497 | "version": "3.0.0", 498 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-3.0.0.tgz", 499 | "integrity": "sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs=" 500 | }, 501 | "homedir-polyfill": { 502 | "version": "1.0.1", 503 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", 504 | "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", 505 | "requires": { 506 | "parse-passwd": "1.0.0" 507 | } 508 | }, 509 | "iconv-lite": { 510 | "version": "0.4.19", 511 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 512 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 513 | }, 514 | "invariant": { 515 | "version": "2.2.2", 516 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", 517 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", 518 | "dev": true, 519 | "requires": { 520 | "loose-envify": "1.3.1" 521 | } 522 | }, 523 | "is-buffer": { 524 | "version": "1.1.6", 525 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 526 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 527 | "dev": true 528 | }, 529 | "is-dotfile": { 530 | "version": "1.0.3", 531 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 532 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", 533 | "dev": true 534 | }, 535 | "is-equal-shallow": { 536 | "version": "0.1.3", 537 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 538 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 539 | "dev": true, 540 | "requires": { 541 | "is-primitive": "2.0.0" 542 | } 543 | }, 544 | "is-extendable": { 545 | "version": "0.1.1", 546 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 547 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 548 | "dev": true 549 | }, 550 | "is-extglob": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 553 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 554 | "dev": true 555 | }, 556 | "is-glob": { 557 | "version": "2.0.1", 558 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 559 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 560 | "dev": true, 561 | "requires": { 562 | "is-extglob": "1.0.0" 563 | } 564 | }, 565 | "is-number": { 566 | "version": "2.1.0", 567 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 568 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 569 | "dev": true, 570 | "requires": { 571 | "kind-of": "3.2.2" 572 | } 573 | }, 574 | "is-plain-obj": { 575 | "version": "1.1.0", 576 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 577 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 578 | }, 579 | "is-posix-bracket": { 580 | "version": "0.1.1", 581 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 582 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 583 | "dev": true 584 | }, 585 | "is-primitive": { 586 | "version": "2.0.0", 587 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 588 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 589 | "dev": true 590 | }, 591 | "is-stream": { 592 | "version": "1.1.0", 593 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 594 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 595 | }, 596 | "isarray": { 597 | "version": "1.0.0", 598 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 599 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 600 | "dev": true 601 | }, 602 | "isobject": { 603 | "version": "2.1.0", 604 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 605 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 606 | "dev": true, 607 | "requires": { 608 | "isarray": "1.0.0" 609 | } 610 | }, 611 | "isomorphic-fetch": { 612 | "version": "2.2.1", 613 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", 614 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", 615 | "requires": { 616 | "node-fetch": "1.7.3", 617 | "whatwg-fetch": "2.0.3" 618 | } 619 | }, 620 | "js-tokens": { 621 | "version": "3.0.2", 622 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 623 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" 624 | }, 625 | "jsesc": { 626 | "version": "2.5.1", 627 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", 628 | "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", 629 | "dev": true 630 | }, 631 | "json5": { 632 | "version": "0.5.1", 633 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 634 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", 635 | "dev": true 636 | }, 637 | "kind-of": { 638 | "version": "3.2.2", 639 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 640 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 641 | "dev": true, 642 | "requires": { 643 | "is-buffer": "1.1.6" 644 | } 645 | }, 646 | "locate-path": { 647 | "version": "2.0.0", 648 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 649 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 650 | "requires": { 651 | "p-locate": "2.0.0", 652 | "path-exists": "3.0.0" 653 | } 654 | }, 655 | "lodash": { 656 | "version": "4.17.5", 657 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 658 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" 659 | }, 660 | "loose-envify": { 661 | "version": "1.3.1", 662 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 663 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", 664 | "requires": { 665 | "js-tokens": "3.0.2" 666 | } 667 | }, 668 | "make-dir": { 669 | "version": "1.1.0", 670 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", 671 | "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", 672 | "requires": { 673 | "pify": "3.0.0" 674 | } 675 | }, 676 | "micromatch": { 677 | "version": "2.3.11", 678 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 679 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 680 | "dev": true, 681 | "requires": { 682 | "arr-diff": "2.0.0", 683 | "array-unique": "0.2.1", 684 | "braces": "1.8.5", 685 | "expand-brackets": "0.1.5", 686 | "extglob": "0.3.2", 687 | "filename-regex": "2.0.1", 688 | "is-extglob": "1.0.0", 689 | "is-glob": "2.0.1", 690 | "kind-of": "3.2.2", 691 | "normalize-path": "2.1.1", 692 | "object.omit": "2.0.1", 693 | "parse-glob": "3.0.4", 694 | "regex-cache": "0.4.4" 695 | } 696 | }, 697 | "minimist": { 698 | "version": "0.0.8", 699 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 700 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 701 | }, 702 | "mkdirp": { 703 | "version": "0.5.1", 704 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 705 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 706 | "requires": { 707 | "minimist": "0.0.8" 708 | } 709 | }, 710 | "ms": { 711 | "version": "2.0.0", 712 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 713 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 714 | "dev": true 715 | }, 716 | "node-fetch": { 717 | "version": "1.7.3", 718 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", 719 | "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", 720 | "requires": { 721 | "encoding": "0.1.12", 722 | "is-stream": "1.1.0" 723 | } 724 | }, 725 | "node-modules-regexp": { 726 | "version": "1.0.0", 727 | "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", 728 | "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" 729 | }, 730 | "normalize-path": { 731 | "version": "2.1.1", 732 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 733 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 734 | "dev": true, 735 | "requires": { 736 | "remove-trailing-separator": "1.1.0" 737 | } 738 | }, 739 | "object-assign": { 740 | "version": "4.1.1", 741 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 742 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 743 | }, 744 | "object.omit": { 745 | "version": "2.0.1", 746 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 747 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 748 | "dev": true, 749 | "requires": { 750 | "for-own": "0.1.5", 751 | "is-extendable": "0.1.1" 752 | } 753 | }, 754 | "output-file-sync": { 755 | "version": "2.0.0", 756 | "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.0.tgz", 757 | "integrity": "sha1-XTSKGh6u0a0WhkigGi1tEweM6Yc=", 758 | "requires": { 759 | "graceful-fs": "4.1.11", 760 | "is-plain-obj": "1.1.0", 761 | "mkdirp": "0.5.1" 762 | } 763 | }, 764 | "p-limit": { 765 | "version": "1.2.0", 766 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 767 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 768 | "requires": { 769 | "p-try": "1.0.0" 770 | } 771 | }, 772 | "p-locate": { 773 | "version": "2.0.0", 774 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 775 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 776 | "requires": { 777 | "p-limit": "1.2.0" 778 | } 779 | }, 780 | "p-try": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 783 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 784 | }, 785 | "parse-glob": { 786 | "version": "3.0.4", 787 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 788 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 789 | "dev": true, 790 | "requires": { 791 | "glob-base": "0.3.0", 792 | "is-dotfile": "1.0.3", 793 | "is-extglob": "1.0.0", 794 | "is-glob": "2.0.1" 795 | } 796 | }, 797 | "parse-passwd": { 798 | "version": "1.0.0", 799 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 800 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" 801 | }, 802 | "path-exists": { 803 | "version": "3.0.0", 804 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 805 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 806 | }, 807 | "path-parse": { 808 | "version": "1.0.5", 809 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 810 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 811 | "dev": true 812 | }, 813 | "pify": { 814 | "version": "3.0.0", 815 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 816 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 817 | }, 818 | "pirates": { 819 | "version": "3.0.2", 820 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz", 821 | "integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==", 822 | "requires": { 823 | "node-modules-regexp": "1.0.0" 824 | } 825 | }, 826 | "pkg-dir": { 827 | "version": "2.0.0", 828 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 829 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 830 | "requires": { 831 | "find-up": "2.1.0" 832 | } 833 | }, 834 | "preserve": { 835 | "version": "0.2.0", 836 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 837 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 838 | "dev": true 839 | }, 840 | "promise": { 841 | "version": "7.3.1", 842 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 843 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 844 | "requires": { 845 | "asap": "2.0.6" 846 | } 847 | }, 848 | "prop-types": { 849 | "version": "15.6.0", 850 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", 851 | "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", 852 | "requires": { 853 | "fbjs": "0.8.16", 854 | "loose-envify": "1.3.1", 855 | "object-assign": "4.1.1" 856 | } 857 | }, 858 | "randomatic": { 859 | "version": "1.1.7", 860 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", 861 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", 862 | "dev": true, 863 | "requires": { 864 | "is-number": "3.0.0", 865 | "kind-of": "4.0.0" 866 | }, 867 | "dependencies": { 868 | "is-number": { 869 | "version": "3.0.0", 870 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 871 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 872 | "dev": true, 873 | "requires": { 874 | "kind-of": "3.2.2" 875 | }, 876 | "dependencies": { 877 | "kind-of": { 878 | "version": "3.2.2", 879 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 880 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 881 | "dev": true, 882 | "requires": { 883 | "is-buffer": "1.1.6" 884 | } 885 | } 886 | } 887 | }, 888 | "kind-of": { 889 | "version": "4.0.0", 890 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 891 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 892 | "dev": true, 893 | "requires": { 894 | "is-buffer": "1.1.6" 895 | } 896 | } 897 | } 898 | }, 899 | "react": { 900 | "version": "16.2.0", 901 | "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", 902 | "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", 903 | "requires": { 904 | "fbjs": "0.8.16", 905 | "loose-envify": "1.3.1", 906 | "object-assign": "4.1.1", 907 | "prop-types": "15.6.0" 908 | } 909 | }, 910 | "react-reconciler": { 911 | "version": "0.7.0", 912 | "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", 913 | "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", 914 | "requires": { 915 | "fbjs": "0.8.16", 916 | "loose-envify": "1.3.1", 917 | "object-assign": "4.1.1", 918 | "prop-types": "15.6.0" 919 | } 920 | }, 921 | "regenerator-runtime": { 922 | "version": "0.11.1", 923 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 924 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 925 | }, 926 | "regex-cache": { 927 | "version": "0.4.4", 928 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", 929 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", 930 | "dev": true, 931 | "requires": { 932 | "is-equal-shallow": "0.1.3" 933 | } 934 | }, 935 | "remove-trailing-separator": { 936 | "version": "1.1.0", 937 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 938 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 939 | "dev": true 940 | }, 941 | "repeat-element": { 942 | "version": "1.1.2", 943 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 944 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 945 | "dev": true 946 | }, 947 | "repeat-string": { 948 | "version": "1.6.1", 949 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 950 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 951 | "dev": true 952 | }, 953 | "resolve": { 954 | "version": "1.5.0", 955 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 956 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 957 | "dev": true, 958 | "requires": { 959 | "path-parse": "1.0.5" 960 | } 961 | }, 962 | "setimmediate": { 963 | "version": "1.0.5", 964 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 965 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 966 | }, 967 | "source-map": { 968 | "version": "0.5.7", 969 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 970 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 971 | }, 972 | "source-map-support": { 973 | "version": "0.4.18", 974 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 975 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 976 | "requires": { 977 | "source-map": "0.5.7" 978 | } 979 | }, 980 | "supports-color": { 981 | "version": "4.5.0", 982 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 983 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 984 | "dev": true, 985 | "requires": { 986 | "has-flag": "2.0.0" 987 | } 988 | }, 989 | "to-fast-properties": { 990 | "version": "2.0.0", 991 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 992 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 993 | }, 994 | "trim-right": { 995 | "version": "1.0.1", 996 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 997 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 998 | "dev": true 999 | }, 1000 | "ua-parser-js": { 1001 | "version": "0.7.17", 1002 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", 1003 | "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" 1004 | }, 1005 | "v8flags": { 1006 | "version": "3.0.1", 1007 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", 1008 | "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", 1009 | "requires": { 1010 | "homedir-polyfill": "1.0.1" 1011 | } 1012 | }, 1013 | "whatwg-fetch": { 1014 | "version": "2.0.3", 1015 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", 1016 | "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" 1017 | } 1018 | } 1019 | } 1020 | -------------------------------------------------------------------------------- /toy-renderers/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "toy-renderers", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "console": "babel-node console.js", 8 | "voice": "babel-node voice.js", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "koba04", 13 | "license": "MIT", 14 | "dependencies": { 15 | "@babel/node": "^7.0.0-beta.39", 16 | "@babel/preset-react": "^7.0.0-beta.39", 17 | "colors": "^1.1.2", 18 | "react": "^16.2.0", 19 | "react-reconciler": "^0.7.0" 20 | }, 21 | "devDependencies": { 22 | "@babel/core": "^7.0.0-beta.39" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /toy-renderers/voice.js: -------------------------------------------------------------------------------- 1 | const React = require('react'); 2 | const ReactVoice = require('./ReactVoice'); 3 | 4 | ReactVoice.render( 5 | <> 6 | Hello 7 | React Fiber 8 | こんにちは React Reconciler 9 | 10 | ); 11 | --------------------------------------------------------------------------------