├── .gitignore
├── .prettierrc
├── .vscode
└── settings.json
├── LICENSE
├── README.md
├── demo
├── app.js
├── index.html
├── package.json
├── webpack.config.js
└── yarn.lock
├── package.json
├── qreact.js
├── src
├── ChildFiber.js
├── Component.js
├── DOMFiberEntry.js
├── DomComponent.js
├── EventEmitter.js
├── Fiber.js
├── FiberBeginWork.js
├── FiberCommitWork.js
├── FiberCompleteWork.js
├── FiberExpirationTime.js
├── FiberHooks.js
├── FiberScheduler.js
├── TypeOfMode.js
├── TypeOfSideEffect.js
├── TypeOfWork.js
├── UpdateQueue.js
├── createElement.js
└── render.js
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | demo/node_modules/
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 80,
3 | "tabWidth": 2,
4 | "singleQuote": false,
5 | "trailingComma": "all",
6 | "jsxBracketSameLine": false,
7 | "semi": true,
8 | "bracketSpacing": true,
9 | "arrowParens": "avoid",
10 | "parser": "typescript"
11 | }
12 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "git.ignoreLimitWarning": true
3 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) MQuy
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.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### QReact
2 |
3 | The dead simple implementation of React for the learning purpose on how React works internally.
4 |
5 | There are two qreact's version:
6 | - [qReact](https://github.com/MQuy/qreact/releases/tag/qreact) is similar to React-15.6
7 | - [qReact Fiber](https://github.com/MQuy/qreact/releases/tag/qreact-fiber) is based on the React fiber
8 |
9 | ### Todo List
10 |
11 | - [x] render, Component, createElement
12 | - [x] Reconciliation
13 | - [x] Global event handler
14 | - [x] Fiber
15 | - [x] Priority
16 | - [x] Hooks
17 | - [ ] Suspend
18 | - [ ] Synthetic event
--------------------------------------------------------------------------------
/demo/app.js:
--------------------------------------------------------------------------------
1 | import * as React from "../qreact";
2 |
3 | function Example() {
4 | const [count, setCount] = React.useState(0);
5 |
6 | return (
7 |
8 |
You clicked {count} times
9 |
setCount(count + 1)}>Click me
10 |
11 | );
12 | }
13 |
14 | React.render(
15 |
16 |
17 |
,
18 | document.getElementById("root"),
19 | );
20 |
--------------------------------------------------------------------------------
/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | <%= htmlWebpackPlugin.options.title %>
7 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/demo/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "demo",
3 | "version": "1.0.0",
4 | "license": "MIT",
5 | "scripts": {
6 | "build": "webpack --progress --colors",
7 | "start": "webpack-dev-server"
8 | },
9 | "devDependencies": {
10 | "@babel/core": "7.2.2",
11 | "@babel/plugin-proposal-class-properties": "7.2.3",
12 | "@babel/plugin-proposal-object-rest-spread": "^7.2.0",
13 | "@babel/preset-env": "7.2.3",
14 | "@babel/preset-react": "7.0.0",
15 | "babel-loader": "8.0.5",
16 | "html-webpack-plugin": "3.2.0",
17 | "webpack": "4.28.4",
18 | "webpack-cli": "3.2.1",
19 | "webpack-dev-server": "3.1.14"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/demo/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | const HtmlWebpackPlugin = require("html-webpack-plugin");
3 |
4 | module.exports = {
5 | entry: "./app.js",
6 | target: "web",
7 | devtool: "source-map",
8 |
9 | mode: "development",
10 |
11 | output: {
12 | path: path.resolve(__dirname, "dist"),
13 | filename: "bundle.js"
14 | },
15 |
16 | devServer: {
17 | contentBase: "./dist"
18 | },
19 |
20 | module: {
21 | rules: [
22 | {
23 | test: /\.js|jsx$/,
24 | loader: "babel-loader",
25 | query: {
26 | babelrc: false,
27 | presets: [["@babel/preset-react"]],
28 | plugins: ["@babel/plugin-proposal-class-properties", "@babel/plugin-proposal-object-rest-spread"]
29 | }
30 | }
31 | ]
32 | },
33 |
34 | plugins: [
35 | new HtmlWebpackPlugin({
36 | title: "qReact",
37 | template: "index.html"
38 | })
39 | ]
40 | };
41 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "qreact",
3 | "version": "1.0.0",
4 | "main": "qreact.js",
5 | "author": "Minh Quy ",
6 | "license": "MIT",
7 | "scripts": {
8 | "build": "webpack --progress --colors"
9 | },
10 | "devDependencies": {
11 | "babel-core": "^6.26.0",
12 | "babel-loader": "^7.1.2",
13 | "babel-plugin-transform-class-properties": "^6.24.1",
14 | "babel-plugin-transform-react-jsx": "^6.24.1",
15 | "babel-preset-stage-2": "^6.24.1",
16 | "webpack": "^3.10.0"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/qreact.js:
--------------------------------------------------------------------------------
1 | import { render } from "./src/render";
2 | import { createElement, REACT_ASYNC_MODE_TYPE } from "./src/createElement";
3 | import { Component } from "./src/Component";
4 | import { deferredUpdates } from "./src/FiberScheduler";
5 | import { useState } from "./src/FiberHooks";
6 |
7 | const unstable_AsyncMode = REACT_ASYNC_MODE_TYPE;
8 |
9 | export {
10 | render,
11 | createElement,
12 | Component,
13 | useState,
14 | deferredUpdates,
15 | unstable_AsyncMode,
16 | };
17 |
--------------------------------------------------------------------------------
/src/ChildFiber.js:
--------------------------------------------------------------------------------
1 | import {
2 | createWorkInProgress,
3 | createFiberFromElement,
4 | createFiberFromText,
5 | } from "./Fiber";
6 | import { Deletion, Placement } from "./TypeOfSideEffect";
7 | import { HostText } from "./TypeOfWork";
8 | import { REACT_ELEMENT_TYPE } from "./createElement";
9 |
10 | function ChildReconciler(shouldTrackSideEffects) {
11 | // For array child reconcilation
12 | function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {
13 | // Update the fiber if the keys match, otherwise return null.
14 |
15 | const key = oldFiber != null ? oldFiber.key : null;
16 |
17 | if (typeof newChild === "string" || typeof newChild === "number") {
18 | // Text nodes don't have keys. If the previous node is implicitly keyed
19 | // we can continue to replace it without aborting even if it is not a text
20 | // node.
21 | if (key != null) {
22 | return null;
23 | }
24 | return updateTextNode(
25 | returnFiber,
26 | oldFiber,
27 | "" + newChild,
28 | expirationTime,
29 | );
30 | }
31 |
32 | if (typeof newChild === "object" && newChild != null) {
33 | switch (newChild.$$typeof) {
34 | case REACT_ELEMENT_TYPE: {
35 | if (newChild.key === key) {
36 | return updateElement(
37 | returnFiber,
38 | oldFiber,
39 | newChild,
40 | expirationTime,
41 | );
42 | } else {
43 | return null;
44 | }
45 | }
46 | }
47 |
48 | if (isArray(newChild) || getIteratorFn(newChild)) {
49 | if (key != null) {
50 | return null;
51 | }
52 |
53 | return updateFragment(
54 | returnFiber,
55 | oldFiber,
56 | newChild,
57 | expirationTime,
58 | null,
59 | );
60 | }
61 |
62 | throwOnInvalidObjectType(returnFiber, newChild);
63 | }
64 |
65 | return null;
66 | }
67 |
68 | // For array child reconcilation
69 | function updateFromMap(
70 | existingChildren,
71 | returnFiber,
72 | newIdx,
73 | newChild,
74 | expirationTime,
75 | ) {
76 | if (typeof newChild === "string" || typeof newChild === "number") {
77 | // Text nodes don't have keys, so we neither have to check the old nor
78 | // new node for the key. If both are text nodes, they match.
79 | const matchedFiber = existingChildren.get(newIdx) || null;
80 | return updateTextNode(
81 | returnFiber,
82 | matchedFiber,
83 | "" + newChild,
84 | expirationTime,
85 | );
86 | }
87 |
88 | if (typeof newChild === "object" && newChild != null) {
89 | switch (newChild.$$typeof) {
90 | case REACT_ELEMENT_TYPE: {
91 | const matchedFiber =
92 | existingChildren.get(
93 | newChild.key == null ? newIdx : newChild.key,
94 | ) || null;
95 | return updateElement(
96 | returnFiber,
97 | matchedFiber,
98 | newChild,
99 | expirationTime,
100 | );
101 | }
102 | }
103 |
104 | if (isArray(newChild) || getIteratorFn(newChild)) {
105 | const matchedFiber = existingChildren.get(newIdx) || null;
106 | return updateFragment(
107 | returnFiber,
108 | matchedFiber,
109 | newChild,
110 | expirationTime,
111 | null,
112 | );
113 | }
114 |
115 | throwOnInvalidObjectType(returnFiber, newChild);
116 | }
117 |
118 | return null;
119 | }
120 |
121 | // For array child reconcilation
122 | function updateTextNode(returnFiber, current, textContent, expirationTime) {
123 | if (current == null || current.tag !== HostText) {
124 | // Insert
125 | const created = createFiberFromText(
126 | textContent,
127 | returnFiber.mode,
128 | expirationTime,
129 | );
130 | created.return = returnFiber;
131 | return created;
132 | } else {
133 | // Update
134 | const existing = useFiber(current, textContent, expirationTime);
135 | existing.return = returnFiber;
136 | return existing;
137 | }
138 | }
139 |
140 | // For array child reconcilation
141 | function updateElement(returnFiber, current, element, expirationTime) {
142 | if (current != null && current.type === element.type) {
143 | // Move based on index
144 | const existing = useFiber(current, element.props, expirationTime);
145 | existing.return = returnFiber;
146 | return existing;
147 | } else {
148 | // Insert
149 | const created = createFiberFromElement(
150 | element,
151 | returnFiber.mode,
152 | expirationTime,
153 | );
154 | created.return = returnFiber;
155 | return created;
156 | }
157 | }
158 |
159 | // For array child reconcilation
160 | function mapRemainingChildren(returnFiber, currentFirstChild) {
161 | const existingChildren = new Map();
162 |
163 | let existingChild = currentFirstChild;
164 | while (existingChild != null) {
165 | if (existingChild.key != null) {
166 | existingChildren.set(existingChild.key, existingChild);
167 | } else {
168 | existingChildren.set(existingChild.index, existingChild);
169 | }
170 | existingChild = existingChild.sibling;
171 | }
172 | return existingChildren;
173 | }
174 |
175 | function deleteChild(returnFiber, childToDelete) {
176 | if (!shouldTrackSideEffects) {
177 | return;
178 | }
179 | const last = returnFiber.lastEffect;
180 | if (last != null) {
181 | last.nextEffect = childToDelete;
182 | returnFiber.lastEffect = childToDelete;
183 | } else {
184 | returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
185 | }
186 | childToDelete.nextEffect = null;
187 | childToDelete.effectTag = Deletion;
188 | }
189 |
190 | function placeChild(newFiber, lastPlacedIndex, newIndex) {
191 | newFiber.index = newIndex;
192 | if (!shouldTrackSideEffects) {
193 | return;
194 | }
195 | const current = newFiber.alternate;
196 | if (current != null) {
197 | const oldIndex = current.index;
198 | if (oldIndex < lastPlacedIndex) {
199 | // This is a move.
200 | newFiber.effectTag = Placement;
201 | return lastPlacedIndex;
202 | } else {
203 | // This item can stay in place.
204 | return oldIndex;
205 | }
206 | } else {
207 | // This is an insertion.
208 | newFiber.effectTag = Placement;
209 | return lastPlacedIndex;
210 | }
211 | }
212 |
213 | function deleteRemainingChildren(returnFiber, currentFirstChild) {
214 | if (!shouldTrackSideEffects) {
215 | return null;
216 | }
217 |
218 | let childToDelete = currentFirstChild;
219 | while (childToDelete != null) {
220 | deleteChild(returnFiber, childToDelete);
221 | childToDelete = childToDelete.sibling;
222 | }
223 | return null;
224 | }
225 |
226 | function useFiber(fiber, pendingProps, expirationTime) {
227 | const clone = createWorkInProgress(fiber, pendingProps, expirationTime);
228 | clone.index = 0;
229 | clone.sibling = null;
230 | return clone;
231 | }
232 |
233 | function placeSingleChild(newFiber) {
234 | if (shouldTrackSideEffects && newFiber.alternate == null) {
235 | newFiber.effectTag = Placement;
236 | }
237 | return newFiber;
238 | }
239 |
240 | function createChild(returnFiber, newChild, expirationTime) {
241 | if (typeof newChild === "string" || typeof newChild === "number") {
242 | const created = createFiberFromText(
243 | "" + newChild,
244 | returnFiber.mode,
245 | expirationTime,
246 | );
247 | created.return = returnFiber;
248 | return created;
249 | }
250 |
251 | if (typeof newChild === "object" && newChild != null) {
252 | const created = createFiberFromElement(
253 | newChild,
254 | returnFiber.mode,
255 | expirationTime,
256 | );
257 | created.return = returnFiber;
258 | return created;
259 | }
260 |
261 | return null;
262 | }
263 |
264 | function reconcileChildrenArray(
265 | returnFiber,
266 | currentFirstChild,
267 | newChildren,
268 | expirationTime,
269 | ) {
270 | let resultingFirstChild = null;
271 | let previousNewFiber = null;
272 |
273 | let oldFiber = currentFirstChild;
274 | let lastPlacedIndex = 0;
275 | let newIdx = 0;
276 | let nextOldFiber = null;
277 | for (; oldFiber != null && newIdx < newChildren.length; newIdx++) {
278 | if (oldFiber.index > newIdx) {
279 | nextOldFiber = oldFiber;
280 | oldFiber = null;
281 | } else {
282 | nextOldFiber = oldFiber.sibling;
283 | }
284 | const newFiber = updateSlot(
285 | returnFiber,
286 | oldFiber,
287 | newChildren[newIdx],
288 | expirationTime,
289 | );
290 | if (newFiber == null) {
291 | // TODO: This breaks on empty slots like null children. That's
292 | // unfortunate because it triggers the slow path all the time. We need
293 | // a better way to communicate whether this was a miss or null,
294 | // boolean, undefined, etc.
295 | if (oldFiber == null) {
296 | oldFiber = nextOldFiber;
297 | }
298 | break;
299 | }
300 | if (shouldTrackSideEffects) {
301 | if (oldFiber && newFiber.alternate == null) {
302 | // We matched the slot, but we didn't reuse the existing fiber, so we
303 | // need to delete the existing child.
304 | deleteChild(returnFiber, oldFiber);
305 | }
306 | }
307 | lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
308 | if (previousNewFiber == null) {
309 | // TODO: Move out of the loop. This only happens for the first run.
310 | resultingFirstChild = newFiber;
311 | } else {
312 | // TODO: Defer siblings if we're not at the right index for this slot.
313 | // I.e. if we had null values before, then we want to defer this
314 | // for each null value. However, we also don't want to call updateSlot
315 | // with the previous one.
316 | previousNewFiber.sibling = newFiber;
317 | }
318 | previousNewFiber = newFiber;
319 | oldFiber = nextOldFiber;
320 | }
321 |
322 | if (newIdx === newChildren.length) {
323 | // We've reached the end of the new children. We can delete the rest.
324 | deleteRemainingChildren(returnFiber, oldFiber);
325 | return resultingFirstChild;
326 | }
327 |
328 | if (oldFiber == null) {
329 | // If we don't have any more existing children we can choose a fast path
330 | // since the rest will all be insertions.
331 | for (; newIdx < newChildren.length; newIdx++) {
332 | const newFiber = createChild(
333 | returnFiber,
334 | newChildren[newIdx],
335 | expirationTime,
336 | );
337 | if (!newFiber) {
338 | continue;
339 | }
340 | lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
341 | if (previousNewFiber == null) {
342 | // TODO: Move out of the loop. This only happens for the first run.
343 | resultingFirstChild = newFiber;
344 | } else {
345 | previousNewFiber.sibling = newFiber;
346 | }
347 | previousNewFiber = newFiber;
348 | }
349 | return resultingFirstChild;
350 | }
351 |
352 | // Add all children to a key map for quick lookups.
353 | const existingChildren = mapRemainingChildren(returnFiber, oldFiber);
354 |
355 | // Keep scanning and use the map to restore deleted items as moves.
356 | for (; newIdx < newChildren.length; newIdx++) {
357 | const newFiber = updateFromMap(
358 | existingChildren,
359 | returnFiber,
360 | newIdx,
361 | newChildren[newIdx],
362 | expirationTime,
363 | );
364 | if (newFiber) {
365 | if (shouldTrackSideEffects) {
366 | if (newFiber.alternate != null) {
367 | // The new fiber is a work in progress, but if there exists a
368 | // current, that means that we reused the fiber. We need to delete
369 | // it from the child list so that we don't add it to the deletion
370 | // list.
371 | existingChildren.delete(
372 | newFiber.key == null ? newIdx : newFiber.key,
373 | );
374 | }
375 | }
376 | lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
377 | if (previousNewFiber == null) {
378 | resultingFirstChild = newFiber;
379 | } else {
380 | previousNewFiber.sibling = newFiber;
381 | }
382 | previousNewFiber = newFiber;
383 | }
384 | }
385 |
386 | if (shouldTrackSideEffects) {
387 | // Any existing children that weren't consumed above were deleted. We need
388 | // to add them to the deletion list.
389 | existingChildren.forEach(child => deleteChild(returnFiber, child));
390 | }
391 |
392 | return resultingFirstChild;
393 | }
394 |
395 | function reconcileSingleTextNode(
396 | returnFiber,
397 | currentFirstChild,
398 | textContent,
399 | expirationTime,
400 | ) {
401 | if (currentFirstChild != null && currentFirstChild.tag === HostText) {
402 | deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
403 | const existing = useFiber(currentFirstChild, textContent, expirationTime);
404 | existing.pendingProps = textContent;
405 | existing.return = returnFiber;
406 | return existing;
407 | }
408 | deleteRemainingChildren(returnFiber, currentFirstChild);
409 | const created = createFiberFromText(
410 | textContent,
411 | returnFiber.mode,
412 | expirationTime,
413 | );
414 | created.return = returnFiber;
415 | return created;
416 | }
417 |
418 | function reconcileSingleElement(
419 | returnFiber,
420 | currentFirstChild,
421 | element,
422 | expirationTime,
423 | ) {
424 | const key = element.key;
425 | let child = currentFirstChild;
426 | while (child != null) {
427 | if (child.key === key) {
428 | if (child.type === element.type) {
429 | deleteRemainingChildren(returnFiber, child.sibling);
430 | const existing = useFiber(child, element.props, expirationTime);
431 | existing.pendingProps = element.props;
432 | existing.return = returnFiber;
433 | return existing;
434 | } else {
435 | deleteRemainingChildren(returnFiber, child);
436 | break;
437 | }
438 | } else {
439 | deleteChild(returnFiber, child);
440 | }
441 | child = child.sibling;
442 | }
443 |
444 | const created = createFiberFromElement(
445 | element,
446 | returnFiber.mode,
447 | expirationTime,
448 | );
449 | created.return = returnFiber;
450 | return created;
451 | }
452 |
453 | function reconcileChildFibers(
454 | returnFiber,
455 | currentFirstChild,
456 | newChild,
457 | expirationTime,
458 | ) {
459 | const isObject = typeof newChild === "object" && newChild != null;
460 | if (isObject && newChild.$$typeof === REACT_ELEMENT_TYPE) {
461 | return placeSingleChild(
462 | reconcileSingleElement(
463 | returnFiber,
464 | currentFirstChild,
465 | newChild,
466 | expirationTime,
467 | ),
468 | );
469 | }
470 |
471 | if (typeof newChild === "string" || typeof newChild === "number") {
472 | return placeSingleChild(
473 | reconcileSingleTextNode(
474 | returnFiber,
475 | currentFirstChild,
476 | "" + newChild,
477 | expirationTime,
478 | ),
479 | );
480 | }
481 |
482 | if (Array.isArray(newChild)) {
483 | return reconcileChildrenArray(
484 | returnFiber,
485 | currentFirstChild,
486 | newChild,
487 | expirationTime,
488 | );
489 | }
490 |
491 | return deleteRemainingChildren(returnFiber, currentFirstChild);
492 | }
493 |
494 | return reconcileChildFibers;
495 | }
496 |
497 | export const reconcileChildFibers = ChildReconciler(true);
498 |
499 | export const mountChildFibers = ChildReconciler(false);
500 |
501 | export function cloneChildFibers(current, workInProgress) {
502 | if (workInProgress.child == null) {
503 | return;
504 | }
505 |
506 | let currentChild = workInProgress.child;
507 | let newChild = createWorkInProgress(
508 | currentChild,
509 | currentChild.pendingProps,
510 | currentChild.expirationTime,
511 | );
512 | newChild.pendingProps = currentChild.pendingProps;
513 | workInProgress.child = newChild;
514 |
515 | newChild.return = workInProgress;
516 | while (currentChild.sibling != null) {
517 | currentChild = currentChild.sibling;
518 | newChild = newChild.sibling = createWorkInProgress(
519 | currentChild,
520 | currentChild.pendingProps,
521 | currentChild.expirationTime,
522 | );
523 | newChild.pendingProps = currentChild.pendingProps;
524 | newChild.return = workInProgress;
525 | }
526 | newChild.sibling = null;
527 | }
528 |
529 | function throwOnInvalidObjectType(returnFiber, newChild) {
530 | if (returnFiber.type !== "textarea") {
531 | let addendum = "";
532 | if (__DEV__) {
533 | addendum =
534 | " If you meant to render a collection of children, use an array " +
535 | "instead." +
536 | (getCurrentFiberStackAddendum() || "");
537 | }
538 | invariant(
539 | false,
540 | "Objects are not valid as a React child (found: %s).%s",
541 | Object.prototype.toString.call(newChild) === "[object Object]"
542 | ? "object with keys {" + Object.keys(newChild).join(", ") + "}"
543 | : newChild,
544 | addendum,
545 | );
546 | }
547 | }
548 |
--------------------------------------------------------------------------------
/src/Component.js:
--------------------------------------------------------------------------------
1 | import { scheduleWork, computeExpirationForFiber } from "./FiberScheduler";
2 | import { createUpdate, insertUpdateIntoFiber } from "./UpdateQueue";
3 |
4 | export class Component {
5 | constructor(props) {
6 | this.props = props;
7 | }
8 |
9 | setState(partialState) {
10 | const fiber = ReactInstanceMap.get(this);
11 | const expirationTime = computeExpirationForFiber(fiber);
12 | const update = createUpdate(partialState, expirationTime);
13 |
14 | insertUpdateIntoFiber(fiber, update);
15 | scheduleWork(fiber, expirationTime);
16 | }
17 |
18 | isReactComponent() {}
19 | }
20 |
21 | export const ReactInstanceMap = {
22 | remove: function(key) {
23 | key._reactInternalFiber = undefined;
24 | },
25 |
26 | get: function(key) {
27 | return key._reactInternalFiber;
28 | },
29 |
30 | has: function(key) {
31 | return key._reactInternalFiber !== undefined;
32 | },
33 |
34 | set: function(key, value) {
35 | key._reactInternalFiber = value;
36 | },
37 | };
38 |
--------------------------------------------------------------------------------
/src/DOMFiberEntry.js:
--------------------------------------------------------------------------------
1 | import { precacheFiberNode, updateFiberProps } from "./DomComponent";
2 |
3 | const TEXT_NODE = 3;
4 |
5 | export function appendChild(dom, child) {
6 | dom.appendChild(child);
7 | }
8 |
9 | export function replaceNode(node, newNode) {
10 | node.parentNode.replaceNode(newNode);
11 | }
12 |
13 | export function removeChild(node, child) {
14 | node.removeChild(child);
15 | }
16 |
17 | export function setTextContent(node, text) {
18 | if (text) {
19 | let firstChild = node.firstChild;
20 |
21 | if (
22 | firstChild &&
23 | firstChild === node.lastChild &&
24 | firstChild.nodeType === TEXT_NODE
25 | ) {
26 | firstChild.nodeValue = text;
27 | return;
28 | }
29 | }
30 | node.textContent = text;
31 | }
32 |
33 | export function createInstance(
34 | type,
35 | props,
36 | rootContainerInstance,
37 | internalInstanceHandle,
38 | ) {
39 | const domElement = rootContainerInstance.ownerDocument.createElement(type);
40 | precacheFiberNode(internalInstanceHandle, domElement);
41 | updateFiberProps(domElement, props);
42 | return domElement;
43 | }
44 |
--------------------------------------------------------------------------------
/src/DomComponent.js:
--------------------------------------------------------------------------------
1 | import { listenTo, registrationNameDependencies } from "./EventEmitter";
2 | import { setTextContent } from "./DOMFiberEntry";
3 |
4 | const internalInstanceKey = "__reactInternalInstance";
5 | const internalEventHandlersKey = "__reactEventHandlers";
6 |
7 | export function setInitialProperties(domElement, tag, props) {
8 | switch (tag) {
9 | case "input":
10 | case "option":
11 | case "select":
12 | case "textarea":
13 | listenTo("onChange");
14 | }
15 | setInitialDOMProperties(domElement, props);
16 | }
17 |
18 | function setInitialDOMProperties(domElement, nextProps) {
19 | for (let propKey in nextProps) {
20 | const nextProp = nextProps[propKey];
21 | if (propKey === "children") {
22 | if (["string", "number"].includes(typeof nextProp)) {
23 | setTextContent(domElement, nextProp);
24 | }
25 | } else if (
26 | registrationNameDependencies.hasOwnProperty(propKey) &&
27 | nextProp != null
28 | ) {
29 | listenTo(propKey);
30 | } else {
31 | domElement.setAttribute(propKey, nextProp);
32 | }
33 | }
34 | }
35 |
36 | export function updateDOMProperties(domElement, updatePayload) {
37 | for (let i = 0; i < updatePayload.length; i += 2) {
38 | let propKey = updatePayload[i];
39 | let propValue = updatePayload[i + 1];
40 | if (propKey === "children") {
41 | setTextContent(domElement, propValue);
42 | } else if (propValue != null) {
43 | domElement.setAttribute(propKey, propValue);
44 | } else {
45 | domElement.removeAttribute(propKey);
46 | }
47 | }
48 | }
49 | export function diffProperties(lastRawProps, nextRawProps) {
50 | let updatePayload = null;
51 | let lastProps = lastRawProps;
52 | let nextProps = nextRawProps;
53 | for (let propKey in lastProps) {
54 | if (
55 | nextProps.hasOwnProperty(propKey) ||
56 | !lastProps.hasOwnProperty(propKey) ||
57 | lastProps[propKey] == null
58 | ) {
59 | continue;
60 | }
61 | if (!registrationNameDependencies.hasOwnProperty(propKey)) {
62 | (updatePayload = updatePayload || []).push(propKey, null);
63 | }
64 | }
65 | for (let propKey in nextProps) {
66 | let nextProp = nextProps[propKey];
67 | let lastProp = lastProps != null ? lastProps[propKey] : undefined;
68 | if (
69 | !nextProps.hasOwnProperty(propKey) ||
70 | nextProp === lastProp ||
71 | (nextProp == null && lastProp == null)
72 | ) {
73 | continue;
74 | }
75 | if (propKey === "children") {
76 | if (
77 | lastProp !== nextProp &&
78 | (typeof nextProp === "string" || typeof nextProp === "number")
79 | ) {
80 | (updatePayload = updatePayload || []).push(propKey, "" + nextProp);
81 | }
82 | } else if (registrationNameDependencies.hasOwnProperty(propKey)) {
83 | if (nextProp != null) {
84 | listenTo(propKey);
85 | }
86 | if (!updatePayload && lastProp !== nextProp) {
87 | updatePayload = [];
88 | }
89 | } else {
90 | (updatePayload = updatePayload || []).push(propKey, nextProp);
91 | }
92 | }
93 | return updatePayload;
94 | }
95 |
96 | export function getClosestInstanceFromNode(node) {
97 | return node[internalInstanceKey];
98 | }
99 |
100 | export function getFiberCurrentPropsFromNode(node) {
101 | return node[internalEventHandlersKey];
102 | }
103 |
104 | export function updateFiberProps(node, props) {
105 | node[internalEventHandlersKey] = props;
106 | }
107 |
108 | export function precacheFiberNode(inst, node) {
109 | node[internalInstanceKey] = inst;
110 | }
111 |
--------------------------------------------------------------------------------
/src/EventEmitter.js:
--------------------------------------------------------------------------------
1 | import {
2 | batchedUpdates,
3 | flushInteractiveUpdates,
4 | interactiveUpdates,
5 | } from "./FiberScheduler";
6 | import {
7 | getClosestInstanceFromNode,
8 | getFiberCurrentPropsFromNode,
9 | } from "./DomComponent";
10 |
11 | const alreadyListeningTo = {};
12 | export const registrationNameDependencies = {
13 | onChange: [
14 | "blur",
15 | "change",
16 | "click",
17 | "focus",
18 | "input",
19 | "keydown",
20 | "keyup",
21 | "selectionchange",
22 | ],
23 | onClick: ["click"],
24 | };
25 | const topLevelEventsToDispatchConfig = {
26 | click: {
27 | dependencies: ["click"],
28 | isInteractive: true,
29 | phasedRegistrationNames: { bubbled: "onClick", captured: "onClickCapture" },
30 | },
31 | };
32 |
33 | export function listenTo(registrationName) {
34 | const dependencies = registrationNameDependencies[registrationName];
35 |
36 | for (let i = 0; i < dependencies.length; i++) {
37 | const dependency = dependencies[i];
38 | if (!alreadyListeningTo[dependency]) {
39 | alreadyListeningTo[dependency] = true;
40 | document.addEventListener(
41 | dependency,
42 | dispatchEvent.bind(this, dependency),
43 | );
44 | }
45 | }
46 | }
47 |
48 | function dispatchEvent(name, event) {
49 | const targetInst = getClosestInstanceFromNode(event.target);
50 | if (targetInst) {
51 | const dispatchConfig = topLevelEventsToDispatchConfig[name];
52 | const listener = getListener(
53 | targetInst,
54 | dispatchConfig.phasedRegistrationNames.bubbled,
55 | );
56 |
57 | if (typeof listener === "function") {
58 | if (isInteractiveTopLevelEventType(name)) {
59 | flushInteractiveUpdates();
60 | interactiveUpdates(listener, event);
61 | } else {
62 | batchedUpdates(listener, event);
63 | }
64 | }
65 | }
66 | }
67 |
68 | function getListener(inst, registrationName) {
69 | const props = getFiberCurrentPropsFromNode(inst.stateNode);
70 |
71 | return props[registrationName];
72 | }
73 |
74 | function isInteractiveTopLevelEventType(name) {
75 | return name === "click";
76 | }
77 |
--------------------------------------------------------------------------------
/src/Fiber.js:
--------------------------------------------------------------------------------
1 | import { NoEffect } from "./TypeOfSideEffect";
2 | import {
3 | HostRoot,
4 | HostComponent,
5 | HostText,
6 | ClassComponent,
7 | Mode,
8 | FunctionalComponent,
9 | } from "./TypeOfWork";
10 | import { REACT_ASYNC_MODE_TYPE, REACT_STRICT_MODE_TYPE } from "./createElement";
11 | import { AsyncMode, StrictMode } from "./TypeOfMode";
12 | import { NoWork } from "./FiberExpirationTime";
13 |
14 | export class FiberNode {
15 | constructor(tag, pendingProps, key, mode) {
16 | // Instance
17 | this.tag = tag;
18 | this.key = key;
19 | this.type = null;
20 | this.stateNode = null;
21 | // Fiber
22 | this.return = null;
23 | this.child = null;
24 | this.sibling = null;
25 | this.index = 0;
26 |
27 | this.ref = null;
28 |
29 | this.pendingProps = pendingProps;
30 | this.memoizedProps = null;
31 | this.updateQueue = null;
32 | this.memoizedState = null;
33 |
34 | this.mode = mode;
35 |
36 | // Effects
37 | this.effectTag = NoEffect;
38 | this.nextEffect = null;
39 | this.firstEffect = null;
40 | this.lastEffect = null;
41 |
42 | this.expirationTime = NoWork;
43 | this.childExpirationTime = NoWork;
44 |
45 | this.alternate = null;
46 | }
47 | }
48 |
49 | export function createWorkInProgress(current, pendingProps, expirationTime) {
50 | let workInProgress = current.alternate;
51 | if (workInProgress == null) {
52 | // We use a double buffering pooling technique because we know that we'll
53 | // only ever need at most two versions of a tree. We pool the "other" unused
54 | // node that we're free to reuse. This is lazily created to avoid allocating
55 | // extra objects for things that are never updated. It also allow us to
56 | // reclaim the extra memory if needed.
57 | workInProgress = new FiberNode(
58 | current.tag,
59 | pendingProps,
60 | current.key,
61 | current.mode,
62 | );
63 | workInProgress.type = current.type;
64 | workInProgress.stateNode = current.stateNode;
65 |
66 | workInProgress.alternate = current;
67 | current.alternate = workInProgress;
68 | } else {
69 | workInProgress.pendingProps = pendingProps;
70 |
71 | // We already have an alternate.
72 | // Reset the effect tag.
73 | workInProgress.effectTag = NoEffect;
74 |
75 | // The effect list is no longer valid.
76 | workInProgress.nextEffect = null;
77 | workInProgress.firstEffect = null;
78 | workInProgress.lastEffect = null;
79 | }
80 |
81 | // Don't touching the subtree's expiration time, which has not changed.
82 | workInProgress.childExpirationTime = current.childExpirationTime;
83 | if (pendingProps !== current.pendingProps) {
84 | // This fiber has new props.
85 | workInProgress.expirationTime = expirationTime;
86 | } else {
87 | // This fiber's props have not changed.
88 | workInProgress.expirationTime = current.expirationTime;
89 | }
90 |
91 | workInProgress.child = current.child;
92 | workInProgress.memoizedProps = current.memoizedProps;
93 | workInProgress.memoizedState = current.memoizedState;
94 | workInProgress.updateQueue = current.updateQueue;
95 |
96 | // These will be overridden during the parent's reconciliation
97 | workInProgress.sibling = current.sibling;
98 | workInProgress.index = current.index;
99 | workInProgress.ref = current.ref;
100 |
101 | return workInProgress;
102 | }
103 |
104 | export function getRootFromFiber(fiber) {
105 | let node = fiber;
106 | while (node != null) {
107 | if (node.return == null && node.tag === HostRoot) {
108 | break;
109 | }
110 | node = node.return;
111 | }
112 | return node ? node.stateNode : null;
113 | }
114 |
115 | export function createFiberFromElement(element, mode, expirationTime) {
116 | let fiber;
117 | const type = element.type;
118 | const key = element.key;
119 | let pendingProps = element.props;
120 |
121 | let fiberTag;
122 | if (typeof type === "function") {
123 | if (shouldConstruct(type)) {
124 | fiberTag = ClassComponent;
125 | } else {
126 | fiberTag = FunctionalComponent;
127 | }
128 | } else if (typeof type === "string") {
129 | fiberTag = HostComponent;
130 | } else {
131 | switch (type) {
132 | case REACT_ASYNC_MODE_TYPE:
133 | fiberTag = Mode;
134 | mode |= AsyncMode | StrictMode;
135 | break;
136 | case REACT_STRICT_MODE_TYPE:
137 | fiberTag = Mode;
138 | mode |= StrictMode;
139 | break;
140 | default: {
141 | if (typeof type === "object" && type != null) {
142 | if (typeof type.tag === "number") {
143 | // Currently assumed to be a continuation and therefore is a
144 | // fiber already.
145 | // TODO: The yield system is currently broken for updates in
146 | // some cases. The reified yield stores a fiber, but we don't
147 | // know which fiber that is; the current or a workInProgress?
148 | // When the continuation gets rendered here we don't know if we
149 | // can reuse that fiber or if we need to clone it. There is
150 | // probably a clever way to restructure this.
151 | fiber = type;
152 | fiber.pendingProps = pendingProps;
153 | fiber.expirationTime = expirationTime;
154 | return fiber;
155 | }
156 | }
157 | }
158 | }
159 | }
160 |
161 | fiber = new FiberNode(fiberTag, pendingProps, key, mode);
162 | fiber.type = type;
163 | fiber.expirationTime = expirationTime;
164 |
165 | return fiber;
166 | }
167 |
168 | export function createFiberFromText(content, mode, expirationTime) {
169 | const fiber = new FiberNode(HostText, content, null, mode);
170 | fiber.pendingProps = content;
171 | fiber.expirationTime = expirationTime;
172 |
173 | return fiber;
174 | }
175 |
176 | function shouldConstruct(Component) {
177 | const prototype = Component.prototype;
178 | return !!(prototype && prototype.isReactComponent);
179 | }
180 |
--------------------------------------------------------------------------------
/src/FiberBeginWork.js:
--------------------------------------------------------------------------------
1 | import {
2 | cloneChildFibers,
3 | reconcileChildFibers,
4 | mountChildFibers,
5 | } from "./ChildFiber";
6 | import { ReactInstanceMap } from "./Component";
7 | import { Placement, PerformedWork } from "./TypeOfSideEffect";
8 | import { processUpdateQueue } from "./UpdateQueue";
9 | import {
10 | FunctionalComponent,
11 | ClassComponent,
12 | HostRoot,
13 | HostComponent,
14 | HostText,
15 | Mode,
16 | } from "./TypeOfWork";
17 | import { prepareToUseHooks, finishHooks, bailoutHooks } from "./FiberHooks";
18 | import { NoWork } from "./FiberExpirationTime";
19 |
20 | let didReceiveUpdate = false;
21 |
22 | export function beginWork(current, workInProgress, renderExpirationTime) {
23 | const updateExpirationTime = workInProgress.expirationTime;
24 |
25 | if (current != null) {
26 | if (current.memoizedProps !== workInProgress.pendingProps) {
27 | didReceiveUpdate = true;
28 | } else if (updateExpirationTime < renderExpirationTime) {
29 | didReceiveUpdate = false;
30 | return bailoutOnAlreadyFinishedWork(
31 | current,
32 | workInProgress,
33 | renderExpirationTime,
34 | );
35 | }
36 | } else {
37 | didReceiveUpdate = false;
38 | }
39 |
40 | // Before entering the begin phase, clear the expiration time.
41 | workInProgress.expirationTime = NoWork;
42 |
43 | switch (workInProgress.tag) {
44 | case FunctionalComponent:
45 | const Component = workInProgress.type;
46 | return updateFunctionComponent(
47 | current,
48 | workInProgress,
49 | Component,
50 | renderExpirationTime,
51 | );
52 | case ClassComponent:
53 | return updateClassComponent(
54 | current,
55 | workInProgress,
56 | renderExpirationTime,
57 | );
58 | case HostRoot:
59 | return updateHostRoot(current, workInProgress, renderExpirationTime);
60 | case HostComponent:
61 | return updateHostComponent(current, workInProgress, renderExpirationTime);
62 | case HostText:
63 | return updateHostText(current, workInProgress);
64 | case Mode:
65 | return updateMode(current, workInProgress, renderExpirationTime);
66 | }
67 | }
68 |
69 | function updateHostRoot(current, workInProgress, renderExpirationTime) {
70 | const updateQueue = workInProgress.updateQueue;
71 | const nextProps = workInProgress.pendingProps;
72 | const prevState = workInProgress.memoizedState;
73 | const prevChildren = prevState != null ? prevState.element : null;
74 | processUpdateQueue(
75 | current,
76 | workInProgress,
77 | updateQueue,
78 | nextProps,
79 | null,
80 | renderExpirationTime,
81 | );
82 | const nextState = workInProgress.memoizedState;
83 | const nextChildren = nextState.element;
84 |
85 | if (nextChildren === prevChildren) {
86 | return bailoutOnAlreadyFinishedWork(
87 | current,
88 | workInProgress,
89 | renderExpirationTime,
90 | );
91 | }
92 | reconcileChildren(
93 | current,
94 | workInProgress,
95 | nextChildren,
96 | renderExpirationTime,
97 | );
98 | return workInProgress.child;
99 | }
100 |
101 | function updateFunctionComponent(
102 | current,
103 | workInProgress,
104 | Component,
105 | renderExpirationTime,
106 | ) {
107 | let fn = workInProgress.type;
108 | let nextProps = workInProgress.pendingProps;
109 |
110 | prepareToUseHooks(current, workInProgress, renderExpirationTime);
111 | let nextChildren = fn(nextProps);
112 | nextChildren = finishHooks(Component, nextProps, nextChildren);
113 |
114 | if (current != null && !didReceiveUpdate) {
115 | bailoutHooks(current, workInProgress, renderExpirationTime);
116 | return bailoutOnAlreadyFinishedWork(
117 | current,
118 | workInProgress,
119 | renderExpirationTime,
120 | );
121 | }
122 |
123 | workInProgress.effectTag |= PerformedWork;
124 | reconcileChildren(
125 | current,
126 | workInProgress,
127 | nextChildren,
128 | renderExpirationTime,
129 | );
130 | return workInProgress.child;
131 | }
132 |
133 | function updateHostText(current, workInProgress) {
134 | if (current == null) {
135 | workInProgress.effectTag |= Placement;
136 | }
137 | workInProgress.memoizedProps =
138 | workInProgress.pendingProps || workInProgress.memoizedProps;
139 | return null;
140 | }
141 |
142 | function updateHostComponent(current, workInProgress, renderExpirationTime) {
143 | if (current == null) {
144 | workInProgress.effectTag |= Placement;
145 | }
146 | const memoizedProps = workInProgress.memoizedProps;
147 | let nextProps = workInProgress.pendingProps || memoizedProps;
148 | let nextChildren = nextProps.children;
149 | reconcileChildren(
150 | current,
151 | workInProgress,
152 | nextChildren,
153 | renderExpirationTime,
154 | );
155 | return workInProgress.child;
156 | }
157 |
158 | function updateClassComponent(current, workInProgress, renderExpirationTime) {
159 | let shouldUpdate;
160 | if (current == null) {
161 | if (!workInProgress.stateNode) {
162 | const ctor = workInProgress.type;
163 | const instance = new ctor(workInProgress.pendingProps);
164 |
165 | workInProgress.stateNode = instance;
166 | ReactInstanceMap.set(instance, workInProgress);
167 | instance.props = workInProgress.pendingProps;
168 | instance.state = instance.state || null;
169 | shouldUpdate = true;
170 | }
171 | } else {
172 | shouldUpdate = updateClassInstance(
173 | current,
174 | workInProgress,
175 | renderExpirationTime,
176 | );
177 | }
178 | return finishClassComponent(
179 | current,
180 | workInProgress,
181 | shouldUpdate,
182 | renderExpirationTime,
183 | );
184 | }
185 |
186 | function updateClassInstance(current, workInProgress, renderExpirationTime) {
187 | const instance = workInProgress.stateNode;
188 |
189 | instance.props = workInProgress.memoizedProps;
190 | instance.state = workInProgress.memoizedState;
191 |
192 | const oldProps = workInProgress.memoizedProps;
193 | const newProps = workInProgress.pendingProps || oldProps;
194 | const oldState = workInProgress.memoizedState;
195 | let newState;
196 | if (workInProgress.updateQueue != null) {
197 | newState = processUpdateQueue(
198 | current,
199 | workInProgress,
200 | workInProgress.updateQueue,
201 | instance,
202 | newProps,
203 | renderExpirationTime,
204 | );
205 | } else {
206 | newState = oldState;
207 | }
208 |
209 | if (
210 | oldProps === newProps &&
211 | oldState === newState &&
212 | workInProgress.updateQueue == null
213 | ) {
214 | return false;
215 | }
216 | instance.props = newProps;
217 | instance.state = newState;
218 | return true;
219 | }
220 |
221 | function finishClassComponent(
222 | current,
223 | workInProgress,
224 | shouldUpdate,
225 | renderExpirationTime,
226 | ) {
227 | if (!shouldUpdate) {
228 | return bailoutOnAlreadyFinishedWork(
229 | current,
230 | workInProgress,
231 | renderExpirationTime,
232 | );
233 | }
234 |
235 | const instance = workInProgress.stateNode;
236 | const nextChildren = instance.render();
237 |
238 | workInProgress.effectTag |= PerformedWork;
239 | reconcileChildren(
240 | current,
241 | workInProgress,
242 | nextChildren,
243 | renderExpirationTime,
244 | );
245 | workInProgress.memoizedState = instance.state;
246 | return workInProgress.child;
247 | }
248 |
249 | function bailoutOnAlreadyFinishedWork(
250 | current,
251 | workInProgress,
252 | renderExpirationTime,
253 | ) {
254 | // Check if the children have any pending work.
255 | const childExpirationTime = workInProgress.childExpirationTime;
256 | if (
257 | childExpirationTime === NoWork ||
258 | childExpirationTime > renderExpirationTime
259 | ) {
260 | // The children don't have any work either. We can skip them.
261 | // TODO: Once we add back resuming, we should check if the children are
262 | // a work-in-progress set. If so, we need to transfer their effects.
263 | return null;
264 | } else {
265 | // This fiber doesn't have work, but its subtree does. Clone the child
266 | // fibers and continue.
267 | cloneChildFibers(current, workInProgress);
268 | return workInProgress.child;
269 | }
270 | }
271 |
272 | function reconcileChildren(
273 | current,
274 | workInProgress,
275 | nextChildren,
276 | renderExpirationTime,
277 | ) {
278 | if (current == null) {
279 | // If this is a fresh new component that hasn't been rendered yet, we
280 | // won't update its child set by applying minimal side-effects. Instead,
281 | // we will add them all to the child before it gets rendered. That means
282 | // we can optimize this reconciliation pass by not tracking side-effects.
283 | workInProgress.child = mountChildFibers(
284 | workInProgress,
285 | null,
286 | nextChildren,
287 | renderExpirationTime,
288 | );
289 | } else {
290 | // If the current child is the same as the work in progress, it means that
291 | // we haven't yet started any work on these children. Therefore, we use
292 | // the clone algorithm to create a copy of all the current children.
293 |
294 | // If we had any progressed work already, that is invalid at this point so
295 | // let's throw it out.
296 | workInProgress.child = reconcileChildFibers(
297 | workInProgress,
298 | current.child,
299 | nextChildren,
300 | renderExpirationTime,
301 | );
302 | }
303 | }
304 |
305 | function updateMode(current, workInProgress, renderExpirationTime) {
306 | const nextChildren = workInProgress.pendingProps.children;
307 | reconcileChildren(
308 | current,
309 | workInProgress,
310 | nextChildren,
311 | renderExpirationTime,
312 | );
313 | return workInProgress.child;
314 | }
315 |
316 | export function markWorkInProgressReceivedUpdate() {
317 | didReceiveUpdate = true;
318 | }
319 |
--------------------------------------------------------------------------------
/src/FiberCommitWork.js:
--------------------------------------------------------------------------------
1 | import { removeChild, appendChild } from "./DOMFiberEntry";
2 | import {
3 | precacheFiberNode,
4 | updateFiberProps,
5 | updateDOMProperties,
6 | } from "./DomComponent";
7 | import { HostComponent, HostText, HostRoot } from "./TypeOfWork";
8 |
9 | export function createTextInstance(text, internalInstanceHandle) {
10 | var textNode = document.createTextNode(text);
11 | precacheFiberNode(internalInstanceHandle, textNode);
12 | return textNode;
13 | }
14 |
15 | export function commitDeletion(current) {
16 | unmountHostComponents(current);
17 |
18 | current.return = null;
19 | current.child = null;
20 | if (current.alternate) {
21 | current.alternate.child = null;
22 | current.alternate.return = null;
23 | }
24 | }
25 |
26 | function unmountHostComponents(current) {
27 | let node = current;
28 | let currentParent;
29 |
30 | while (true) {
31 | currentParent = getHostParent(node);
32 | if (node.tag === HostComponent || node.tag === HostText) {
33 | removeChild(currentParent, node.stateNode);
34 | } else {
35 | if (node.child != null) {
36 | node.child.return = node;
37 | node = node.child;
38 | continue;
39 | }
40 | }
41 | if (node === current) {
42 | return;
43 | }
44 | while (node.sibling == null) {
45 | if (node.return == null || node.return === current) {
46 | return;
47 | }
48 | node = node.return;
49 | }
50 | node.sibling.return = node.return;
51 | node = node.sibling;
52 | }
53 | }
54 |
55 | export function commitPlacement(finishedWork) {
56 | const parent = getHostParent(finishedWork);
57 | let node = finishedWork;
58 | while (true) {
59 | if (node.tag === HostComponent || node.tag === HostText) {
60 | appendChild(parent, node.stateNode);
61 | } else if (node.child != null) {
62 | node.child.return = node;
63 | node = node.child;
64 | continue;
65 | }
66 | while (true) {
67 | if (node.return == null || node.return === finishedWork) {
68 | return;
69 | }
70 | node = node.return;
71 | }
72 | }
73 | }
74 |
75 | export function commitWork(finishedWork) {
76 | switch (finishedWork.tag) {
77 | case HostComponent: {
78 | const instance = finishedWork.stateNode;
79 | if (instance != null) {
80 | const newProps = finishedWork.memoizedProps;
81 | const updatePayload = finishedWork.updateQueue;
82 | finishedWork.updateQueue = null;
83 | if (updatePayload != null) {
84 | commitUpdate(instance, updatePayload, newProps);
85 | }
86 | }
87 | return;
88 | }
89 | case HostText: {
90 | const textInstance = finishedWork.stateNode;
91 | const newText = finishedWork.memoizedProps;
92 | textInstance.nodeValue = newText;
93 | return;
94 | }
95 | }
96 | }
97 |
98 | function commitUpdate(domElement, updatePayload, newProps) {
99 | updateFiberProps(domElement, newProps);
100 | updateDOMProperties(domElement, updatePayload);
101 | }
102 |
103 | function getHostParent(fiber) {
104 | let parent = fiber.return;
105 |
106 | while (true) {
107 | switch (parent.tag) {
108 | case HostComponent:
109 | return parent.stateNode;
110 | case HostRoot:
111 | return parent.stateNode.containerInfo;
112 | }
113 | parent = parent.return;
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/src/FiberCompleteWork.js:
--------------------------------------------------------------------------------
1 | import { setInitialProperties, diffProperties } from "./DomComponent";
2 | import { Placement, Update } from "./TypeOfSideEffect";
3 | import { getRootFromFiber } from "./Fiber";
4 | import { createTextInstance } from "./FiberCommitWork";
5 | import { createInstance, appendChild } from "./DOMFiberEntry";
6 | import {
7 | FunctionalComponent,
8 | ClassComponent,
9 | HostRoot,
10 | HostComponent,
11 | HostText,
12 | } from "./TypeOfWork";
13 | import { Never } from "./FiberExpirationTime";
14 |
15 | export function completeWork(current, workInProgress, renderExpirationTime) {
16 | const newProps = workInProgress.pendingProps;
17 |
18 | switch (workInProgress.tag) {
19 | case FunctionalComponent:
20 | return null;
21 | case ClassComponent: {
22 | return null;
23 | }
24 | case HostRoot: {
25 | if (current == null || current.child == null) {
26 | workInProgress.effectTag &= ~Placement;
27 | }
28 | return null;
29 | }
30 | case HostComponent: {
31 | let root = getRootFromFiber(workInProgress);
32 | let rootContainerInstance = root.containerInfo;
33 | let type = workInProgress.type;
34 | if (current != null && workInProgress.stateNode != null) {
35 | let oldProps = current.memoizedProps;
36 | let updatePayload = diffProperties(oldProps, newProps);
37 |
38 | workInProgress.updateQueue = updatePayload;
39 | if (updatePayload) {
40 | workInProgress.effectTag |= Update;
41 | }
42 | } else {
43 | if (!newProps) {
44 | return null;
45 | }
46 | let instance = createInstance(
47 | type,
48 | newProps,
49 | rootContainerInstance,
50 | workInProgress,
51 | );
52 |
53 | appendAllChildren(instance, workInProgress);
54 | setInitialProperties(instance, type, newProps, rootContainerInstance);
55 | workInProgress.stateNode = instance;
56 | }
57 | return null;
58 | }
59 | case HostText: {
60 | let newText = newProps;
61 | if (current && workInProgress.stateNode != null) {
62 | let oldText = current.memoizedProps;
63 | if (oldText !== newText) {
64 | workInProgress.effectTag |= Update;
65 | }
66 | } else {
67 | if (typeof newText !== "string") {
68 | return null;
69 | }
70 | workInProgress.stateNode = createTextInstance(newText, workInProgress);
71 | }
72 | return null;
73 | }
74 | }
75 | }
76 |
77 | function appendAllChildren(parent, workInProgress) {
78 | let node = workInProgress.child;
79 | while (node != null) {
80 | if (node.tag === HostComponent || node.tag === HostText) {
81 | appendChild(parent, node.stateNode);
82 | } else if (node.child != null) {
83 | node = node.child;
84 | continue;
85 | }
86 | if (node === workInProgress) {
87 | return;
88 | }
89 | while (node.sibling == null) {
90 | if (node.return == null || node.return === workInProgress) {
91 | return;
92 | }
93 | node = node.return;
94 | }
95 | node = node.sibling;
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/src/FiberExpirationTime.js:
--------------------------------------------------------------------------------
1 | export const NoWork = 0;
2 | export const Sync = 1;
3 | export const Never = 1073741823;
4 |
5 | const UNIT_SIZE = 10;
6 | const MAGIC_NUMBER_OFFSET = 2;
7 |
8 | // 1 unit of expiration time represents 10ms.
9 | export function msToExpirationTime(ms) {
10 | // Always add an offset so that we don't clash with the magic number for NoWork.
11 | return ((ms / UNIT_SIZE) | 0) + MAGIC_NUMBER_OFFSET;
12 | }
13 |
14 | function ceiling(num, precision) {
15 | return (((num / precision) | 0) + 1) * precision;
16 | }
17 |
18 | export function computeExpirationBucket(
19 | currentTime,
20 | expirationInMs,
21 | bucketSizeMs,
22 | ) {
23 | return ceiling(
24 | currentTime + expirationInMs / UNIT_SIZE,
25 | bucketSizeMs / UNIT_SIZE,
26 | );
27 | }
28 |
--------------------------------------------------------------------------------
/src/FiberHooks.js:
--------------------------------------------------------------------------------
1 | import {
2 | computeExpirationForFiber,
3 | recalculateCurrentTime,
4 | scheduleWork,
5 | } from "./FiberScheduler";
6 | import { NoWork } from "./FiberExpirationTime";
7 | import { markWorkInProgressReceivedUpdate } from "./FiberBeginWork";
8 |
9 | let renderExpirationTime = NoWork;
10 | // The work-in-progress fiber. I've named it differently to distinguish it from
11 | // the work-in-progress hook.
12 | let currentlyRenderingFiber = null;
13 |
14 | // Hooks are stored as a linked list on the fiber's memoizedState field. The
15 | // current hook list is the list that belongs to the current fiber. The
16 | // work-in-progress hook list is a new list that will be added to the
17 | // work-in-progress fiber.
18 | let firstCurrentHook = null;
19 | let currentHook = null;
20 | let firstWorkInProgressHook = null;
21 | let workInProgressHook = null;
22 |
23 | let remainingExpirationTime = NoWork;
24 | let componentUpdateQueue = null;
25 |
26 | // Updates scheduled during render will trigger an immediate re-render at the
27 | // end of the current pass. We can't store these updates on the normal queue,
28 | // because if the work is aborted, they should be discarded. Because this is
29 | // a relatively rare case, we also don't want to add an additional field to
30 | // either the hook or queue object types. So we store them in a lazily create
31 | // map of queue -> render-phase updates, which are discarded once the component
32 | // completes without re-rendering.
33 |
34 | // Whether the work-in-progress hook is a re-rendered hook
35 | let isReRender = false;
36 | // Whether an update was scheduled during the currently executing render pass.
37 | let didScheduleRenderPhaseUpdate = false;
38 | // Lazily created map of render-phase updates
39 | let renderPhaseUpdates = null;
40 |
41 | export function prepareToUseHooks(
42 | current,
43 | workInProgress,
44 | nextRenderExpirationTime,
45 | ) {
46 | renderExpirationTime = nextRenderExpirationTime;
47 | currentlyRenderingFiber = workInProgress;
48 | firstCurrentHook = current != null ? current.memoizedState : null;
49 | }
50 |
51 | export function finishHooks(Component, props, children) {
52 | // This must be called after every function component to prevent hooks from
53 | // being used in classes.
54 |
55 | while (didScheduleRenderPhaseUpdate) {
56 | // Updates were scheduled during the render phase. They are stored in
57 | // the `renderPhaseUpdates` map. Call the component again, reusing the
58 | // work-in-progress hooks and applying the additional updates on top. Keep
59 | // restarting until no more updates are scheduled.
60 | didScheduleRenderPhaseUpdate = false;
61 |
62 | // Start over from the beginning of the list
63 | currentHook = null;
64 | workInProgressHook = null;
65 | componentUpdateQueue = null;
66 |
67 | children = Component(props);
68 | }
69 | renderPhaseUpdates = null;
70 |
71 | const renderedWork = currentlyRenderingFiber;
72 |
73 | renderedWork.memoizedState = firstWorkInProgressHook;
74 | renderedWork.expirationTime = remainingExpirationTime;
75 | renderedWork.updateQueue = componentUpdateQueue;
76 |
77 | renderExpirationTime = NoWork;
78 | currentlyRenderingFiber = null;
79 |
80 | firstCurrentHook = null;
81 | currentHook = null;
82 | firstWorkInProgressHook = null;
83 | workInProgressHook = null;
84 |
85 | remainingExpirationTime = NoWork;
86 | componentUpdateQueue = null;
87 | return children;
88 | }
89 |
90 | function createHook() {
91 | return {
92 | memoizedState: null,
93 |
94 | baseState: null,
95 | queue: null,
96 | baseUpdate: null,
97 |
98 | next: null,
99 | };
100 | }
101 |
102 | function cloneHook(hook) {
103 | return {
104 | memoizedState: hook.memoizedState,
105 |
106 | baseState: hook.baseState,
107 | queue: hook.queue,
108 | baseUpdate: hook.baseUpdate,
109 |
110 | next: null,
111 | };
112 | }
113 |
114 | function createWorkInProgressHook() {
115 | if (workInProgressHook == null) {
116 | // This is the first hook in the list
117 | if (firstWorkInProgressHook == null) {
118 | isReRender = false;
119 | currentHook = firstCurrentHook;
120 | if (currentHook == null) {
121 | // This is a newly mounted hook
122 | workInProgressHook = createHook();
123 | } else {
124 | // Clone the current hook.
125 | workInProgressHook = cloneHook(currentHook);
126 | }
127 | firstWorkInProgressHook = workInProgressHook;
128 | } else {
129 | // There's already a work-in-progress. Reuse it.
130 | isReRender = true;
131 | currentHook = firstCurrentHook;
132 | workInProgressHook = firstWorkInProgressHook;
133 | }
134 | } else {
135 | if (workInProgressHook.next == null) {
136 | isReRender = false;
137 | let hook;
138 | if (currentHook == null) {
139 | // This is a newly mounted hook
140 | hook = createHook();
141 | } else {
142 | currentHook = currentHook.next;
143 | if (currentHook == null) {
144 | // This is a newly mounted hook
145 | hook = createHook();
146 | } else {
147 | // Clone the current hook.
148 | hook = cloneHook(currentHook);
149 | }
150 | }
151 | // Append to the end of the list
152 | workInProgressHook = workInProgressHook.next = hook;
153 | } else {
154 | // There's already a work-in-progress. Reuse it.
155 | isReRender = true;
156 | workInProgressHook = workInProgressHook.next;
157 | currentHook = currentHook != null ? currentHook.next : null;
158 | }
159 | }
160 | return workInProgressHook;
161 | }
162 |
163 | function basicStateReducer(state, action) {
164 | return typeof action === "function" ? action(state) : action;
165 | }
166 |
167 | export function useState(initialState) {
168 | return useReducer(basicStateReducer, initialState);
169 | }
170 |
171 | export function useReducer(reducer, initialState, initialAction) {
172 | workInProgressHook = createWorkInProgressHook();
173 | let queue = workInProgressHook.queue;
174 | if (queue != null) {
175 | // Already have a queue, so this is an update.
176 | if (isReRender) {
177 | // This is a re-render. Apply the new render phase updates to the previous
178 | // work-in-progress hook.
179 | const dispatch = queue.dispatch;
180 | if (renderPhaseUpdates != null) {
181 | // Render phase updates are stored in a map of queue -> linked list
182 | const firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
183 | if (firstRenderPhaseUpdate !== undefined) {
184 | renderPhaseUpdates.delete(queue);
185 | let newState = workInProgressHook.memoizedState;
186 | let update = firstRenderPhaseUpdate;
187 | do {
188 | // Process this render phase update. We don't have to check the
189 | // priority because it will always be the same as the current
190 | // render's.
191 | const action = update.action;
192 | newState = reducer(newState, action);
193 | update = update.next;
194 | } while (update != null);
195 |
196 | workInProgressHook.memoizedState = newState;
197 |
198 | // Don't persist the state accumlated from the render phase updates to
199 | // the base state unless the queue is empty.
200 | // TODO: Not sure if this is the desired semantics, but it's what we
201 | // do for gDSFP. I can't remember why.
202 | if (workInProgressHook.baseUpdate === queue.last) {
203 | workInProgressHook.baseState = newState;
204 | }
205 |
206 | return [newState, dispatch];
207 | }
208 | }
209 | return [workInProgressHook.memoizedState, dispatch];
210 | }
211 |
212 | // The last update in the entire queue
213 | const last = queue.last;
214 | // The last update that is part of the base state.
215 | const baseUpdate = workInProgressHook.baseUpdate;
216 |
217 | // Find the first unprocessed update.
218 | let first;
219 | if (baseUpdate != null) {
220 | if (last != null) {
221 | // For the first update, the queue is a circular linked list where
222 | // `queue.last.next = queue.first`. Once the first update commits, and
223 | // the `baseUpdate` is no longer empty, we can unravel the list.
224 | last.next = null;
225 | }
226 | first = baseUpdate.next;
227 | } else {
228 | first = last != null ? last.next : null;
229 | }
230 | if (first != null) {
231 | let newState = workInProgressHook.baseState;
232 | let newBaseState = null;
233 | let newBaseUpdate = null;
234 | let prevUpdate = baseUpdate;
235 | let update = first;
236 | let didSkip = false;
237 | do {
238 | const updateExpirationTime = update.expirationTime;
239 | if (updateExpirationTime < renderExpirationTime) {
240 | // Priority is insufficient. Skip this update. If this is the first
241 | // skipped update, the previous update/state is the new base
242 | // update/state.
243 | if (!didSkip) {
244 | didSkip = true;
245 | newBaseUpdate = prevUpdate;
246 | newBaseState = newState;
247 | }
248 | // Update the remaining priority in the queue.
249 | if (updateExpirationTime > remainingExpirationTime) {
250 | remainingExpirationTime = updateExpirationTime;
251 | }
252 | } else {
253 | // Process this update.
254 | const action = update.action;
255 | newState = reducer(newState, action);
256 | }
257 | prevUpdate = update;
258 | update = update.next;
259 | } while (update != null && update !== first);
260 |
261 | if (!didSkip) {
262 | newBaseUpdate = prevUpdate;
263 | newBaseState = newState;
264 | }
265 |
266 | workInProgressHook.memoizedState = newState;
267 | workInProgressHook.baseUpdate = newBaseUpdate;
268 | workInProgressHook.baseState = newBaseState;
269 |
270 | // Mark that the fiber performed work, but only if the new state is
271 | // different from the current state.
272 | if (newState !== currentHook.memoizedState) {
273 | markWorkInProgressReceivedUpdate();
274 | }
275 | }
276 |
277 | const dispatch = queue.dispatch;
278 | return [workInProgressHook.memoizedState, dispatch];
279 | }
280 |
281 | // There's no existing queue, so this is the initial render.
282 | if (reducer === basicStateReducer) {
283 | // Special case for `useState`.
284 | if (typeof initialState === "function") {
285 | initialState = initialState();
286 | }
287 | } else if (initialAction !== undefined && initialAction != null) {
288 | initialState = reducer(initialState, initialAction);
289 | }
290 | workInProgressHook.memoizedState = workInProgressHook.baseState = initialState;
291 | queue = workInProgressHook.queue = {
292 | last: null,
293 | dispatch: null,
294 | };
295 | const dispatch = (queue.dispatch = dispatchAction.bind(
296 | null,
297 | currentlyRenderingFiber,
298 | queue,
299 | ));
300 | return [workInProgressHook.memoizedState, dispatch];
301 | }
302 |
303 | function dispatchAction(fiber, queue, action) {
304 | const alternate = fiber.alternate;
305 | if (
306 | fiber === currentlyRenderingFiber ||
307 | (alternate != null && alternate === currentlyRenderingFiber)
308 | ) {
309 | // This is a render phase update. Stash it in a lazily-created map of
310 | // queue -> linked list of updates. After this render pass, we'll restart
311 | // and apply the stashed updates on top of the work-in-progress hook.
312 | didScheduleRenderPhaseUpdate = true;
313 | const update = {
314 | expirationTime: renderExpirationTime,
315 | action,
316 | next: null,
317 | };
318 | if (renderPhaseUpdates == null) {
319 | renderPhaseUpdates = new Map();
320 | }
321 | const firstRenderPhaseUpdate = renderPhaseUpdates.get(queue);
322 | if (firstRenderPhaseUpdate === undefined) {
323 | renderPhaseUpdates.set(queue, update);
324 | } else {
325 | // Append the update to the end of the list.
326 | let lastRenderPhaseUpdate = firstRenderPhaseUpdate;
327 | while (lastRenderPhaseUpdate.next != null) {
328 | lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
329 | }
330 | lastRenderPhaseUpdate.next = update;
331 | }
332 | } else {
333 | const currentTime = recalculateCurrentTime();
334 | const expirationTime = computeExpirationForFiber(currentTime, fiber);
335 | const update = {
336 | expirationTime,
337 | action,
338 | next: null,
339 | };
340 | // Append the update to the end of the list.
341 | const last = queue.last;
342 | if (last == null) {
343 | // This is the first update. Create a circular list.
344 | update.next = update;
345 | } else {
346 | const first = last.next;
347 | if (first != null) {
348 | // Still circular.
349 | update.next = first;
350 | }
351 | last.next = update;
352 | }
353 | queue.last = update;
354 | scheduleWork(fiber, expirationTime);
355 | }
356 | }
357 |
358 | export function bailoutHooks(current, workInProgress, expirationTime) {
359 | workInProgress.updateQueue = current.updateQueue;
360 | if (current.expirationTime <= expirationTime) {
361 | current.expirationTime = NoWork;
362 | }
363 | }
364 |
--------------------------------------------------------------------------------
/src/FiberScheduler.js:
--------------------------------------------------------------------------------
1 | import { createWorkInProgress } from "./Fiber";
2 | import { HostRoot } from "./TypeOfWork";
3 | import { completeWork } from "./FiberCompleteWork";
4 | import {
5 | PerformedWork,
6 | Placement,
7 | Update,
8 | PlacementAndUpdate,
9 | Deletion,
10 | } from "./TypeOfSideEffect";
11 | import { commitPlacement, commitDeletion, commitWork } from "./FiberCommitWork";
12 | import { beginWork } from "./FiberBeginWork";
13 | import {
14 | Sync,
15 | NoWork,
16 | msToExpirationTime,
17 | Never,
18 | computeExpirationBucket,
19 | } from "./FiberExpirationTime";
20 | import { AsyncMode } from "./TypeOfMode";
21 |
22 | const timeHeuristicForUnitOfWork = 1;
23 | let nextFlushedExpirationTime = NoWork;
24 | let nextFlushedRoot = null;
25 | let firstScheduledRoot = null;
26 | let lastScheduledRoot = null;
27 | let nextUnitOfWork = null;
28 | let nextEffect = null;
29 | let isBatchingUpdates = false;
30 | let isRendering = false;
31 | let expirationContext = NoWork;
32 | let isWorking = false;
33 | let isCommitting = false;
34 | let lowestPendingInteractiveExpirationTime = NoWork;
35 | let isBatchingInteractiveUpdates = false;
36 | let nextRenderExpirationTime = NoWork;
37 | let mostRecentCurrentTime = msToExpirationTime(0);
38 |
39 | export function scheduleWork(fiber, expirationTime) {
40 | const root = scheduleWorkToRoot(fiber, expirationTime);
41 | if (
42 | // If we're in the render phase, we don't need to schedule this root
43 | // for an update, because we'll do it before we exit...
44 | !isWorking ||
45 | isCommitting ||
46 | root
47 | ) {
48 | const rootExpirationTime = root.expirationTime;
49 | requestWork(root, rootExpirationTime);
50 | }
51 | }
52 |
53 | function scheduleWorkToRoot(fiber, expirationTime) {
54 | // Update the source fiber's expiration time
55 | if (
56 | fiber.expirationTime === NoWork ||
57 | fiber.expirationTime > expirationTime
58 | ) {
59 | fiber.expirationTime = expirationTime;
60 | }
61 | let alternate = fiber.alternate;
62 | if (
63 | alternate != null &&
64 | (alternate.expirationTime === NoWork ||
65 | alternate.expirationTime > expirationTime)
66 | ) {
67 | alternate.expirationTime = expirationTime;
68 | }
69 | // Walk the parent path to the root and update the child expiration time.
70 | let node = fiber.return;
71 | if (node == null && fiber.tag === HostRoot) {
72 | return fiber.stateNode;
73 | }
74 | while (node != null) {
75 | alternate = node.alternate;
76 | if (
77 | node.childExpirationTime === NoWork ||
78 | node.childExpirationTime > expirationTime
79 | ) {
80 | node.childExpirationTime = expirationTime;
81 | if (
82 | alternate != null &&
83 | (alternate.childExpirationTime === NoWork ||
84 | alternate.childExpirationTime > expirationTime)
85 | ) {
86 | alternate.childExpirationTime = expirationTime;
87 | }
88 | } else if (
89 | alternate != null &&
90 | (alternate.childExpirationTime === NoWork ||
91 | alternate.childExpirationTime > expirationTime)
92 | ) {
93 | alternate.childExpirationTime = expirationTime;
94 | }
95 | if (node.return == null && node.tag === HostRoot) {
96 | return node.stateNode;
97 | }
98 | node = node.return;
99 | }
100 | return null;
101 | }
102 |
103 | function requestWork(root, expirationTime) {
104 | addRootToSchedule(root, expirationTime);
105 |
106 | if (isBatchingUpdates || isRendering) {
107 | return;
108 | }
109 | if (expirationTime === Sync) {
110 | performWork(Sync, null);
111 | } else {
112 | requestIdleCallback(performAsyncWork);
113 | }
114 | }
115 |
116 | function addRootToSchedule(root, expirationTime) {
117 | // Add the root to the schedule.
118 | // Check if this root is already part of the schedule.
119 | if (root.nextScheduledRoot == null) {
120 | // This root is not already scheduled. Add it.
121 | root.remainingExpirationTime = expirationTime;
122 | if (lastScheduledRoot == null) {
123 | firstScheduledRoot = lastScheduledRoot = root;
124 | root.nextScheduledRoot = root;
125 | } else {
126 | lastScheduledRoot.nextScheduledRoot = root;
127 | lastScheduledRoot = root;
128 | lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
129 | }
130 | } else {
131 | // This root is already scheduled, but its priority may have increased.
132 | var remainingExpirationTime = root.remainingExpirationTime;
133 | if (
134 | remainingExpirationTime === NoWork ||
135 | expirationTime < remainingExpirationTime
136 | ) {
137 | // Update the priority.
138 | root.remainingExpirationTime = expirationTime;
139 | }
140 | }
141 | }
142 |
143 | function performAsyncWork(deadline) {
144 | performWork(NoWork, deadline);
145 | }
146 |
147 | function performSyncWork() {
148 | performWork(Sync, null);
149 | }
150 |
151 | function findHighestPriorityRoot() {
152 | var highestPriorityWork = NoWork;
153 | var highestPriorityRoot = null;
154 | if (lastScheduledRoot != null) {
155 | var previousScheduledRoot = lastScheduledRoot;
156 | var root = firstScheduledRoot;
157 | while (root != null) {
158 | var remainingExpirationTime = root.remainingExpirationTime;
159 | if (remainingExpirationTime === NoWork) {
160 | // This root no longer has work. Remove it from the scheduler.
161 |
162 | // TODO: This check is redudant, but Flow is confused by the branch
163 | // below where we set lastScheduledRoot to null, even though we break
164 | // from the loop right after.
165 | !(previousScheduledRoot != null && lastScheduledRoot != null)
166 | ? invariant(
167 | false,
168 | "Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue.",
169 | )
170 | : void 0;
171 | if (root === root.nextScheduledRoot) {
172 | // This is the only root in the list.
173 | root.nextScheduledRoot = null;
174 | firstScheduledRoot = lastScheduledRoot = null;
175 | break;
176 | } else if (root === firstScheduledRoot) {
177 | // This is the first root in the list.
178 | var next = root.nextScheduledRoot;
179 | firstScheduledRoot = next;
180 | lastScheduledRoot.nextScheduledRoot = next;
181 | root.nextScheduledRoot = null;
182 | } else if (root === lastScheduledRoot) {
183 | // This is the last root in the list.
184 | lastScheduledRoot = previousScheduledRoot;
185 | lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
186 | root.nextScheduledRoot = null;
187 | break;
188 | } else {
189 | previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot;
190 | root.nextScheduledRoot = null;
191 | }
192 | root = previousScheduledRoot.nextScheduledRoot;
193 | } else {
194 | if (
195 | highestPriorityWork === NoWork ||
196 | remainingExpirationTime < highestPriorityWork
197 | ) {
198 | // Update the priority, if it's higher
199 | highestPriorityWork = remainingExpirationTime;
200 | highestPriorityRoot = root;
201 | }
202 | if (root === lastScheduledRoot) {
203 | break;
204 | }
205 | previousScheduledRoot = root;
206 | root = root.nextScheduledRoot;
207 | }
208 | }
209 | }
210 |
211 | // If the next root is the same as the previous root, this is a nested
212 | // update. To prevent an infinite loop, increment the nested update count.
213 | nextFlushedRoot = highestPriorityRoot;
214 | nextFlushedExpirationTime = highestPriorityWork;
215 | }
216 |
217 | function performWork(minExpirationTime, deadline) {
218 | // Keep working on roots until there's no more work, or until the we reach
219 | // the deadline.
220 | findHighestPriorityRoot();
221 |
222 | if (deadline) {
223 | while (
224 | nextFlushedRoot != null &&
225 | nextFlushedExpirationTime !== NoWork &&
226 | (minExpirationTime === NoWork ||
227 | minExpirationTime >= nextFlushedExpirationTime) &&
228 | (deadline.timeRemaining() > timeHeuristicForUnitOfWork ||
229 | recalculateCurrentTime() >= nextFlushedExpirationTime)
230 | ) {
231 | performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, deadline);
232 | findHighestPriorityRoot();
233 | }
234 | } else {
235 | while (
236 | nextFlushedRoot != null &&
237 | nextFlushedExpirationTime !== NoWork &&
238 | (minExpirationTime === NoWork ||
239 | minExpirationTime >= nextFlushedExpirationTime)
240 | ) {
241 | performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, false);
242 | findHighestPriorityRoot();
243 | }
244 | }
245 |
246 | if (nextFlushedExpirationTime === NoWork) {
247 | nextFlushedRoot = null;
248 | } else {
249 | requestIdleCallback(performAsyncWork);
250 | }
251 | }
252 |
253 | function performWorkOnRoot(root, expirationTime, deadline) {
254 | isRendering = true;
255 | if (expirationTime <= recalculateCurrentTime()) {
256 | // Flush sync work.
257 | let finishedWork = root.finishedWork;
258 | if (finishedWork != null) {
259 | // This root is already complete. We can commit it.
260 | root.finishedWork = null;
261 | root.remainingExpirationTime = commitRoot(finishedWork);
262 | } else {
263 | root.finishedWork = null;
264 | finishedWork = renderRoot(root, expirationTime);
265 | if (finishedWork != null) {
266 | // We've completed the root. Commit it.
267 | root.remainingExpirationTime = commitRoot(finishedWork);
268 | }
269 | }
270 | } else {
271 | // Flush async work.
272 | var finishedWork = root.finishedWork;
273 | if (finishedWork != null) {
274 | // This root is already complete. We can commit it.
275 | root.finishedWork = null;
276 | root.remainingExpirationTime = commitRoot(finishedWork);
277 | } else {
278 | root.finishedWork = null;
279 | finishedWork = renderRoot(root, expirationTime, deadline);
280 | if (finishedWork != null) {
281 | // We've completed the root. Check the deadline one more time
282 | // before committing.
283 | if (deadline.timeRemaining() > timeHeuristicForUnitOfWork) {
284 | // Still time left. Commit the root.
285 | root.remainingExpirationTime = commitRoot(finishedWork);
286 | } else {
287 | // There's no time left. Mark this root as complete. We'll come
288 | // back and commit it later.
289 | root.finishedWork = finishedWork;
290 | }
291 | }
292 | }
293 | }
294 |
295 | isRendering = false;
296 | }
297 |
298 | function renderRoot(root, expirationTime, deadline) {
299 | isWorking = true;
300 |
301 | root.isReadyForCommit = false;
302 |
303 | // Check if we're starting from a fresh stack, or if we're resuming from
304 | // previously yielded work.
305 | if (expirationTime !== nextRenderExpirationTime || nextUnitOfWork == null) {
306 | nextRenderExpirationTime = expirationTime;
307 | nextUnitOfWork = createWorkInProgress(
308 | root.current,
309 | null,
310 | nextRenderExpirationTime,
311 | );
312 | }
313 |
314 | workLoop(expirationTime, deadline);
315 |
316 | isWorking = false;
317 |
318 | return root.isReadyForCommit ? root.current.alternate : null;
319 | }
320 |
321 | function workLoop(expirationTime, deadline) {
322 | if (
323 | nextRenderExpirationTime === NoWork ||
324 | nextRenderExpirationTime > expirationTime
325 | ) {
326 | return;
327 | }
328 |
329 | if (nextRenderExpirationTime <= mostRecentCurrentTime) {
330 | // Flush all expired work.
331 | while (nextUnitOfWork != null) {
332 | nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
333 | }
334 | } else {
335 | // Flush asynchronous work until the deadline runs out of time.
336 | while (
337 | nextUnitOfWork != null &&
338 | deadline.timeRemaining() > timeHeuristicForUnitOfWork
339 | ) {
340 | nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
341 | }
342 | }
343 | }
344 |
345 | function performUnitOfWork(workInProgress) {
346 | const current = workInProgress.alternate;
347 | let next = beginWork(current, workInProgress, nextRenderExpirationTime);
348 | workInProgress.memoizedProps = workInProgress.pendingProps;
349 | if (next == null) {
350 | next = completeUnitOfWork(workInProgress);
351 | }
352 | return next;
353 | }
354 |
355 | function completeUnitOfWork(workInProgress) {
356 | while (true) {
357 | let current = workInProgress.alternate;
358 | let next = completeWork(current, workInProgress, nextRenderExpirationTime);
359 |
360 | let returnFiber = workInProgress.return;
361 | let siblingFiber = workInProgress.sibling;
362 |
363 | resetChildExpirationTime(workInProgress, nextRenderExpirationTime);
364 |
365 | if (next != null) {
366 | return next;
367 | }
368 |
369 | if (returnFiber != null) {
370 | if (returnFiber.firstEffect == null) {
371 | returnFiber.firstEffect = workInProgress.firstEffect;
372 | }
373 | if (workInProgress.lastEffect != null) {
374 | if (returnFiber.lastEffect != null) {
375 | returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;
376 | }
377 | returnFiber.lastEffect = workInProgress.lastEffect;
378 | }
379 |
380 | let effectTag = workInProgress.effectTag;
381 | if (effectTag > PerformedWork) {
382 | if (returnFiber.lastEffect != null) {
383 | returnFiber.lastEffect.nextEffect = workInProgress;
384 | } else {
385 | returnFiber.firstEffect = workInProgress;
386 | }
387 | returnFiber.lastEffect = workInProgress;
388 | }
389 | }
390 |
391 | if (siblingFiber != null) {
392 | return siblingFiber;
393 | } else if (returnFiber != null) {
394 | workInProgress = returnFiber;
395 | continue;
396 | } else {
397 | const root = workInProgress.stateNode;
398 | root.isReadyForCommit = true;
399 | return null;
400 | }
401 | }
402 | }
403 |
404 | function commitRoot(finishedWork) {
405 | isWorking = true;
406 | isCommitting = true;
407 |
408 | let root = finishedWork.stateNode;
409 | root.isReadyForCommit = false;
410 |
411 | let firstEffect = null;
412 | if (finishedWork.effectTag > PerformedWork) {
413 | if (finishedWork.lastEffect != null) {
414 | finishedWork.lastEffect.nextEffect = finishedWork;
415 | firstEffect = finishedWork.firstEffect;
416 | } else {
417 | firstEffect = finishedWork;
418 | }
419 | } else {
420 | firstEffect = finishedWork.firstEffect;
421 | }
422 |
423 | nextEffect = firstEffect;
424 | while (nextEffect != null) {
425 | commitAllHostEffects();
426 | }
427 |
428 | root.current = finishedWork;
429 |
430 | isCommitting = false;
431 | isWorking = false;
432 |
433 | return root.current.expirationTime;
434 | }
435 |
436 | function commitAllHostEffects() {
437 | while (nextEffect != null) {
438 | let effectTag = nextEffect.effectTag;
439 |
440 | let primaryEffectTag = effectTag & ~PerformedWork;
441 | switch (primaryEffectTag) {
442 | case Placement: {
443 | commitPlacement(nextEffect);
444 | nextEffect.effectTag &= ~Placement;
445 | break;
446 | }
447 | case PlacementAndUpdate: {
448 | commitPlacement(nextEffect);
449 | nextEffect.effectTag &= ~Placement;
450 |
451 | commitWork(nextEffect);
452 | break;
453 | }
454 | case Update: {
455 | commitWork(nextEffect);
456 | break;
457 | }
458 | case Deletion: {
459 | commitDeletion(nextEffect);
460 | break;
461 | }
462 | }
463 | nextEffect = nextEffect.nextEffect;
464 | }
465 | }
466 |
467 | function computeAsyncExpiration(currentTime) {
468 | // Given the current clock time, returns an expiration time. We use rounding
469 | // to batch like updates together.
470 | // Should complete within ~1000ms. 1200ms max.
471 | const expirationMs = 5000;
472 | const bucketSizeMs = 250;
473 | return computeExpirationBucket(currentTime, expirationMs, bucketSizeMs);
474 | }
475 |
476 | function computeInteractiveExpiration(currentTime) {
477 | // Should complete within ~500ms. 600ms max.
478 | const expirationMs = 500;
479 | const bucketSizeMs = 100;
480 | return computeExpirationBucket(currentTime, expirationMs, bucketSizeMs);
481 | }
482 |
483 | export function recalculateCurrentTime() {
484 | mostRecentCurrentTime = msToExpirationTime(performance.now());
485 | return mostRecentCurrentTime;
486 | }
487 |
488 | export function computeExpirationForFiber(fiber) {
489 | let expirationTime;
490 | if (expirationContext !== NoWork) {
491 | // An explicit expiration context was set;
492 | expirationTime = expirationContext;
493 | } else if (isWorking) {
494 | if (isCommitting) {
495 | // Updates that occur during the commit phase should have sync priority
496 | // by default.
497 | expirationTime = Sync;
498 | } else {
499 | // Updates during the render phase should expire at the same time as
500 | // the work that is being rendered.
501 | expirationTime = nextRenderExpirationTime;
502 | }
503 | } else {
504 | // No explicit expiration context was set, and we're not currently
505 | // performing work. Calculate a new expiration time.
506 | if (fiber.mode & AsyncMode) {
507 | if (isBatchingInteractiveUpdates) {
508 | // This is an interactive update
509 | const currentTime = recalculateCurrentTime();
510 | expirationTime = computeInteractiveExpiration(currentTime);
511 | } else {
512 | // This is an async update
513 | const currentTime = recalculateCurrentTime();
514 | expirationTime = computeAsyncExpiration(currentTime);
515 | }
516 | } else {
517 | // This is a sync update
518 | expirationTime = Sync;
519 | }
520 | }
521 | if (isBatchingInteractiveUpdates) {
522 | // This is an interactive update. Keep track of the lowest pending
523 | // interactive expiration time. This allows us to synchronously flush
524 | // all interactive updates when needed.
525 | if (
526 | lowestPendingInteractiveExpirationTime === NoWork ||
527 | expirationTime > lowestPendingInteractiveExpirationTime
528 | ) {
529 | lowestPendingInteractiveExpirationTime = expirationTime;
530 | }
531 | }
532 | return expirationTime;
533 | }
534 |
535 | function resetChildExpirationTime(workInProgress, renderTime) {
536 | if (renderTime !== Never && workInProgress.expirationTime === Never) {
537 | // The children of this component are hidden. Don't bubble their
538 | // expiration times.
539 | return;
540 | }
541 |
542 | let newChildExpirationTime = NoWork;
543 |
544 | let child = workInProgress.child;
545 | while (child != null) {
546 | const childUpdateExpirationTime = child.expirationTime;
547 | const childChildExpirationTime = child.childExpirationTime;
548 | if (childUpdateExpirationTime > newChildExpirationTime) {
549 | newChildExpirationTime = childUpdateExpirationTime;
550 | }
551 | if (childChildExpirationTime > newChildExpirationTime) {
552 | newChildExpirationTime = childChildExpirationTime;
553 | }
554 | child = child.sibling;
555 | }
556 | workInProgress.childExpirationTime = newChildExpirationTime;
557 | }
558 |
559 | export function flushInteractiveUpdates() {
560 | if (!isRendering && lowestPendingInteractiveExpirationTime !== NoWork) {
561 | // Synchronously flush pending interactive updates.
562 | performWork(lowestPendingInteractiveExpirationTime, false, null);
563 | lowestPendingInteractiveExpirationTime = NoWork;
564 | }
565 | }
566 |
567 | export function batchedUpdates(fn, a) {
568 | const previousIsBatchingUpdates = isBatchingUpdates;
569 | isBatchingUpdates = true;
570 | try {
571 | return fn(a);
572 | } finally {
573 | isBatchingUpdates = previousIsBatchingUpdates;
574 | if (!isBatchingUpdates && !isRendering) {
575 | performSyncWork();
576 | }
577 | }
578 | }
579 |
580 | export function interactiveUpdates(fn, a, b) {
581 | if (isBatchingInteractiveUpdates) {
582 | return fn(a, b);
583 | }
584 |
585 | const previousIsBatchingInteractiveUpdates = isBatchingInteractiveUpdates;
586 | isBatchingInteractiveUpdates = true;
587 | try {
588 | return fn(a, b);
589 | } finally {
590 | isBatchingInteractiveUpdates = previousIsBatchingInteractiveUpdates;
591 | }
592 | }
593 |
594 | export function deferredUpdates(fn) {
595 | const previousExpirationContext = expirationContext;
596 | const currentTime = recalculateCurrentTime();
597 | expirationContext = computeAsyncExpiration(currentTime);
598 | try {
599 | return fn();
600 | } finally {
601 | expirationContext = previousExpirationContext;
602 | }
603 | }
604 |
--------------------------------------------------------------------------------
/src/TypeOfMode.js:
--------------------------------------------------------------------------------
1 | export const NoContext = 0b00;
2 | export const AsyncMode = 0b01;
3 | export const StrictMode = 0b10;
4 |
--------------------------------------------------------------------------------
/src/TypeOfSideEffect.js:
--------------------------------------------------------------------------------
1 | export const NoEffect = 0;
2 | export const PerformedWork = 1;
3 | export const Placement = 2;
4 | export const Update = 4;
5 | export const PlacementAndUpdate = 6;
6 | export const Deletion = 8;
7 | export const ContentReset = 16;
8 | export const Callback = 32;
9 | export const Err = 64;
10 | export const Ref = 128; // 0b10000000
11 |
--------------------------------------------------------------------------------
/src/TypeOfWork.js:
--------------------------------------------------------------------------------
1 | export const FunctionalComponent = 1;
2 | export const ClassComponent = 2;
3 | export const HostRoot = 3;
4 | export const HostComponent = 5;
5 | export const HostText = 6;
6 | export const Mode = 11;
7 |
--------------------------------------------------------------------------------
/src/UpdateQueue.js:
--------------------------------------------------------------------------------
1 | import { NoWork } from "./FiberExpirationTime";
2 | import { ClassComponent, HostRoot } from "./TypeOfWork";
3 |
4 | export function insertUpdateIntoFiber(fiber, update) {
5 | let alternateFiber = fiber.alternate;
6 |
7 | let queue1 = fiber.updateQueue;
8 | if (queue1 == null) {
9 | queue1 = fiber.updateQueue = createUpdateQueue();
10 | }
11 |
12 | let queue2 = null;
13 | if (alternateFiber != null) {
14 | queue2 = alternateFiber.updateQueue;
15 | if (queue2 == null) {
16 | queue2 = alternateFiber.updateQueue = createUpdateQueue();
17 | }
18 | }
19 |
20 | // If there's only one queue, add the update to that queue and exit.
21 | if (queue2 == null) {
22 | insertUpdateIntoQueue(queue1, update);
23 | return;
24 | }
25 |
26 | // If either queue is empty, we need to add to both queues.
27 | if (queue1.last == null || queue2.last == null) {
28 | insertUpdateIntoQueue(queue1, update);
29 | insertUpdateIntoQueue(queue2, update);
30 | return;
31 | }
32 |
33 | // If both lists are not empty, the last update is the same for both lists
34 | // because of structural sharing. So, we should only append to one of
35 | // the lists.
36 | insertUpdateIntoQueue(queue1, update);
37 | // But we still need to update the `last` pointer of queue2.
38 | queue2.last = update;
39 | }
40 |
41 | function createUpdateQueue() {
42 | return {
43 | first: null,
44 | last: null,
45 | };
46 | }
47 |
48 | function insertUpdateIntoQueue(queue, update) {
49 | if (queue.last == null) {
50 | queue.first = queue.last = update;
51 | } else {
52 | queue.last.next = update;
53 | queue.last = update;
54 | }
55 | }
56 |
57 | export function createUpdate(partialState, expirationTime) {
58 | return {
59 | partialState,
60 | expirationTime,
61 | next: null,
62 | callback: null,
63 | };
64 | }
65 |
66 | export function processUpdateQueue(
67 | current,
68 | workInProgress,
69 | queue,
70 | instance,
71 | props,
72 | renderExpirationTime,
73 | ) {
74 | if (current != null && current.updateQueue === queue) {
75 | // We need to create a work-in-progress queue, by cloning the current queue.
76 | const currentQueue = queue;
77 | queue = workInProgress.updateQueue = {
78 | first: currentQueue.first,
79 | last: currentQueue.last,
80 | };
81 | }
82 |
83 | // Reset the remaining expiration time. If we skip over any updates, we'll
84 | // increase this accordingly.
85 | queue.expirationTime = NoWork;
86 |
87 | // TODO: We don't know what the base state will be until we begin work.
88 | // It depends on which fiber is the next current. Initialize with an empty
89 | // base state, then set to the memoizedState when rendering. Not super
90 | // happy with this approach.
91 | let state = workInProgress.memoizedState;
92 | let update = queue.first;
93 | let didSkip = false;
94 | let newExpirationTime = NoWork;
95 | while (update != null) {
96 | const updateExpirationTime = update.expirationTime;
97 | if (updateExpirationTime > renderExpirationTime) {
98 | // This update does not have sufficient priority. Skip it.
99 | if (!didSkip) {
100 | didSkip = true;
101 | queue.baseState = state;
102 | }
103 | // Since this update will remain in the list, update the remaining
104 | // expiration time.
105 | if (
106 | newExpirationTime === NoWork ||
107 | newExpirationTime > updateExpirationTime
108 | ) {
109 | newExpirationTime = updateExpirationTime;
110 | }
111 | // Continue to the next update.
112 | update = update.next;
113 | continue;
114 | }
115 |
116 | // This update does have sufficient priority.
117 |
118 | // If no previous updates were skipped, drop this update from the queue by
119 | // advancing the head of the list.
120 | if (!didSkip) {
121 | queue.first = update.next;
122 | if (queue.first == null) {
123 | queue.last = null;
124 | }
125 | }
126 |
127 | // Process the update
128 | let partialState = getStateFromUpdate(update, instance, state, props);
129 | if (partialState) {
130 | state = Object.assign({}, state, partialState);
131 | }
132 | update = update.next;
133 | }
134 |
135 | if (!didSkip) {
136 | didSkip = true;
137 | queue.baseState = state;
138 | }
139 |
140 | // Set the remaining expiration time to be whatever is remaining in the queue.
141 | // This should be fine because the only two other things that contribute to
142 | // expiration time are props and context. We're already in the middle of the
143 | // begin phase by the time we start processing the queue, so we've already
144 | // dealt with the props. Context in components that specify
145 | // shouldComponentUpdate is tricky; but we'll have to account for
146 | // that regardless.
147 | workInProgress.expirationTime = newExpirationTime;
148 | workInProgress.memoizedState = state;
149 | }
150 |
151 | function getStateFromUpdate(update, instance, prevState, props) {
152 | const partialState = update.partialState;
153 | if (typeof partialState === "function") {
154 | return partialState.call(instance, prevState, props);
155 | } else {
156 | return partialState;
157 | }
158 | }
159 |
--------------------------------------------------------------------------------
/src/createElement.js:
--------------------------------------------------------------------------------
1 | export const REACT_ELEMENT_TYPE = Symbol.for("react.element");
2 | export const REACT_ASYNC_MODE_TYPE = Symbol.for("react.async_mode");
3 | export const REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode");
4 |
5 | export function createElement(type, config, children) {
6 | let propName;
7 | const props = {};
8 | let key;
9 |
10 | if (config != null) {
11 | if (config.key) {
12 | key = config.key;
13 | }
14 | for (propName in config) {
15 | props[propName] = config[propName];
16 | }
17 | }
18 |
19 | const childrenLength = arguments.length - 2;
20 | if (childrenLength === 1) {
21 | props.children = children;
22 | } else if (childrenLength > 1) {
23 | const childArray = Array(childrenLength);
24 | for (let i = 0; i < childrenLength; i++) {
25 | childArray[i] = arguments[i + 2];
26 | }
27 | props.children = childArray;
28 | }
29 |
30 | return {
31 | $$typeof: REACT_ELEMENT_TYPE,
32 | type,
33 | key,
34 | props,
35 | };
36 | }
37 |
--------------------------------------------------------------------------------
/src/render.js:
--------------------------------------------------------------------------------
1 | import { HostRoot } from "./TypeOfWork";
2 | import { insertUpdateIntoFiber, createUpdate } from "./UpdateQueue";
3 | import { scheduleWork, computeExpirationForFiber } from "./FiberScheduler";
4 | import { FiberNode } from "./Fiber";
5 | import { NoWork } from "./FiberExpirationTime";
6 | import { AsyncMode, NoContext, StrictMode } from "./TypeOfMode";
7 |
8 | export function render(element, container) {
9 | let root = container._reactRootContainer;
10 | if (!root) {
11 | root = createFiberRoot(container, false);
12 | container._reactRootContainer = root;
13 | }
14 | updateContainer(element, root);
15 | }
16 |
17 | function updateContainer(element, root) {
18 | const current = root.current;
19 | const expirationTime = computeExpirationForFiber(current);
20 | const update = createUpdate({ element }, expirationTime);
21 |
22 | root.expirationTime = expirationTime;
23 | insertUpdateIntoFiber(current, update);
24 | scheduleWork(current, expirationTime);
25 | }
26 |
27 | function createFiberRoot(containerInfo, isAsync) {
28 | const mode = isAsync ? AsyncMode | StrictMode : NoContext;
29 | const uninitializedFiber = new FiberNode(HostRoot, null, null, mode);
30 | const root = {
31 | current: uninitializedFiber,
32 | containerInfo: containerInfo,
33 | isScheduled: false,
34 | remainingExpirationTime: NoWork,
35 | };
36 | uninitializedFiber.stateNode = root;
37 | return root;
38 | }
39 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | abbrev@1:
6 | version "1.1.1"
7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
8 |
9 | acorn-dynamic-import@^2.0.0:
10 | version "2.0.2"
11 | resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
12 | dependencies:
13 | acorn "^4.0.3"
14 |
15 | acorn@^4.0.3:
16 | version "4.0.13"
17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
18 |
19 | acorn@^5.0.0:
20 | version "5.3.0"
21 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822"
22 |
23 | ajv-keywords@^2.0.0:
24 | version "2.1.1"
25 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
26 |
27 | ajv@^4.9.1:
28 | version "4.11.8"
29 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
30 | dependencies:
31 | co "^4.6.0"
32 | json-stable-stringify "^1.0.1"
33 |
34 | ajv@^5.1.5:
35 | version "5.5.2"
36 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
37 | dependencies:
38 | co "^4.6.0"
39 | fast-deep-equal "^1.0.0"
40 | fast-json-stable-stringify "^2.0.0"
41 | json-schema-traverse "^0.3.0"
42 |
43 | align-text@^0.1.1, align-text@^0.1.3:
44 | version "0.1.4"
45 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
46 | dependencies:
47 | kind-of "^3.0.2"
48 | longest "^1.0.1"
49 | repeat-string "^1.5.2"
50 |
51 | ansi-regex@^2.0.0:
52 | version "2.1.1"
53 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
54 |
55 | ansi-regex@^3.0.0:
56 | version "3.0.0"
57 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
58 |
59 | ansi-styles@^2.2.1:
60 | version "2.2.1"
61 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
62 |
63 | anymatch@^1.3.0:
64 | version "1.3.2"
65 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
66 | dependencies:
67 | micromatch "^2.1.5"
68 | normalize-path "^2.0.0"
69 |
70 | aproba@^1.0.3:
71 | version "1.2.0"
72 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
73 |
74 | are-we-there-yet@~1.1.2:
75 | version "1.1.4"
76 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
77 | dependencies:
78 | delegates "^1.0.0"
79 | readable-stream "^2.0.6"
80 |
81 | arr-diff@^2.0.0:
82 | version "2.0.0"
83 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
84 | dependencies:
85 | arr-flatten "^1.0.1"
86 |
87 | arr-flatten@^1.0.1:
88 | version "1.1.0"
89 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
90 |
91 | array-unique@^0.2.1:
92 | version "0.2.1"
93 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
94 |
95 | asn1.js@^4.0.0:
96 | version "4.9.2"
97 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a"
98 | dependencies:
99 | bn.js "^4.0.0"
100 | inherits "^2.0.1"
101 | minimalistic-assert "^1.0.0"
102 |
103 | asn1@~0.2.3:
104 | version "0.2.3"
105 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
106 |
107 | assert-plus@1.0.0, assert-plus@^1.0.0:
108 | version "1.0.0"
109 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
110 |
111 | assert-plus@^0.2.0:
112 | version "0.2.0"
113 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
114 |
115 | assert@^1.1.1:
116 | version "1.4.1"
117 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
118 | dependencies:
119 | util "0.10.3"
120 |
121 | async-each@^1.0.0:
122 | version "1.0.1"
123 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
124 |
125 | async@^2.1.2:
126 | version "2.6.0"
127 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
128 | dependencies:
129 | lodash "^4.14.0"
130 |
131 | asynckit@^0.4.0:
132 | version "0.4.0"
133 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
134 |
135 | aws-sign2@~0.6.0:
136 | version "0.6.0"
137 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
138 |
139 | aws4@^1.2.1:
140 | version "1.6.0"
141 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
142 |
143 | babel-code-frame@^6.26.0:
144 | version "6.26.0"
145 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
146 | dependencies:
147 | chalk "^1.1.3"
148 | esutils "^2.0.2"
149 | js-tokens "^3.0.2"
150 |
151 | babel-core@^6.26.0:
152 | version "6.26.0"
153 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
154 | dependencies:
155 | babel-code-frame "^6.26.0"
156 | babel-generator "^6.26.0"
157 | babel-helpers "^6.24.1"
158 | babel-messages "^6.23.0"
159 | babel-register "^6.26.0"
160 | babel-runtime "^6.26.0"
161 | babel-template "^6.26.0"
162 | babel-traverse "^6.26.0"
163 | babel-types "^6.26.0"
164 | babylon "^6.18.0"
165 | convert-source-map "^1.5.0"
166 | debug "^2.6.8"
167 | json5 "^0.5.1"
168 | lodash "^4.17.4"
169 | minimatch "^3.0.4"
170 | path-is-absolute "^1.0.1"
171 | private "^0.1.7"
172 | slash "^1.0.0"
173 | source-map "^0.5.6"
174 |
175 | babel-generator@^6.26.0:
176 | version "6.26.0"
177 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
178 | dependencies:
179 | babel-messages "^6.23.0"
180 | babel-runtime "^6.26.0"
181 | babel-types "^6.26.0"
182 | detect-indent "^4.0.0"
183 | jsesc "^1.3.0"
184 | lodash "^4.17.4"
185 | source-map "^0.5.6"
186 | trim-right "^1.0.1"
187 |
188 | babel-helper-bindify-decorators@^6.24.1:
189 | version "6.24.1"
190 | resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
191 | dependencies:
192 | babel-runtime "^6.22.0"
193 | babel-traverse "^6.24.1"
194 | babel-types "^6.24.1"
195 |
196 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
197 | version "6.24.1"
198 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
199 | dependencies:
200 | babel-helper-explode-assignable-expression "^6.24.1"
201 | babel-runtime "^6.22.0"
202 | babel-types "^6.24.1"
203 |
204 | babel-helper-builder-react-jsx@^6.24.1:
205 | version "6.26.0"
206 | resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
207 | dependencies:
208 | babel-runtime "^6.26.0"
209 | babel-types "^6.26.0"
210 | esutils "^2.0.2"
211 |
212 | babel-helper-explode-assignable-expression@^6.24.1:
213 | version "6.24.1"
214 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
215 | dependencies:
216 | babel-runtime "^6.22.0"
217 | babel-traverse "^6.24.1"
218 | babel-types "^6.24.1"
219 |
220 | babel-helper-explode-class@^6.24.1:
221 | version "6.24.1"
222 | resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
223 | dependencies:
224 | babel-helper-bindify-decorators "^6.24.1"
225 | babel-runtime "^6.22.0"
226 | babel-traverse "^6.24.1"
227 | babel-types "^6.24.1"
228 |
229 | babel-helper-function-name@^6.24.1:
230 | version "6.24.1"
231 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
232 | dependencies:
233 | babel-helper-get-function-arity "^6.24.1"
234 | babel-runtime "^6.22.0"
235 | babel-template "^6.24.1"
236 | babel-traverse "^6.24.1"
237 | babel-types "^6.24.1"
238 |
239 | babel-helper-get-function-arity@^6.24.1:
240 | version "6.24.1"
241 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
242 | dependencies:
243 | babel-runtime "^6.22.0"
244 | babel-types "^6.24.1"
245 |
246 | babel-helper-remap-async-to-generator@^6.24.1:
247 | version "6.24.1"
248 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
249 | dependencies:
250 | babel-helper-function-name "^6.24.1"
251 | babel-runtime "^6.22.0"
252 | babel-template "^6.24.1"
253 | babel-traverse "^6.24.1"
254 | babel-types "^6.24.1"
255 |
256 | babel-helpers@^6.24.1:
257 | version "6.24.1"
258 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
259 | dependencies:
260 | babel-runtime "^6.22.0"
261 | babel-template "^6.24.1"
262 |
263 | babel-loader@^7.1.2:
264 | version "7.1.2"
265 | resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
266 | dependencies:
267 | find-cache-dir "^1.0.0"
268 | loader-utils "^1.0.2"
269 | mkdirp "^0.5.1"
270 |
271 | babel-messages@^6.23.0:
272 | version "6.23.0"
273 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
274 | dependencies:
275 | babel-runtime "^6.22.0"
276 |
277 | babel-plugin-syntax-async-functions@^6.8.0:
278 | version "6.13.0"
279 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
280 |
281 | babel-plugin-syntax-async-generators@^6.5.0:
282 | version "6.13.0"
283 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
284 |
285 | babel-plugin-syntax-class-properties@^6.8.0:
286 | version "6.13.0"
287 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
288 |
289 | babel-plugin-syntax-decorators@^6.13.0:
290 | version "6.13.0"
291 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
292 |
293 | babel-plugin-syntax-dynamic-import@^6.18.0:
294 | version "6.18.0"
295 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
296 |
297 | babel-plugin-syntax-exponentiation-operator@^6.8.0:
298 | version "6.13.0"
299 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
300 |
301 | babel-plugin-syntax-jsx@^6.8.0:
302 | version "6.18.0"
303 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
304 |
305 | babel-plugin-syntax-object-rest-spread@^6.8.0:
306 | version "6.13.0"
307 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
308 |
309 | babel-plugin-syntax-trailing-function-commas@^6.22.0:
310 | version "6.22.0"
311 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
312 |
313 | babel-plugin-transform-async-generator-functions@^6.24.1:
314 | version "6.24.1"
315 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
316 | dependencies:
317 | babel-helper-remap-async-to-generator "^6.24.1"
318 | babel-plugin-syntax-async-generators "^6.5.0"
319 | babel-runtime "^6.22.0"
320 |
321 | babel-plugin-transform-async-to-generator@^6.24.1:
322 | version "6.24.1"
323 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
324 | dependencies:
325 | babel-helper-remap-async-to-generator "^6.24.1"
326 | babel-plugin-syntax-async-functions "^6.8.0"
327 | babel-runtime "^6.22.0"
328 |
329 | babel-plugin-transform-class-properties@^6.24.1:
330 | version "6.24.1"
331 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
332 | dependencies:
333 | babel-helper-function-name "^6.24.1"
334 | babel-plugin-syntax-class-properties "^6.8.0"
335 | babel-runtime "^6.22.0"
336 | babel-template "^6.24.1"
337 |
338 | babel-plugin-transform-decorators@^6.24.1:
339 | version "6.24.1"
340 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
341 | dependencies:
342 | babel-helper-explode-class "^6.24.1"
343 | babel-plugin-syntax-decorators "^6.13.0"
344 | babel-runtime "^6.22.0"
345 | babel-template "^6.24.1"
346 | babel-types "^6.24.1"
347 |
348 | babel-plugin-transform-exponentiation-operator@^6.24.1:
349 | version "6.24.1"
350 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
351 | dependencies:
352 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
353 | babel-plugin-syntax-exponentiation-operator "^6.8.0"
354 | babel-runtime "^6.22.0"
355 |
356 | babel-plugin-transform-object-rest-spread@^6.22.0:
357 | version "6.26.0"
358 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
359 | dependencies:
360 | babel-plugin-syntax-object-rest-spread "^6.8.0"
361 | babel-runtime "^6.26.0"
362 |
363 | babel-plugin-transform-react-jsx@^6.24.1:
364 | version "6.24.1"
365 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
366 | dependencies:
367 | babel-helper-builder-react-jsx "^6.24.1"
368 | babel-plugin-syntax-jsx "^6.8.0"
369 | babel-runtime "^6.22.0"
370 |
371 | babel-preset-stage-2@^6.24.1:
372 | version "6.24.1"
373 | resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
374 | dependencies:
375 | babel-plugin-syntax-dynamic-import "^6.18.0"
376 | babel-plugin-transform-class-properties "^6.24.1"
377 | babel-plugin-transform-decorators "^6.24.1"
378 | babel-preset-stage-3 "^6.24.1"
379 |
380 | babel-preset-stage-3@^6.24.1:
381 | version "6.24.1"
382 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
383 | dependencies:
384 | babel-plugin-syntax-trailing-function-commas "^6.22.0"
385 | babel-plugin-transform-async-generator-functions "^6.24.1"
386 | babel-plugin-transform-async-to-generator "^6.24.1"
387 | babel-plugin-transform-exponentiation-operator "^6.24.1"
388 | babel-plugin-transform-object-rest-spread "^6.22.0"
389 |
390 | babel-register@^6.26.0:
391 | version "6.26.0"
392 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
393 | dependencies:
394 | babel-core "^6.26.0"
395 | babel-runtime "^6.26.0"
396 | core-js "^2.5.0"
397 | home-or-tmp "^2.0.0"
398 | lodash "^4.17.4"
399 | mkdirp "^0.5.1"
400 | source-map-support "^0.4.15"
401 |
402 | babel-runtime@^6.22.0, babel-runtime@^6.26.0:
403 | version "6.26.0"
404 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
405 | dependencies:
406 | core-js "^2.4.0"
407 | regenerator-runtime "^0.11.0"
408 |
409 | babel-template@^6.24.1, babel-template@^6.26.0:
410 | version "6.26.0"
411 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
412 | dependencies:
413 | babel-runtime "^6.26.0"
414 | babel-traverse "^6.26.0"
415 | babel-types "^6.26.0"
416 | babylon "^6.18.0"
417 | lodash "^4.17.4"
418 |
419 | babel-traverse@^6.24.1, babel-traverse@^6.26.0:
420 | version "6.26.0"
421 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
422 | dependencies:
423 | babel-code-frame "^6.26.0"
424 | babel-messages "^6.23.0"
425 | babel-runtime "^6.26.0"
426 | babel-types "^6.26.0"
427 | babylon "^6.18.0"
428 | debug "^2.6.8"
429 | globals "^9.18.0"
430 | invariant "^2.2.2"
431 | lodash "^4.17.4"
432 |
433 | babel-types@^6.24.1, babel-types@^6.26.0:
434 | version "6.26.0"
435 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
436 | dependencies:
437 | babel-runtime "^6.26.0"
438 | esutils "^2.0.2"
439 | lodash "^4.17.4"
440 | to-fast-properties "^1.0.3"
441 |
442 | babylon@^6.18.0:
443 | version "6.18.0"
444 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
445 |
446 | balanced-match@^1.0.0:
447 | version "1.0.0"
448 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
449 |
450 | base64-js@^1.0.2:
451 | version "1.2.1"
452 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
453 |
454 | bcrypt-pbkdf@^1.0.0:
455 | version "1.0.1"
456 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
457 | dependencies:
458 | tweetnacl "^0.14.3"
459 |
460 | big.js@^3.1.3:
461 | version "3.2.0"
462 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
463 |
464 | binary-extensions@^1.0.0:
465 | version "1.11.0"
466 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
467 |
468 | block-stream@*:
469 | version "0.0.9"
470 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
471 | dependencies:
472 | inherits "~2.0.0"
473 |
474 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
475 | version "4.11.8"
476 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
477 |
478 | boom@2.x.x:
479 | version "2.10.1"
480 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
481 | dependencies:
482 | hoek "2.x.x"
483 |
484 | brace-expansion@^1.1.7:
485 | version "1.1.8"
486 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
487 | dependencies:
488 | balanced-match "^1.0.0"
489 | concat-map "0.0.1"
490 |
491 | braces@^1.8.2:
492 | version "1.8.5"
493 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
494 | dependencies:
495 | expand-range "^1.8.1"
496 | preserve "^0.2.0"
497 | repeat-element "^1.1.2"
498 |
499 | brorand@^1.0.1:
500 | version "1.1.0"
501 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
502 |
503 | browserify-aes@^1.0.0, browserify-aes@^1.0.4:
504 | version "1.1.1"
505 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
506 | dependencies:
507 | buffer-xor "^1.0.3"
508 | cipher-base "^1.0.0"
509 | create-hash "^1.1.0"
510 | evp_bytestokey "^1.0.3"
511 | inherits "^2.0.1"
512 | safe-buffer "^5.0.1"
513 |
514 | browserify-cipher@^1.0.0:
515 | version "1.0.0"
516 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
517 | dependencies:
518 | browserify-aes "^1.0.4"
519 | browserify-des "^1.0.0"
520 | evp_bytestokey "^1.0.0"
521 |
522 | browserify-des@^1.0.0:
523 | version "1.0.0"
524 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
525 | dependencies:
526 | cipher-base "^1.0.1"
527 | des.js "^1.0.0"
528 | inherits "^2.0.1"
529 |
530 | browserify-rsa@^4.0.0:
531 | version "4.0.1"
532 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
533 | dependencies:
534 | bn.js "^4.1.0"
535 | randombytes "^2.0.1"
536 |
537 | browserify-sign@^4.0.0:
538 | version "4.0.4"
539 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
540 | dependencies:
541 | bn.js "^4.1.1"
542 | browserify-rsa "^4.0.0"
543 | create-hash "^1.1.0"
544 | create-hmac "^1.1.2"
545 | elliptic "^6.0.0"
546 | inherits "^2.0.1"
547 | parse-asn1 "^5.0.0"
548 |
549 | browserify-zlib@^0.2.0:
550 | version "0.2.0"
551 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
552 | dependencies:
553 | pako "~1.0.5"
554 |
555 | buffer-xor@^1.0.3:
556 | version "1.0.3"
557 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
558 |
559 | buffer@^4.3.0:
560 | version "4.9.1"
561 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
562 | dependencies:
563 | base64-js "^1.0.2"
564 | ieee754 "^1.1.4"
565 | isarray "^1.0.0"
566 |
567 | builtin-modules@^1.0.0:
568 | version "1.1.1"
569 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
570 |
571 | builtin-status-codes@^3.0.0:
572 | version "3.0.0"
573 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
574 |
575 | camelcase@^1.0.2:
576 | version "1.2.1"
577 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
578 |
579 | camelcase@^4.1.0:
580 | version "4.1.0"
581 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
582 |
583 | caseless@~0.12.0:
584 | version "0.12.0"
585 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
586 |
587 | center-align@^0.1.1:
588 | version "0.1.3"
589 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
590 | dependencies:
591 | align-text "^0.1.3"
592 | lazy-cache "^1.0.3"
593 |
594 | chalk@^1.1.3:
595 | version "1.1.3"
596 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
597 | dependencies:
598 | ansi-styles "^2.2.1"
599 | escape-string-regexp "^1.0.2"
600 | has-ansi "^2.0.0"
601 | strip-ansi "^3.0.0"
602 | supports-color "^2.0.0"
603 |
604 | chokidar@^1.7.0:
605 | version "1.7.0"
606 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
607 | dependencies:
608 | anymatch "^1.3.0"
609 | async-each "^1.0.0"
610 | glob-parent "^2.0.0"
611 | inherits "^2.0.1"
612 | is-binary-path "^1.0.0"
613 | is-glob "^2.0.0"
614 | path-is-absolute "^1.0.0"
615 | readdirp "^2.0.0"
616 | optionalDependencies:
617 | fsevents "^1.0.0"
618 |
619 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
620 | version "1.0.4"
621 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
622 | dependencies:
623 | inherits "^2.0.1"
624 | safe-buffer "^5.0.1"
625 |
626 | cliui@^2.1.0:
627 | version "2.1.0"
628 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
629 | dependencies:
630 | center-align "^0.1.1"
631 | right-align "^0.1.1"
632 | wordwrap "0.0.2"
633 |
634 | cliui@^3.2.0:
635 | version "3.2.0"
636 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
637 | dependencies:
638 | string-width "^1.0.1"
639 | strip-ansi "^3.0.1"
640 | wrap-ansi "^2.0.0"
641 |
642 | co@^4.6.0:
643 | version "4.6.0"
644 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
645 |
646 | code-point-at@^1.0.0:
647 | version "1.1.0"
648 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
649 |
650 | combined-stream@^1.0.5, combined-stream@~1.0.5:
651 | version "1.0.5"
652 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
653 | dependencies:
654 | delayed-stream "~1.0.0"
655 |
656 | commondir@^1.0.1:
657 | version "1.0.1"
658 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
659 |
660 | concat-map@0.0.1:
661 | version "0.0.1"
662 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
663 |
664 | console-browserify@^1.1.0:
665 | version "1.1.0"
666 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
667 | dependencies:
668 | date-now "^0.1.4"
669 |
670 | console-control-strings@^1.0.0, console-control-strings@~1.1.0:
671 | version "1.1.0"
672 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
673 |
674 | constants-browserify@^1.0.0:
675 | version "1.0.0"
676 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
677 |
678 | convert-source-map@^1.5.0:
679 | version "1.5.1"
680 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
681 |
682 | core-js@^2.4.0, core-js@^2.5.0:
683 | version "2.5.3"
684 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
685 |
686 | core-util-is@1.0.2, core-util-is@~1.0.0:
687 | version "1.0.2"
688 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
689 |
690 | create-ecdh@^4.0.0:
691 | version "4.0.0"
692 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
693 | dependencies:
694 | bn.js "^4.1.0"
695 | elliptic "^6.0.0"
696 |
697 | create-hash@^1.1.0, create-hash@^1.1.2:
698 | version "1.1.3"
699 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
700 | dependencies:
701 | cipher-base "^1.0.1"
702 | inherits "^2.0.1"
703 | ripemd160 "^2.0.0"
704 | sha.js "^2.4.0"
705 |
706 | create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
707 | version "1.1.6"
708 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
709 | dependencies:
710 | cipher-base "^1.0.3"
711 | create-hash "^1.1.0"
712 | inherits "^2.0.1"
713 | ripemd160 "^2.0.0"
714 | safe-buffer "^5.0.1"
715 | sha.js "^2.4.8"
716 |
717 | cross-spawn@^5.0.1:
718 | version "5.1.0"
719 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
720 | dependencies:
721 | lru-cache "^4.0.1"
722 | shebang-command "^1.2.0"
723 | which "^1.2.9"
724 |
725 | cryptiles@2.x.x:
726 | version "2.0.5"
727 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
728 | dependencies:
729 | boom "2.x.x"
730 |
731 | crypto-browserify@^3.11.0:
732 | version "3.12.0"
733 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
734 | dependencies:
735 | browserify-cipher "^1.0.0"
736 | browserify-sign "^4.0.0"
737 | create-ecdh "^4.0.0"
738 | create-hash "^1.1.0"
739 | create-hmac "^1.1.0"
740 | diffie-hellman "^5.0.0"
741 | inherits "^2.0.1"
742 | pbkdf2 "^3.0.3"
743 | public-encrypt "^4.0.0"
744 | randombytes "^2.0.0"
745 | randomfill "^1.0.3"
746 |
747 | d@1:
748 | version "1.0.0"
749 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
750 | dependencies:
751 | es5-ext "^0.10.9"
752 |
753 | dashdash@^1.12.0:
754 | version "1.14.1"
755 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
756 | dependencies:
757 | assert-plus "^1.0.0"
758 |
759 | date-now@^0.1.4:
760 | version "0.1.4"
761 | resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
762 |
763 | debug@^2.2.0, debug@^2.6.8:
764 | version "2.6.9"
765 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
766 | dependencies:
767 | ms "2.0.0"
768 |
769 | decamelize@^1.0.0, decamelize@^1.1.1:
770 | version "1.2.0"
771 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
772 |
773 | deep-extend@~0.4.0:
774 | version "0.4.2"
775 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
776 |
777 | delayed-stream@~1.0.0:
778 | version "1.0.0"
779 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
780 |
781 | delegates@^1.0.0:
782 | version "1.0.0"
783 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
784 |
785 | des.js@^1.0.0:
786 | version "1.0.0"
787 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
788 | dependencies:
789 | inherits "^2.0.1"
790 | minimalistic-assert "^1.0.0"
791 |
792 | detect-indent@^4.0.0:
793 | version "4.0.0"
794 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
795 | dependencies:
796 | repeating "^2.0.0"
797 |
798 | detect-libc@^1.0.2:
799 | version "1.0.3"
800 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
801 |
802 | diffie-hellman@^5.0.0:
803 | version "5.0.2"
804 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
805 | dependencies:
806 | bn.js "^4.1.0"
807 | miller-rabin "^4.0.0"
808 | randombytes "^2.0.0"
809 |
810 | domain-browser@^1.1.1:
811 | version "1.1.7"
812 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
813 |
814 | ecc-jsbn@~0.1.1:
815 | version "0.1.1"
816 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
817 | dependencies:
818 | jsbn "~0.1.0"
819 |
820 | elliptic@^6.0.0:
821 | version "6.4.0"
822 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
823 | dependencies:
824 | bn.js "^4.4.0"
825 | brorand "^1.0.1"
826 | hash.js "^1.0.0"
827 | hmac-drbg "^1.0.0"
828 | inherits "^2.0.1"
829 | minimalistic-assert "^1.0.0"
830 | minimalistic-crypto-utils "^1.0.0"
831 |
832 | emojis-list@^2.0.0:
833 | version "2.1.0"
834 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
835 |
836 | enhanced-resolve@^3.4.0:
837 | version "3.4.1"
838 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
839 | dependencies:
840 | graceful-fs "^4.1.2"
841 | memory-fs "^0.4.0"
842 | object-assign "^4.0.1"
843 | tapable "^0.2.7"
844 |
845 | errno@^0.1.3:
846 | version "0.1.6"
847 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026"
848 | dependencies:
849 | prr "~1.0.1"
850 |
851 | error-ex@^1.2.0:
852 | version "1.3.1"
853 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
854 | dependencies:
855 | is-arrayish "^0.2.1"
856 |
857 | es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
858 | version "0.10.37"
859 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3"
860 | dependencies:
861 | es6-iterator "~2.0.1"
862 | es6-symbol "~3.1.1"
863 |
864 | es6-iterator@^2.0.1, es6-iterator@~2.0.1:
865 | version "2.0.3"
866 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
867 | dependencies:
868 | d "1"
869 | es5-ext "^0.10.35"
870 | es6-symbol "^3.1.1"
871 |
872 | es6-map@^0.1.3:
873 | version "0.1.5"
874 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
875 | dependencies:
876 | d "1"
877 | es5-ext "~0.10.14"
878 | es6-iterator "~2.0.1"
879 | es6-set "~0.1.5"
880 | es6-symbol "~3.1.1"
881 | event-emitter "~0.3.5"
882 |
883 | es6-set@~0.1.5:
884 | version "0.1.5"
885 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
886 | dependencies:
887 | d "1"
888 | es5-ext "~0.10.14"
889 | es6-iterator "~2.0.1"
890 | es6-symbol "3.1.1"
891 | event-emitter "~0.3.5"
892 |
893 | es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
894 | version "3.1.1"
895 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
896 | dependencies:
897 | d "1"
898 | es5-ext "~0.10.14"
899 |
900 | es6-weak-map@^2.0.1:
901 | version "2.0.2"
902 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
903 | dependencies:
904 | d "1"
905 | es5-ext "^0.10.14"
906 | es6-iterator "^2.0.1"
907 | es6-symbol "^3.1.1"
908 |
909 | escape-string-regexp@^1.0.2:
910 | version "1.0.5"
911 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
912 |
913 | escope@^3.6.0:
914 | version "3.6.0"
915 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
916 | dependencies:
917 | es6-map "^0.1.3"
918 | es6-weak-map "^2.0.1"
919 | esrecurse "^4.1.0"
920 | estraverse "^4.1.1"
921 |
922 | esrecurse@^4.1.0:
923 | version "4.2.0"
924 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
925 | dependencies:
926 | estraverse "^4.1.0"
927 | object-assign "^4.0.1"
928 |
929 | estraverse@^4.1.0, estraverse@^4.1.1:
930 | version "4.2.0"
931 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
932 |
933 | esutils@^2.0.2:
934 | version "2.0.2"
935 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
936 |
937 | event-emitter@~0.3.5:
938 | version "0.3.5"
939 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
940 | dependencies:
941 | d "1"
942 | es5-ext "~0.10.14"
943 |
944 | events@^1.0.0:
945 | version "1.1.1"
946 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
947 |
948 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
949 | version "1.0.3"
950 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
951 | dependencies:
952 | md5.js "^1.3.4"
953 | safe-buffer "^5.1.1"
954 |
955 | execa@^0.7.0:
956 | version "0.7.0"
957 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
958 | dependencies:
959 | cross-spawn "^5.0.1"
960 | get-stream "^3.0.0"
961 | is-stream "^1.1.0"
962 | npm-run-path "^2.0.0"
963 | p-finally "^1.0.0"
964 | signal-exit "^3.0.0"
965 | strip-eof "^1.0.0"
966 |
967 | expand-brackets@^0.1.4:
968 | version "0.1.5"
969 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
970 | dependencies:
971 | is-posix-bracket "^0.1.0"
972 |
973 | expand-range@^1.8.1:
974 | version "1.8.2"
975 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
976 | dependencies:
977 | fill-range "^2.1.0"
978 |
979 | extend@~3.0.0:
980 | version "3.0.1"
981 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
982 |
983 | extglob@^0.3.1:
984 | version "0.3.2"
985 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
986 | dependencies:
987 | is-extglob "^1.0.0"
988 |
989 | extsprintf@1.3.0:
990 | version "1.3.0"
991 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
992 |
993 | extsprintf@^1.2.0:
994 | version "1.4.0"
995 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
996 |
997 | fast-deep-equal@^1.0.0:
998 | version "1.0.0"
999 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
1000 |
1001 | fast-json-stable-stringify@^2.0.0:
1002 | version "2.0.0"
1003 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
1004 |
1005 | filename-regex@^2.0.0:
1006 | version "2.0.1"
1007 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
1008 |
1009 | fill-range@^2.1.0:
1010 | version "2.2.3"
1011 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
1012 | dependencies:
1013 | is-number "^2.1.0"
1014 | isobject "^2.0.0"
1015 | randomatic "^1.1.3"
1016 | repeat-element "^1.1.2"
1017 | repeat-string "^1.5.2"
1018 |
1019 | find-cache-dir@^1.0.0:
1020 | version "1.0.0"
1021 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
1022 | dependencies:
1023 | commondir "^1.0.1"
1024 | make-dir "^1.0.0"
1025 | pkg-dir "^2.0.0"
1026 |
1027 | find-up@^2.0.0, find-up@^2.1.0:
1028 | version "2.1.0"
1029 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
1030 | dependencies:
1031 | locate-path "^2.0.0"
1032 |
1033 | for-in@^1.0.1:
1034 | version "1.0.2"
1035 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
1036 |
1037 | for-own@^0.1.4:
1038 | version "0.1.5"
1039 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
1040 | dependencies:
1041 | for-in "^1.0.1"
1042 |
1043 | forever-agent@~0.6.1:
1044 | version "0.6.1"
1045 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
1046 |
1047 | form-data@~2.1.1:
1048 | version "2.1.4"
1049 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
1050 | dependencies:
1051 | asynckit "^0.4.0"
1052 | combined-stream "^1.0.5"
1053 | mime-types "^2.1.12"
1054 |
1055 | fs.realpath@^1.0.0:
1056 | version "1.0.0"
1057 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1058 |
1059 | fsevents@^1.0.0:
1060 | version "1.1.3"
1061 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
1062 | dependencies:
1063 | nan "^2.3.0"
1064 | node-pre-gyp "^0.6.39"
1065 |
1066 | fstream-ignore@^1.0.5:
1067 | version "1.0.5"
1068 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
1069 | dependencies:
1070 | fstream "^1.0.0"
1071 | inherits "2"
1072 | minimatch "^3.0.0"
1073 |
1074 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
1075 | version "1.0.11"
1076 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
1077 | dependencies:
1078 | graceful-fs "^4.1.2"
1079 | inherits "~2.0.0"
1080 | mkdirp ">=0.5 0"
1081 | rimraf "2"
1082 |
1083 | gauge@~2.7.3:
1084 | version "2.7.4"
1085 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
1086 | dependencies:
1087 | aproba "^1.0.3"
1088 | console-control-strings "^1.0.0"
1089 | has-unicode "^2.0.0"
1090 | object-assign "^4.1.0"
1091 | signal-exit "^3.0.0"
1092 | string-width "^1.0.1"
1093 | strip-ansi "^3.0.1"
1094 | wide-align "^1.1.0"
1095 |
1096 | get-caller-file@^1.0.1:
1097 | version "1.0.2"
1098 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
1099 |
1100 | get-stream@^3.0.0:
1101 | version "3.0.0"
1102 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
1103 |
1104 | getpass@^0.1.1:
1105 | version "0.1.7"
1106 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
1107 | dependencies:
1108 | assert-plus "^1.0.0"
1109 |
1110 | glob-base@^0.3.0:
1111 | version "0.3.0"
1112 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
1113 | dependencies:
1114 | glob-parent "^2.0.0"
1115 | is-glob "^2.0.0"
1116 |
1117 | glob-parent@^2.0.0:
1118 | version "2.0.0"
1119 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
1120 | dependencies:
1121 | is-glob "^2.0.0"
1122 |
1123 | glob@^7.0.5:
1124 | version "7.1.2"
1125 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
1126 | dependencies:
1127 | fs.realpath "^1.0.0"
1128 | inflight "^1.0.4"
1129 | inherits "2"
1130 | minimatch "^3.0.4"
1131 | once "^1.3.0"
1132 | path-is-absolute "^1.0.0"
1133 |
1134 | globals@^9.18.0:
1135 | version "9.18.0"
1136 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
1137 |
1138 | graceful-fs@^4.1.2:
1139 | version "4.1.11"
1140 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1141 |
1142 | har-schema@^1.0.5:
1143 | version "1.0.5"
1144 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
1145 |
1146 | har-validator@~4.2.1:
1147 | version "4.2.1"
1148 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
1149 | dependencies:
1150 | ajv "^4.9.1"
1151 | har-schema "^1.0.5"
1152 |
1153 | has-ansi@^2.0.0:
1154 | version "2.0.0"
1155 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1156 | dependencies:
1157 | ansi-regex "^2.0.0"
1158 |
1159 | has-flag@^2.0.0:
1160 | version "2.0.0"
1161 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
1162 |
1163 | has-unicode@^2.0.0:
1164 | version "2.0.1"
1165 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1166 |
1167 | hash-base@^2.0.0:
1168 | version "2.0.2"
1169 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
1170 | dependencies:
1171 | inherits "^2.0.1"
1172 |
1173 | hash-base@^3.0.0:
1174 | version "3.0.4"
1175 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
1176 | dependencies:
1177 | inherits "^2.0.1"
1178 | safe-buffer "^5.0.1"
1179 |
1180 | hash.js@^1.0.0, hash.js@^1.0.3:
1181 | version "1.1.3"
1182 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
1183 | dependencies:
1184 | inherits "^2.0.3"
1185 | minimalistic-assert "^1.0.0"
1186 |
1187 | hawk@3.1.3, hawk@~3.1.3:
1188 | version "3.1.3"
1189 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
1190 | dependencies:
1191 | boom "2.x.x"
1192 | cryptiles "2.x.x"
1193 | hoek "2.x.x"
1194 | sntp "1.x.x"
1195 |
1196 | hmac-drbg@^1.0.0:
1197 | version "1.0.1"
1198 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
1199 | dependencies:
1200 | hash.js "^1.0.3"
1201 | minimalistic-assert "^1.0.0"
1202 | minimalistic-crypto-utils "^1.0.1"
1203 |
1204 | hoek@2.x.x:
1205 | version "2.16.3"
1206 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
1207 |
1208 | home-or-tmp@^2.0.0:
1209 | version "2.0.0"
1210 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
1211 | dependencies:
1212 | os-homedir "^1.0.0"
1213 | os-tmpdir "^1.0.1"
1214 |
1215 | hosted-git-info@^2.1.4:
1216 | version "2.5.0"
1217 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
1218 |
1219 | http-signature@~1.1.0:
1220 | version "1.1.1"
1221 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
1222 | dependencies:
1223 | assert-plus "^0.2.0"
1224 | jsprim "^1.2.2"
1225 | sshpk "^1.7.0"
1226 |
1227 | https-browserify@^1.0.0:
1228 | version "1.0.0"
1229 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
1230 |
1231 | ieee754@^1.1.4:
1232 | version "1.1.8"
1233 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
1234 |
1235 | indexof@0.0.1:
1236 | version "0.0.1"
1237 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
1238 |
1239 | inflight@^1.0.4:
1240 | version "1.0.6"
1241 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
1242 | dependencies:
1243 | once "^1.3.0"
1244 | wrappy "1"
1245 |
1246 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
1247 | version "2.0.3"
1248 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1249 |
1250 | inherits@2.0.1:
1251 | version "2.0.1"
1252 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
1253 |
1254 | ini@~1.3.0:
1255 | version "1.3.5"
1256 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
1257 |
1258 | interpret@^1.0.0:
1259 | version "1.1.0"
1260 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
1261 |
1262 | invariant@^2.2.2:
1263 | version "2.2.2"
1264 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
1265 | dependencies:
1266 | loose-envify "^1.0.0"
1267 |
1268 | invert-kv@^1.0.0:
1269 | version "1.0.0"
1270 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
1271 |
1272 | is-arrayish@^0.2.1:
1273 | version "0.2.1"
1274 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
1275 |
1276 | is-binary-path@^1.0.0:
1277 | version "1.0.1"
1278 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
1279 | dependencies:
1280 | binary-extensions "^1.0.0"
1281 |
1282 | is-buffer@^1.1.5:
1283 | version "1.1.6"
1284 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
1285 |
1286 | is-builtin-module@^1.0.0:
1287 | version "1.0.0"
1288 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
1289 | dependencies:
1290 | builtin-modules "^1.0.0"
1291 |
1292 | is-dotfile@^1.0.0:
1293 | version "1.0.3"
1294 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
1295 |
1296 | is-equal-shallow@^0.1.3:
1297 | version "0.1.3"
1298 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
1299 | dependencies:
1300 | is-primitive "^2.0.0"
1301 |
1302 | is-extendable@^0.1.1:
1303 | version "0.1.1"
1304 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
1305 |
1306 | is-extglob@^1.0.0:
1307 | version "1.0.0"
1308 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
1309 |
1310 | is-finite@^1.0.0:
1311 | version "1.0.2"
1312 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
1313 | dependencies:
1314 | number-is-nan "^1.0.0"
1315 |
1316 | is-fullwidth-code-point@^1.0.0:
1317 | version "1.0.0"
1318 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1319 | dependencies:
1320 | number-is-nan "^1.0.0"
1321 |
1322 | is-fullwidth-code-point@^2.0.0:
1323 | version "2.0.0"
1324 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
1325 |
1326 | is-glob@^2.0.0, is-glob@^2.0.1:
1327 | version "2.0.1"
1328 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
1329 | dependencies:
1330 | is-extglob "^1.0.0"
1331 |
1332 | is-number@^2.1.0:
1333 | version "2.1.0"
1334 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
1335 | dependencies:
1336 | kind-of "^3.0.2"
1337 |
1338 | is-number@^3.0.0:
1339 | version "3.0.0"
1340 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
1341 | dependencies:
1342 | kind-of "^3.0.2"
1343 |
1344 | is-posix-bracket@^0.1.0:
1345 | version "0.1.1"
1346 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
1347 |
1348 | is-primitive@^2.0.0:
1349 | version "2.0.0"
1350 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
1351 |
1352 | is-stream@^1.1.0:
1353 | version "1.1.0"
1354 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
1355 |
1356 | is-typedarray@~1.0.0:
1357 | version "1.0.0"
1358 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1359 |
1360 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
1361 | version "1.0.0"
1362 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1363 |
1364 | isexe@^2.0.0:
1365 | version "2.0.0"
1366 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1367 |
1368 | isobject@^2.0.0:
1369 | version "2.1.0"
1370 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
1371 | dependencies:
1372 | isarray "1.0.0"
1373 |
1374 | isstream@~0.1.2:
1375 | version "0.1.2"
1376 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
1377 |
1378 | js-tokens@^3.0.0, js-tokens@^3.0.2:
1379 | version "3.0.2"
1380 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
1381 |
1382 | jsbn@~0.1.0:
1383 | version "0.1.1"
1384 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
1385 |
1386 | jsesc@^1.3.0:
1387 | version "1.3.0"
1388 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
1389 |
1390 | json-loader@^0.5.4:
1391 | version "0.5.7"
1392 | resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
1393 |
1394 | json-schema-traverse@^0.3.0:
1395 | version "0.3.1"
1396 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
1397 |
1398 | json-schema@0.2.3:
1399 | version "0.2.3"
1400 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
1401 |
1402 | json-stable-stringify@^1.0.1:
1403 | version "1.0.1"
1404 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
1405 | dependencies:
1406 | jsonify "~0.0.0"
1407 |
1408 | json-stringify-safe@~5.0.1:
1409 | version "5.0.1"
1410 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
1411 |
1412 | json5@^0.5.0, json5@^0.5.1:
1413 | version "0.5.1"
1414 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
1415 |
1416 | jsonify@~0.0.0:
1417 | version "0.0.0"
1418 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
1419 |
1420 | jsprim@^1.2.2:
1421 | version "1.4.1"
1422 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
1423 | dependencies:
1424 | assert-plus "1.0.0"
1425 | extsprintf "1.3.0"
1426 | json-schema "0.2.3"
1427 | verror "1.10.0"
1428 |
1429 | kind-of@^3.0.2:
1430 | version "3.2.2"
1431 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
1432 | dependencies:
1433 | is-buffer "^1.1.5"
1434 |
1435 | kind-of@^4.0.0:
1436 | version "4.0.0"
1437 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
1438 | dependencies:
1439 | is-buffer "^1.1.5"
1440 |
1441 | lazy-cache@^1.0.3:
1442 | version "1.0.4"
1443 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
1444 |
1445 | lcid@^1.0.0:
1446 | version "1.0.0"
1447 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
1448 | dependencies:
1449 | invert-kv "^1.0.0"
1450 |
1451 | load-json-file@^2.0.0:
1452 | version "2.0.0"
1453 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
1454 | dependencies:
1455 | graceful-fs "^4.1.2"
1456 | parse-json "^2.2.0"
1457 | pify "^2.0.0"
1458 | strip-bom "^3.0.0"
1459 |
1460 | loader-runner@^2.3.0:
1461 | version "2.3.0"
1462 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
1463 |
1464 | loader-utils@^1.0.2, loader-utils@^1.1.0:
1465 | version "1.1.0"
1466 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
1467 | dependencies:
1468 | big.js "^3.1.3"
1469 | emojis-list "^2.0.0"
1470 | json5 "^0.5.0"
1471 |
1472 | locate-path@^2.0.0:
1473 | version "2.0.0"
1474 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
1475 | dependencies:
1476 | p-locate "^2.0.0"
1477 | path-exists "^3.0.0"
1478 |
1479 | lodash@^4.14.0, lodash@^4.17.4:
1480 | version "4.17.4"
1481 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
1482 |
1483 | longest@^1.0.1:
1484 | version "1.0.1"
1485 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
1486 |
1487 | loose-envify@^1.0.0:
1488 | version "1.3.1"
1489 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
1490 | dependencies:
1491 | js-tokens "^3.0.0"
1492 |
1493 | lru-cache@^4.0.1:
1494 | version "4.1.1"
1495 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
1496 | dependencies:
1497 | pseudomap "^1.0.2"
1498 | yallist "^2.1.2"
1499 |
1500 | make-dir@^1.0.0:
1501 | version "1.1.0"
1502 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51"
1503 | dependencies:
1504 | pify "^3.0.0"
1505 |
1506 | md5.js@^1.3.4:
1507 | version "1.3.4"
1508 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
1509 | dependencies:
1510 | hash-base "^3.0.0"
1511 | inherits "^2.0.1"
1512 |
1513 | mem@^1.1.0:
1514 | version "1.1.0"
1515 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
1516 | dependencies:
1517 | mimic-fn "^1.0.0"
1518 |
1519 | memory-fs@^0.4.0, memory-fs@~0.4.1:
1520 | version "0.4.1"
1521 | resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
1522 | dependencies:
1523 | errno "^0.1.3"
1524 | readable-stream "^2.0.1"
1525 |
1526 | micromatch@^2.1.5:
1527 | version "2.3.11"
1528 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
1529 | dependencies:
1530 | arr-diff "^2.0.0"
1531 | array-unique "^0.2.1"
1532 | braces "^1.8.2"
1533 | expand-brackets "^0.1.4"
1534 | extglob "^0.3.1"
1535 | filename-regex "^2.0.0"
1536 | is-extglob "^1.0.0"
1537 | is-glob "^2.0.1"
1538 | kind-of "^3.0.2"
1539 | normalize-path "^2.0.1"
1540 | object.omit "^2.0.0"
1541 | parse-glob "^3.0.4"
1542 | regex-cache "^0.4.2"
1543 |
1544 | miller-rabin@^4.0.0:
1545 | version "4.0.1"
1546 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
1547 | dependencies:
1548 | bn.js "^4.0.0"
1549 | brorand "^1.0.1"
1550 |
1551 | mime-db@~1.30.0:
1552 | version "1.30.0"
1553 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
1554 |
1555 | mime-types@^2.1.12, mime-types@~2.1.7:
1556 | version "2.1.17"
1557 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
1558 | dependencies:
1559 | mime-db "~1.30.0"
1560 |
1561 | mimic-fn@^1.0.0:
1562 | version "1.1.0"
1563 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
1564 |
1565 | minimalistic-assert@^1.0.0:
1566 | version "1.0.0"
1567 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
1568 |
1569 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
1570 | version "1.0.1"
1571 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
1572 |
1573 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
1574 | version "3.0.4"
1575 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
1576 | dependencies:
1577 | brace-expansion "^1.1.7"
1578 |
1579 | minimist@0.0.8:
1580 | version "0.0.8"
1581 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
1582 |
1583 | minimist@^1.2.0:
1584 | version "1.2.0"
1585 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1586 |
1587 | "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0:
1588 | version "0.5.1"
1589 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
1590 | dependencies:
1591 | minimist "0.0.8"
1592 |
1593 | ms@2.0.0:
1594 | version "2.0.0"
1595 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
1596 |
1597 | nan@^2.3.0:
1598 | version "2.8.0"
1599 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
1600 |
1601 | node-libs-browser@^2.0.0:
1602 | version "2.1.0"
1603 | resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
1604 | dependencies:
1605 | assert "^1.1.1"
1606 | browserify-zlib "^0.2.0"
1607 | buffer "^4.3.0"
1608 | console-browserify "^1.1.0"
1609 | constants-browserify "^1.0.0"
1610 | crypto-browserify "^3.11.0"
1611 | domain-browser "^1.1.1"
1612 | events "^1.0.0"
1613 | https-browserify "^1.0.0"
1614 | os-browserify "^0.3.0"
1615 | path-browserify "0.0.0"
1616 | process "^0.11.10"
1617 | punycode "^1.2.4"
1618 | querystring-es3 "^0.2.0"
1619 | readable-stream "^2.3.3"
1620 | stream-browserify "^2.0.1"
1621 | stream-http "^2.7.2"
1622 | string_decoder "^1.0.0"
1623 | timers-browserify "^2.0.4"
1624 | tty-browserify "0.0.0"
1625 | url "^0.11.0"
1626 | util "^0.10.3"
1627 | vm-browserify "0.0.4"
1628 |
1629 | node-pre-gyp@^0.6.39:
1630 | version "0.6.39"
1631 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
1632 | dependencies:
1633 | detect-libc "^1.0.2"
1634 | hawk "3.1.3"
1635 | mkdirp "^0.5.1"
1636 | nopt "^4.0.1"
1637 | npmlog "^4.0.2"
1638 | rc "^1.1.7"
1639 | request "2.81.0"
1640 | rimraf "^2.6.1"
1641 | semver "^5.3.0"
1642 | tar "^2.2.1"
1643 | tar-pack "^3.4.0"
1644 |
1645 | nopt@^4.0.1:
1646 | version "4.0.1"
1647 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
1648 | dependencies:
1649 | abbrev "1"
1650 | osenv "^0.1.4"
1651 |
1652 | normalize-package-data@^2.3.2:
1653 | version "2.4.0"
1654 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
1655 | dependencies:
1656 | hosted-git-info "^2.1.4"
1657 | is-builtin-module "^1.0.0"
1658 | semver "2 || 3 || 4 || 5"
1659 | validate-npm-package-license "^3.0.1"
1660 |
1661 | normalize-path@^2.0.0, normalize-path@^2.0.1:
1662 | version "2.1.1"
1663 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
1664 | dependencies:
1665 | remove-trailing-separator "^1.0.1"
1666 |
1667 | npm-run-path@^2.0.0:
1668 | version "2.0.2"
1669 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
1670 | dependencies:
1671 | path-key "^2.0.0"
1672 |
1673 | npmlog@^4.0.2:
1674 | version "4.1.2"
1675 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
1676 | dependencies:
1677 | are-we-there-yet "~1.1.2"
1678 | console-control-strings "~1.1.0"
1679 | gauge "~2.7.3"
1680 | set-blocking "~2.0.0"
1681 |
1682 | number-is-nan@^1.0.0:
1683 | version "1.0.1"
1684 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
1685 |
1686 | oauth-sign@~0.8.1:
1687 | version "0.8.2"
1688 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
1689 |
1690 | object-assign@^4.0.1, object-assign@^4.1.0:
1691 | version "4.1.1"
1692 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1693 |
1694 | object.omit@^2.0.0:
1695 | version "2.0.1"
1696 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
1697 | dependencies:
1698 | for-own "^0.1.4"
1699 | is-extendable "^0.1.1"
1700 |
1701 | once@^1.3.0, once@^1.3.3:
1702 | version "1.4.0"
1703 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1704 | dependencies:
1705 | wrappy "1"
1706 |
1707 | os-browserify@^0.3.0:
1708 | version "0.3.0"
1709 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
1710 |
1711 | os-homedir@^1.0.0:
1712 | version "1.0.2"
1713 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
1714 |
1715 | os-locale@^2.0.0:
1716 | version "2.1.0"
1717 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
1718 | dependencies:
1719 | execa "^0.7.0"
1720 | lcid "^1.0.0"
1721 | mem "^1.1.0"
1722 |
1723 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
1724 | version "1.0.2"
1725 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
1726 |
1727 | osenv@^0.1.4:
1728 | version "0.1.4"
1729 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
1730 | dependencies:
1731 | os-homedir "^1.0.0"
1732 | os-tmpdir "^1.0.0"
1733 |
1734 | p-finally@^1.0.0:
1735 | version "1.0.0"
1736 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
1737 |
1738 | p-limit@^1.1.0:
1739 | version "1.1.0"
1740 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
1741 |
1742 | p-locate@^2.0.0:
1743 | version "2.0.0"
1744 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
1745 | dependencies:
1746 | p-limit "^1.1.0"
1747 |
1748 | pako@~1.0.5:
1749 | version "1.0.6"
1750 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
1751 |
1752 | parse-asn1@^5.0.0:
1753 | version "5.1.0"
1754 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
1755 | dependencies:
1756 | asn1.js "^4.0.0"
1757 | browserify-aes "^1.0.0"
1758 | create-hash "^1.1.0"
1759 | evp_bytestokey "^1.0.0"
1760 | pbkdf2 "^3.0.3"
1761 |
1762 | parse-glob@^3.0.4:
1763 | version "3.0.4"
1764 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
1765 | dependencies:
1766 | glob-base "^0.3.0"
1767 | is-dotfile "^1.0.0"
1768 | is-extglob "^1.0.0"
1769 | is-glob "^2.0.0"
1770 |
1771 | parse-json@^2.2.0:
1772 | version "2.2.0"
1773 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
1774 | dependencies:
1775 | error-ex "^1.2.0"
1776 |
1777 | path-browserify@0.0.0:
1778 | version "0.0.0"
1779 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
1780 |
1781 | path-exists@^3.0.0:
1782 | version "3.0.0"
1783 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
1784 |
1785 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
1786 | version "1.0.1"
1787 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1788 |
1789 | path-key@^2.0.0:
1790 | version "2.0.1"
1791 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
1792 |
1793 | path-type@^2.0.0:
1794 | version "2.0.0"
1795 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
1796 | dependencies:
1797 | pify "^2.0.0"
1798 |
1799 | pbkdf2@^3.0.3:
1800 | version "3.0.14"
1801 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
1802 | dependencies:
1803 | create-hash "^1.1.2"
1804 | create-hmac "^1.1.4"
1805 | ripemd160 "^2.0.1"
1806 | safe-buffer "^5.0.1"
1807 | sha.js "^2.4.8"
1808 |
1809 | performance-now@^0.2.0:
1810 | version "0.2.0"
1811 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
1812 |
1813 | pify@^2.0.0:
1814 | version "2.3.0"
1815 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
1816 |
1817 | pify@^3.0.0:
1818 | version "3.0.0"
1819 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
1820 |
1821 | pkg-dir@^2.0.0:
1822 | version "2.0.0"
1823 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
1824 | dependencies:
1825 | find-up "^2.1.0"
1826 |
1827 | preserve@^0.2.0:
1828 | version "0.2.0"
1829 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
1830 |
1831 | private@^0.1.7:
1832 | version "0.1.8"
1833 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
1834 |
1835 | process-nextick-args@~1.0.6:
1836 | version "1.0.7"
1837 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
1838 |
1839 | process@^0.11.10:
1840 | version "0.11.10"
1841 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
1842 |
1843 | prr@~1.0.1:
1844 | version "1.0.1"
1845 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
1846 |
1847 | pseudomap@^1.0.2:
1848 | version "1.0.2"
1849 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
1850 |
1851 | public-encrypt@^4.0.0:
1852 | version "4.0.0"
1853 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
1854 | dependencies:
1855 | bn.js "^4.1.0"
1856 | browserify-rsa "^4.0.0"
1857 | create-hash "^1.1.0"
1858 | parse-asn1 "^5.0.0"
1859 | randombytes "^2.0.1"
1860 |
1861 | punycode@1.3.2:
1862 | version "1.3.2"
1863 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
1864 |
1865 | punycode@^1.2.4, punycode@^1.4.1:
1866 | version "1.4.1"
1867 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
1868 |
1869 | qs@~6.4.0:
1870 | version "6.4.0"
1871 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
1872 |
1873 | querystring-es3@^0.2.0:
1874 | version "0.2.1"
1875 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
1876 |
1877 | querystring@0.2.0:
1878 | version "0.2.0"
1879 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
1880 |
1881 | randomatic@^1.1.3:
1882 | version "1.1.7"
1883 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
1884 | dependencies:
1885 | is-number "^3.0.0"
1886 | kind-of "^4.0.0"
1887 |
1888 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
1889 | version "2.0.5"
1890 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79"
1891 | dependencies:
1892 | safe-buffer "^5.1.0"
1893 |
1894 | randomfill@^1.0.3:
1895 | version "1.0.3"
1896 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62"
1897 | dependencies:
1898 | randombytes "^2.0.5"
1899 | safe-buffer "^5.1.0"
1900 |
1901 | rc@^1.1.7:
1902 | version "1.2.2"
1903 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
1904 | dependencies:
1905 | deep-extend "~0.4.0"
1906 | ini "~1.3.0"
1907 | minimist "^1.2.0"
1908 | strip-json-comments "~2.0.1"
1909 |
1910 | read-pkg-up@^2.0.0:
1911 | version "2.0.0"
1912 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
1913 | dependencies:
1914 | find-up "^2.0.0"
1915 | read-pkg "^2.0.0"
1916 |
1917 | read-pkg@^2.0.0:
1918 | version "2.0.0"
1919 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
1920 | dependencies:
1921 | load-json-file "^2.0.0"
1922 | normalize-package-data "^2.3.2"
1923 | path-type "^2.0.0"
1924 |
1925 | readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.6, readable-stream@^2.3.3:
1926 | version "2.3.3"
1927 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
1928 | dependencies:
1929 | core-util-is "~1.0.0"
1930 | inherits "~2.0.3"
1931 | isarray "~1.0.0"
1932 | process-nextick-args "~1.0.6"
1933 | safe-buffer "~5.1.1"
1934 | string_decoder "~1.0.3"
1935 | util-deprecate "~1.0.1"
1936 |
1937 | readdirp@^2.0.0:
1938 | version "2.1.0"
1939 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
1940 | dependencies:
1941 | graceful-fs "^4.1.2"
1942 | minimatch "^3.0.2"
1943 | readable-stream "^2.0.2"
1944 | set-immediate-shim "^1.0.1"
1945 |
1946 | regenerator-runtime@^0.11.0:
1947 | version "0.11.1"
1948 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
1949 |
1950 | regex-cache@^0.4.2:
1951 | version "0.4.4"
1952 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
1953 | dependencies:
1954 | is-equal-shallow "^0.1.3"
1955 |
1956 | remove-trailing-separator@^1.0.1:
1957 | version "1.1.0"
1958 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
1959 |
1960 | repeat-element@^1.1.2:
1961 | version "1.1.2"
1962 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
1963 |
1964 | repeat-string@^1.5.2:
1965 | version "1.6.1"
1966 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
1967 |
1968 | repeating@^2.0.0:
1969 | version "2.0.1"
1970 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
1971 | dependencies:
1972 | is-finite "^1.0.0"
1973 |
1974 | request@2.81.0:
1975 | version "2.81.0"
1976 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
1977 | dependencies:
1978 | aws-sign2 "~0.6.0"
1979 | aws4 "^1.2.1"
1980 | caseless "~0.12.0"
1981 | combined-stream "~1.0.5"
1982 | extend "~3.0.0"
1983 | forever-agent "~0.6.1"
1984 | form-data "~2.1.1"
1985 | har-validator "~4.2.1"
1986 | hawk "~3.1.3"
1987 | http-signature "~1.1.0"
1988 | is-typedarray "~1.0.0"
1989 | isstream "~0.1.2"
1990 | json-stringify-safe "~5.0.1"
1991 | mime-types "~2.1.7"
1992 | oauth-sign "~0.8.1"
1993 | performance-now "^0.2.0"
1994 | qs "~6.4.0"
1995 | safe-buffer "^5.0.1"
1996 | stringstream "~0.0.4"
1997 | tough-cookie "~2.3.0"
1998 | tunnel-agent "^0.6.0"
1999 | uuid "^3.0.0"
2000 |
2001 | require-directory@^2.1.1:
2002 | version "2.1.1"
2003 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
2004 |
2005 | require-main-filename@^1.0.1:
2006 | version "1.0.1"
2007 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
2008 |
2009 | right-align@^0.1.1:
2010 | version "0.1.3"
2011 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
2012 | dependencies:
2013 | align-text "^0.1.1"
2014 |
2015 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
2016 | version "2.6.2"
2017 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
2018 | dependencies:
2019 | glob "^7.0.5"
2020 |
2021 | ripemd160@^2.0.0, ripemd160@^2.0.1:
2022 | version "2.0.1"
2023 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
2024 | dependencies:
2025 | hash-base "^2.0.0"
2026 | inherits "^2.0.1"
2027 |
2028 | 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:
2029 | version "5.1.1"
2030 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
2031 |
2032 | "semver@2 || 3 || 4 || 5", semver@^5.3.0:
2033 | version "5.4.1"
2034 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
2035 |
2036 | set-blocking@^2.0.0, set-blocking@~2.0.0:
2037 | version "2.0.0"
2038 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
2039 |
2040 | set-immediate-shim@^1.0.1:
2041 | version "1.0.1"
2042 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
2043 |
2044 | setimmediate@^1.0.4:
2045 | version "1.0.5"
2046 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
2047 |
2048 | sha.js@^2.4.0, sha.js@^2.4.8:
2049 | version "2.4.9"
2050 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d"
2051 | dependencies:
2052 | inherits "^2.0.1"
2053 | safe-buffer "^5.0.1"
2054 |
2055 | shebang-command@^1.2.0:
2056 | version "1.2.0"
2057 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
2058 | dependencies:
2059 | shebang-regex "^1.0.0"
2060 |
2061 | shebang-regex@^1.0.0:
2062 | version "1.0.0"
2063 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
2064 |
2065 | signal-exit@^3.0.0:
2066 | version "3.0.2"
2067 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
2068 |
2069 | slash@^1.0.0:
2070 | version "1.0.0"
2071 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
2072 |
2073 | sntp@1.x.x:
2074 | version "1.0.9"
2075 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
2076 | dependencies:
2077 | hoek "2.x.x"
2078 |
2079 | source-list-map@^2.0.0:
2080 | version "2.0.0"
2081 | resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
2082 |
2083 | source-map-support@^0.4.15:
2084 | version "0.4.18"
2085 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
2086 | dependencies:
2087 | source-map "^0.5.6"
2088 |
2089 | source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
2090 | version "0.5.7"
2091 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
2092 |
2093 | source-map@~0.6.1:
2094 | version "0.6.1"
2095 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
2096 |
2097 | spdx-correct@~1.0.0:
2098 | version "1.0.2"
2099 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
2100 | dependencies:
2101 | spdx-license-ids "^1.0.2"
2102 |
2103 | spdx-expression-parse@~1.0.0:
2104 | version "1.0.4"
2105 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
2106 |
2107 | spdx-license-ids@^1.0.2:
2108 | version "1.2.2"
2109 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
2110 |
2111 | sshpk@^1.7.0:
2112 | version "1.13.1"
2113 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
2114 | dependencies:
2115 | asn1 "~0.2.3"
2116 | assert-plus "^1.0.0"
2117 | dashdash "^1.12.0"
2118 | getpass "^0.1.1"
2119 | optionalDependencies:
2120 | bcrypt-pbkdf "^1.0.0"
2121 | ecc-jsbn "~0.1.1"
2122 | jsbn "~0.1.0"
2123 | tweetnacl "~0.14.0"
2124 |
2125 | stream-browserify@^2.0.1:
2126 | version "2.0.1"
2127 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
2128 | dependencies:
2129 | inherits "~2.0.1"
2130 | readable-stream "^2.0.2"
2131 |
2132 | stream-http@^2.7.2:
2133 | version "2.7.2"
2134 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad"
2135 | dependencies:
2136 | builtin-status-codes "^3.0.0"
2137 | inherits "^2.0.1"
2138 | readable-stream "^2.2.6"
2139 | to-arraybuffer "^1.0.0"
2140 | xtend "^4.0.0"
2141 |
2142 | string-width@^1.0.1, string-width@^1.0.2:
2143 | version "1.0.2"
2144 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
2145 | dependencies:
2146 | code-point-at "^1.0.0"
2147 | is-fullwidth-code-point "^1.0.0"
2148 | strip-ansi "^3.0.0"
2149 |
2150 | string-width@^2.0.0:
2151 | version "2.1.1"
2152 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
2153 | dependencies:
2154 | is-fullwidth-code-point "^2.0.0"
2155 | strip-ansi "^4.0.0"
2156 |
2157 | string_decoder@^1.0.0, string_decoder@~1.0.3:
2158 | version "1.0.3"
2159 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
2160 | dependencies:
2161 | safe-buffer "~5.1.0"
2162 |
2163 | stringstream@~0.0.4:
2164 | version "0.0.5"
2165 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
2166 |
2167 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
2168 | version "3.0.1"
2169 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
2170 | dependencies:
2171 | ansi-regex "^2.0.0"
2172 |
2173 | strip-ansi@^4.0.0:
2174 | version "4.0.0"
2175 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
2176 | dependencies:
2177 | ansi-regex "^3.0.0"
2178 |
2179 | strip-bom@^3.0.0:
2180 | version "3.0.0"
2181 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
2182 |
2183 | strip-eof@^1.0.0:
2184 | version "1.0.0"
2185 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
2186 |
2187 | strip-json-comments@~2.0.1:
2188 | version "2.0.1"
2189 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
2190 |
2191 | supports-color@^2.0.0:
2192 | version "2.0.0"
2193 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
2194 |
2195 | supports-color@^4.2.1:
2196 | version "4.5.0"
2197 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
2198 | dependencies:
2199 | has-flag "^2.0.0"
2200 |
2201 | tapable@^0.2.7:
2202 | version "0.2.8"
2203 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
2204 |
2205 | tar-pack@^3.4.0:
2206 | version "3.4.1"
2207 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
2208 | dependencies:
2209 | debug "^2.2.0"
2210 | fstream "^1.0.10"
2211 | fstream-ignore "^1.0.5"
2212 | once "^1.3.3"
2213 | readable-stream "^2.1.4"
2214 | rimraf "^2.5.1"
2215 | tar "^2.2.1"
2216 | uid-number "^0.0.6"
2217 |
2218 | tar@^2.2.1:
2219 | version "2.2.1"
2220 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
2221 | dependencies:
2222 | block-stream "*"
2223 | fstream "^1.0.2"
2224 | inherits "2"
2225 |
2226 | timers-browserify@^2.0.4:
2227 | version "2.0.4"
2228 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
2229 | dependencies:
2230 | setimmediate "^1.0.4"
2231 |
2232 | to-arraybuffer@^1.0.0:
2233 | version "1.0.1"
2234 | resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
2235 |
2236 | to-fast-properties@^1.0.3:
2237 | version "1.0.3"
2238 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
2239 |
2240 | tough-cookie@~2.3.0:
2241 | version "2.3.3"
2242 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
2243 | dependencies:
2244 | punycode "^1.4.1"
2245 |
2246 | trim-right@^1.0.1:
2247 | version "1.0.1"
2248 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
2249 |
2250 | tty-browserify@0.0.0:
2251 | version "0.0.0"
2252 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
2253 |
2254 | tunnel-agent@^0.6.0:
2255 | version "0.6.0"
2256 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
2257 | dependencies:
2258 | safe-buffer "^5.0.1"
2259 |
2260 | tweetnacl@^0.14.3, tweetnacl@~0.14.0:
2261 | version "0.14.5"
2262 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
2263 |
2264 | uglify-js@^2.8.29:
2265 | version "2.8.29"
2266 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
2267 | dependencies:
2268 | source-map "~0.5.1"
2269 | yargs "~3.10.0"
2270 | optionalDependencies:
2271 | uglify-to-browserify "~1.0.0"
2272 |
2273 | uglify-to-browserify@~1.0.0:
2274 | version "1.0.2"
2275 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
2276 |
2277 | uglifyjs-webpack-plugin@^0.4.6:
2278 | version "0.4.6"
2279 | resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
2280 | dependencies:
2281 | source-map "^0.5.6"
2282 | uglify-js "^2.8.29"
2283 | webpack-sources "^1.0.1"
2284 |
2285 | uid-number@^0.0.6:
2286 | version "0.0.6"
2287 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
2288 |
2289 | url@^0.11.0:
2290 | version "0.11.0"
2291 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
2292 | dependencies:
2293 | punycode "1.3.2"
2294 | querystring "0.2.0"
2295 |
2296 | util-deprecate@~1.0.1:
2297 | version "1.0.2"
2298 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
2299 |
2300 | util@0.10.3, util@^0.10.3:
2301 | version "0.10.3"
2302 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
2303 | dependencies:
2304 | inherits "2.0.1"
2305 |
2306 | uuid@^3.0.0:
2307 | version "3.1.0"
2308 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
2309 |
2310 | validate-npm-package-license@^3.0.1:
2311 | version "3.0.1"
2312 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
2313 | dependencies:
2314 | spdx-correct "~1.0.0"
2315 | spdx-expression-parse "~1.0.0"
2316 |
2317 | verror@1.10.0:
2318 | version "1.10.0"
2319 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
2320 | dependencies:
2321 | assert-plus "^1.0.0"
2322 | core-util-is "1.0.2"
2323 | extsprintf "^1.2.0"
2324 |
2325 | vm-browserify@0.0.4:
2326 | version "0.0.4"
2327 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
2328 | dependencies:
2329 | indexof "0.0.1"
2330 |
2331 | watchpack@^1.4.0:
2332 | version "1.4.0"
2333 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
2334 | dependencies:
2335 | async "^2.1.2"
2336 | chokidar "^1.7.0"
2337 | graceful-fs "^4.1.2"
2338 |
2339 | webpack-sources@^1.0.1:
2340 | version "1.1.0"
2341 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
2342 | dependencies:
2343 | source-list-map "^2.0.0"
2344 | source-map "~0.6.1"
2345 |
2346 | webpack@^3.10.0:
2347 | version "3.10.0"
2348 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725"
2349 | dependencies:
2350 | acorn "^5.0.0"
2351 | acorn-dynamic-import "^2.0.0"
2352 | ajv "^5.1.5"
2353 | ajv-keywords "^2.0.0"
2354 | async "^2.1.2"
2355 | enhanced-resolve "^3.4.0"
2356 | escope "^3.6.0"
2357 | interpret "^1.0.0"
2358 | json-loader "^0.5.4"
2359 | json5 "^0.5.1"
2360 | loader-runner "^2.3.0"
2361 | loader-utils "^1.1.0"
2362 | memory-fs "~0.4.1"
2363 | mkdirp "~0.5.0"
2364 | node-libs-browser "^2.0.0"
2365 | source-map "^0.5.3"
2366 | supports-color "^4.2.1"
2367 | tapable "^0.2.7"
2368 | uglifyjs-webpack-plugin "^0.4.6"
2369 | watchpack "^1.4.0"
2370 | webpack-sources "^1.0.1"
2371 | yargs "^8.0.2"
2372 |
2373 | which-module@^2.0.0:
2374 | version "2.0.0"
2375 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
2376 |
2377 | which@^1.2.9:
2378 | version "1.3.0"
2379 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
2380 | dependencies:
2381 | isexe "^2.0.0"
2382 |
2383 | wide-align@^1.1.0:
2384 | version "1.1.2"
2385 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
2386 | dependencies:
2387 | string-width "^1.0.2"
2388 |
2389 | window-size@0.1.0:
2390 | version "0.1.0"
2391 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
2392 |
2393 | wordwrap@0.0.2:
2394 | version "0.0.2"
2395 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
2396 |
2397 | wrap-ansi@^2.0.0:
2398 | version "2.1.0"
2399 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
2400 | dependencies:
2401 | string-width "^1.0.1"
2402 | strip-ansi "^3.0.1"
2403 |
2404 | wrappy@1:
2405 | version "1.0.2"
2406 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
2407 |
2408 | xtend@^4.0.0:
2409 | version "4.0.1"
2410 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
2411 |
2412 | y18n@^3.2.1:
2413 | version "3.2.1"
2414 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
2415 |
2416 | yallist@^2.1.2:
2417 | version "2.1.2"
2418 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
2419 |
2420 | yargs-parser@^7.0.0:
2421 | version "7.0.0"
2422 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
2423 | dependencies:
2424 | camelcase "^4.1.0"
2425 |
2426 | yargs@^8.0.2:
2427 | version "8.0.2"
2428 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
2429 | dependencies:
2430 | camelcase "^4.1.0"
2431 | cliui "^3.2.0"
2432 | decamelize "^1.1.1"
2433 | get-caller-file "^1.0.1"
2434 | os-locale "^2.0.0"
2435 | read-pkg-up "^2.0.0"
2436 | require-directory "^2.1.1"
2437 | require-main-filename "^1.0.1"
2438 | set-blocking "^2.0.0"
2439 | string-width "^2.0.0"
2440 | which-module "^2.0.0"
2441 | y18n "^3.2.1"
2442 | yargs-parser "^7.0.0"
2443 |
2444 | yargs@~3.10.0:
2445 | version "3.10.0"
2446 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
2447 | dependencies:
2448 | camelcase "^1.0.2"
2449 | cliui "^2.1.0"
2450 | decamelize "^1.0.0"
2451 | window-size "0.1.0"
2452 |
--------------------------------------------------------------------------------